#oop
노트 32개
Frontend › JavaScript
객체 지향 프로그래밍과 JavaScriptgoto → 절차적 프로그래밍 → 구조체 → 클래스로 이어지는 흐름에서 객체 지향이 왜 나왔는지, 캡슐화·상속·추상화·다형성이 무엇을 풀었는지 정리하고, 클래스 없이 프로토타입과 일급 함수로 OOP를 흉내 낸 JavaScript에서는 객체 지향과 함수형의 균형을 잡는 것이 핵심이라는 결론을 다룬다.
Frontend › JavaScript
속성 설명자(Property Descriptor)객체의 모든 속성에는 값 말고도 writable·enumerable·configurable 같은 숨은 설정이 붙어 있다. 데이터 속성과 접근자(getter·setter) 속성의 차이, Object.defineProperty의 기본값이 리터럴과 정반대라는 점, enumerable이 for...in·Object.keys·spread·JSON에 미치는 영향, Object.create의 두 번째 인자, preventExtensions·seal·freeze의 차이를 정리한다.
Frontend › JavaScript
프로토타입과 상속JavaScript 객체는 프로토타입 객체에 연결되어, 자기에게 없는 속성을 그 체인을 따라 찾는다. 클래스와 다른 철학적 뿌리(분류 대 가족 유사성·원형), 생성자 함수와 new가 하는 일, F.prototype과 constructor, 인스턴스 속성과 프로토타입 메서드의 구분, 프로토타입 체인과 섀도잉, 읽기만 체인을 타는 규칙, 내장 객체의 프로토타입, Object.create와 getPrototypeOf, __proto__의 역사와 프로토타입 오염, instanceof와 타입 확인, class 문법이 프로토타입 코드로 어떻게 풀리는지, 내장 프로토타입을 고치면 안 되는 이유와 폴리필을 정리했다.
Frontend › JavaScript
class 문법ES6 class로 객체의 틀을 정의하는 방법: 선언과 표현식(익명 클래스, TDZ), constructor, 계산된 메서드 이름, 인스턴스·정적 멤버, 클래스 필드와 #private 필드·메서드, _ 관례로 흉내 내는 protected, 정적 초기화 블록, new this를 쓰는 정적 팩토리 메서드, extends와 super(파생 constructor가 super()를 먼저 불러야 하는 이유, 필드 오버라이딩의 함정, HomeObject), 내장 클래스 확장과 Symbol.species, getter·setter, 프론트엔드에서 클래스를 꺼낼 때(관련 함수·데이터 묶기, 값 객체). class가 단순한 문법적 설탕이 아닌 지점(strict mode, new 강제, 열거 불가 메서드)까지.
Frontend › JavaScript
JavaScript 디자인 패턴: 생성 패턴객체를 만드는 방식을 다루는 생성 패턴 중 생성자·모듈·싱글톤·프로토타입 패턴을 JavaScript 코드로 정리하고, 프로토타입 기반 언어라서 달라지는 점을 짚는다. 단일 상속을 보완해 여러 클래스에 동작을 섞어 넣는 믹스인(Object.assign 방식, 클래스 팩토리 방식, 이벤트 믹스인)과 관찰자 패턴을 독립 클래스로 만든 이벤트 이미터 구현도 함께 다룬다.
Frontend › JavaScript
Proxy와 Reflect객체에 가해지는 읽기·쓰기·in·delete·호출·new 같은 기본 동작을 트랩으로 가로채는 Proxy와, 그 동작을 원래 객체에 그대로 넘기는 Reflect. 기본값·검증·가상 속성·함수 래퍼 같은 쓰임, getter 상속에서 receiver가 필요한 이유, 내부 슬롯·private 필드·동일성 비교에서 생기는 한계, Vue·Immer 같은 라이브러리가 Proxy를 쓰는 방식을 정리한다.
Backend › Architecture
도메인 주도 설계(DDD)비즈니스 도메인을 모델로 표현하고 그 모델이 코드·DB·API 설계를 이끌게 하는 방법론이다. 유비쿼터스 언어와 바운디드 컨텍스트로 모델의 경계를 잡고, 엔티티·값 객체·애그리거트로 모델을 짜며, 리포지토리·팩토리·도메인 서비스·도메인 이벤트로 다룬다.
Backend › NestJS
NestJS Module과 Provider: 의존성 주입과 캡슐화@Injectable 클래스를 모듈의 providers에 등록하면 Nest가 인스턴스를 만들어 생성자에 주입한다(DI). 모듈은 관련 컨트롤러·프로바이더를 묶고 export한 것만 밖에 공개하는 구성 단위다.
Computer Science › C Programming
C 사용자 정의 타입과 함수 포인터: 구조체, 공용체, 열거형, typedefC의 사용자 정의 타입(구조체, 공용체, 열거형, typedef)과 함수 포인터를 정리한다. 구조체의 메모리 배치와 패딩, 멤버가 한 메모리를 공유하는 공용체와 태그 공용체·타입 퍼닝, int 상수일 뿐인 열거형, 새 타입이 아니라 별명인 typedef, 함수 포인터와 콜백, 그리고 이들을 조합해 캡슐화·다형성·제네릭 컨테이너를 흉내 내는 불투명 포인터와 가상 함수 테이블 패턴.
Computer Science
프로그래밍 언어와 객체 지향 설계언어 일반(계보·패러다임·실행 방식·의미론·타입 시스템), C++의 문법·템플릿·STL·예외·가상 함수·스마트 포인터·메모리 풀, Java·Kotlin·Python·Go의 언어 동작과 관용구, 추상 클래스·인터페이스·위임·DTO/VO·클린 코드·GoF 패턴·책임 주도 설계와 객체 지향 설계 사례 모음.
Computer Science › Programming Languages
객체 지향 설계 면접: 풀이 순서와 반복되는 설계 부품주차장·도서관 같은 시스템을 클래스와 관계로 설계하는 객체 지향 설계(OOD) 면접의 풀이 순서(요구 사항 → 유스케이스 → 클래스 → 활동·시퀀스 → 코드 골격 → 동시성), 17개 사례에 되풀이해 나오는 설계 부품(계정과 사람 분리, 정의와 인스턴스 분리, 상태 enum, Search 인터페이스와 색인, 알림·결제·로그·청구서), 사례별 디자인 패턴 지도와 SOLID, 피해야 할 설계, 자주 받는 질문과 공부 순서를 정리한다.
Computer Science › Programming Languages
객체 지향 설계 사례: 예약·대여 시스템객체 지향 설계 면접의 예약·대여 계열 여섯 사례(도서관, 영화 예매, 항공, 호텔, 식당, 렌터카)를 요구 사항, 액터, 핵심 클래스와 enum, 핵심 흐름으로 정리한다. 검색 → 예약 → 결제 → 알림 → 취소·환불의 공통 골격, 대출 한도 5권·10일과 연체료, 회차별 좌석(ShowSeat·FlightSeat)과 SERIALIZABLE 트랜잭션, 24시간 전 취소 전액 환불, 좌석별 식사 주문, 반납 지점이 다른 렌터카와 부가 서비스 같은 사례별 차이를 다룬다.
Computer Science › Programming Languages
객체 지향 설계 사례: 주차장·ATM과 카드·보드 게임객체 지향 설계 면접의 시설·장치와 게임 계열 네 사례(다층 주차장, ATM, 블랙잭과 카드 덱, 체스)를 요구 사항, 액터, 핵심 클래스와 enum, 핵심 흐름으로 정리한다. 차종별 주차 자리 배정 규칙과 싱글턴·락으로 지키는 티켓 발급, 시간대별 요금, ATM의 하드웨어 부품 클래스와 거래 커맨드 계층·잔액 조회 시퀀스, 블랙잭의 소프트·하드 합계와 보험·스플릿·더블 규칙, 체스 말별 이동 규칙과 자기 킹을 노출하는 수를 막는 검증을 다룬다.
Computer Science › Programming Languages
객체 지향 설계 사례: 커머스·커뮤니티·플랫폼객체 지향 설계 면접의 플랫폼 계열 일곱 사례(아마존 쇼핑몰, Stack Overflow, 온라인 증권, LinkedIn, Facebook, Cricinfo, Uber)를 요구 사항, 액터, 핵심 클래스와 enum, 흐름으로 정리한다. 장바구니·주문·배송 로그와 결제 시퀀스, 평판·현상금·태그와 질문 종료 사유, 시장가·지정가·스톱 주문과 부분 체결·주식 묶음·주문 유효 기간, 프로필·연결 요청·검색 색인과 2단계 BFS 친구 추천, 경기 → 이닝 → 오버 → 공 계층, 기사 매칭과 거리·시간 요금 계산을 다룬다.
Computer Science › Programming Languages
객체 지향의 본질: 메시징객체 지향이라는 말을 만든 앨런 케이의 관점에서 OOP의 본질을 메시징·캡슐화·늦은 바인딩 세 가지로 정리한다. 클래스와 상속은 C++·Java가 대중화한 구현 방식일 뿐 필수 조건이 아니며, 핵심은 상태를 숨긴 독립 개체들이 메시지로 협력하는 구조다.
Computer Science › Programming Languages
모던 Java 기능: 모듈, var, record, sealed, 패턴 매칭, switch 식Java 9 이후 LTS 버전에 들어온 언어 기능을 정리한다. LTS별 주요 기능 표, 모듈 시스템의 requires·exports·opens와 강한 캡슐화, var의 지역 타입 추론과 제약, 불변 데이터 운반 클래스 record, 상속을 닫는 sealed, instanceof·switch·레코드 패턴 매칭, 화살표 문법과 yield·완전성 검사를 갖춘 switch 식, 처음과 끝 접근을 통일한 Sequenced Collections.
Computer Science › Programming Languages
싱글턴 패턴인스턴스를 하나만 두는 싱글턴 패턴의 목적과 Java 구현 방식(이른 초기화, synchronized, DCL과 volatile, 홀더 클래스, enum)을 스레드 안전성과 비용으로 비교하고, C++의 함수 안 static(Meyers 싱글턴)과 복사 금지, 전역 상태가 되는 단점과 DI 컨테이너·모듈로 대신하는 방법을 정리한다.
Computer Science › Programming Languages
위임 패턴과 Kotlin by객체가 받은 요청을 다른 객체에 넘겨 처리하는 위임 패턴과, 이를 언어 문법으로 지원하는 Kotlin의 by 키워드를 정리한다. 클래스 위임은 인터페이스 구현을 통째로 다른 객체에 맡기고, 프로퍼티 위임은 getter/setter를 맡기며, by lazy와 by viewModels()가 그 대표적인 쓰임이다.
Computer Science › Programming Languages
책임 주도 설계: 협력·책임·메시지객체지향 설계는 좋은 객체가 아니라 좋은 협력을 설계하는 일이다. 메시지를 먼저 정하고 그 메시지를 처리할 책임을 가진 객체를 고른다. 객체가 받는 메시지의 집합이 인터페이스가 되고, 속성은 책임을 정한 뒤에 따라온다.
Computer Science › Programming Languages
추상 클래스와 인터페이스인스턴스를 만들 수 없는 추상 클래스와, 구현할 행동의 계약만 정하는 인터페이스를 Java 기준으로 비교한다. 추상 클래스는 상태와 공통 구현을 물려주는 'is-a' 관계, 인터페이스는 여러 개를 붙일 수 있는 'can-do' 역할이며, Java 8 이후 디폴트 메서드로 경계가 흐려졌어도 상태를 가질 수 있느냐가 결정적 차이다.
Computer Science › Programming Languages
클린 코드: 함수와 이름『클린 코드』의 함수와 이름 규칙을 정리한다. 나쁜 코드가 비싼 이유와 보이스카우트 규칙, 피해야 할 습관도 다룬다. 함수는 작게, 한 가지만, 한 추상화 수준으로 쓰고 위에서 아래로 이야기처럼 읽히게 배치한다. 값을 돌려주는 질의와 상태를 바꾸는 명령은 나눈다(명령-질의 분리). 타입 분기는 팩터리 한 곳에 가두고 나머지는 다형성에 맡기며, 이름은 의도를 드러내고 한 개념에 한 단어만 쓴다.
Computer Science › Programming Languages
프로그래밍 패러다임명령형·선언형·객체 지향·함수형·반응형·관점 지향·제네릭·동시성 프로그래밍이 각각 무엇을 중심에 두고 코드를 짜는지 비교한다. 패러다임을 레코드·클로저·동시성·이름 붙은 상태 같은 개념의 묶음으로 보는 관점, 관찰 가능한 비결정성과 상태 표현력이라는 두 축, 새 개념이 필요하다는 신호인 창조적 확장 원칙, goto를 없앤 구조적 프로그래밍, 명령형·함수형·객체 지향의 차이와 객체 지향의 네 기둥(추상화, 캡슐화, 상속, 다형성)과 추상화·캡슐화·정보 은닉의 구분, is-a·has-a 관계를 정리한다. 함수형의 순수 함수·부수 효과·참조 투명성과 순수 함수가 스레드 안전한 이유, 클래스와 객체 지향이 같은 말이 아닌 이유도 다룬다.
Computer Science › Programming Languages
C++ 기초: 문법, 참조자, 클래스, 복사와 이동, 오버로딩C++ 프로그램의 구조, 초기화 문법과 L·R-value, 입출력 스트림, 헤더와 네임스페이스, 저장 지정자(static·extern·mutable), switch의 fallthrough, 포인터와 참조자의 차이, 그리고 클래스의 접근 지정·friend·this·생성자 종류·초기화 리스트·static 멤버·소멸자와 RAII·private 생성자와 소멸자, 복사 생성자와 복사 대입·얕은 복사와 깊은 복사·이동·3·5·0의 규칙, 함수 오버로딩과 연산자 오버로딩, explicit 형 변환을 정리한다. 참조자는 null이 없는 별명이고, 자원은 소멸자에 묶으며, 인자 하나짜리 생성자에는 기본으로 explicit을 붙인다.
Computer Science › Programming Languages
C++ 상속과 가상 함수: 접근 지정, 생성·소멸 순서, vtable, 슬라이싱, 다중 상속C++ 상속의 다섯 가지 형태(단일·다중·다단계·계층·혼합), protected와 상속 방식(public·protected·private)이 접근 수준을 어떻게 바꾸는지, 기반에서 파생으로 생성되고 역순으로 소멸되는 순서, 가상 함수가 vtable과 vptr로 호출 대상을 고르는 원리와 비가상 함수의 이름 가림, 가상 생성자와 static 가상 함수가 없는 이유, 생성자·소멸자 안의 가상 호출과 pure virtual call, 가상 소멸자, 순수 가상 함수와 추상 클래스, 객체 슬라이싱, 다중 상속의 생성 순서와 다이아몬드 문제·가상 상속을 정리한다.
Computer Science › Programming Languages
C++ 템플릿타입을 매개변수로 받아 함수와 클래스를 찍어 내는 C++ 템플릿을 정리한다. 함수·클래스 템플릿, 기본 템플릿 인자와 비타입 인자, 특수화, 템플릿 재귀와 가변 인자 템플릿까지 다루며, 템플릿은 컴파일 시점에 타입별 코드를 생성하는 정적 다형성이라는 점이 핵심이다.
Computer Science › Programming Languages
DTO와 VO, DAO와 Repository이름이 비슷해 헷갈리는 네 가지 객체를 구분한다. DTO는 계층 사이로 데이터를 실어 나르는 로직 없는 상자, VO는 값으로만 같음을 따지는 불변 도메인 객체다. DAO는 테이블 중심으로 영속성을 추상화한 저수준 계층이고, Repository는 도메인 객체의 컬렉션처럼 보이게 만든 상위 수준 계층이다.
Computer Science › Programming Languages
GoF 디자인 패턴객체 지향 설계에서 반복되는 문제의 검증된 해법인 GoF 디자인 패턴을 생성·구조·행위 세 갈래로 나눠, 패턴마다 푸는 문제와 한 줄 비유로 정리한다. 패턴은 어휘이자 도구이며, 필요 없는 곳에 쓰면 오히려 복잡도를 늘린다.
Computer Science › Programming Languages
Java 실무 관용구: Enum, Optional, 예외와 자원, 날짜 API, 람다와 스트림, 비동기Java 코드를 안전하고 읽기 좋게 만드는 관용구를 주제별로 정리한다. 상수와 행위를 묶는 Enum, null을 API에서 몰아내는 방법과 Optional 규칙, checked 예외를 unchecked로 바꾸는 전략과 try-with-resources의 억제된 예외, Date·Calendar 대신 java.time, CompletableFuture 조합, 함수형 인터페이스·람다 캡처·메서드 참조 네 가지, 스트림의 지연 파이프라인과 병렬 스트림의 조건, 스트림과 반복문의 성능 차이를 다룬다.
Computer Science › Programming Languages
Java 언어 기본: 접근 제어자, static, 객체 비교, 제네릭, 리플렉션Java 면접에서 자주 묻는 언어 기본기를 주제별로 정리한다. Java의 특징과 개발 환경·첫 프로그램·배우는 순서, 접근 제어자와 패키지, final·finally·finalize, static과 static final(C·C++의 static과 컴파일 시 처리 포함), 오버로딩과 오버라이딩, 업·다운캐스팅, ==·equals·hashCode와 문자열 상수 풀, String 계열, Comparable과 Comparator, 값 전달, 컴포지션, 기본형과 래퍼 클래스·오토박싱, 제네릭과 타입 소거, 리플렉션·어노테이션·동적 프록시.
Computer Science › Programming Languages
Kotlin 핵심 문법: 널 안전성, 클래스 종류, 지연 초기화, 스코프 함수Kotlin이 Java와 다른 핵심 문법을 정리한다. 타입 시스템의 널 안전성, data·sealed·enum 클래스와 object·companion object, lateinit과 by lazy의 차이, let·run·with·apply·also 스코프 함수 고르는 법, 일급 함수와 고차 함수.
Computer Science › Programming Languages
Python 언어 기본: 객체와 가변성, 함수, 데코레이터, 클래스, 타입 힌트, importPython 문법이 실제로 어떻게 동작하는지 주제별로 정리한다. 이름과 객체, 가변·불변 타입과 is·==, 얕은 복사와 깊은 복사, *args·**kwargs와 인자 종류, 일급 함수와 LEGB 스코프·클로저·nonlocal, 람다의 제약, 데코레이터, 컴프리헨션과 제너레이터 식, 컨텍스트 매니저, 클래스 변수와 인스턴스 변수, 이름 맹글링, 매직 메서드, 프로퍼티와 디스크립터, 타입 힌트와 mypy, import 시스템과 __init__.py, Python 2와 3의 차이.
Computer Science › Programming Languages
Python 언어 동작: 제너레이터, MRO, 메모리 관리, 동시성, 성능Python의 런타임 동작을 정리한다. 이터러블·이터레이터·제너레이터의 관계와 지연 평가, 다중 상속의 MRO(C3 선형화)와 super(), CPython의 참조 카운팅·세대별 순환 수집과 메모리 누수 패턴, threading·multiprocessing·asyncio 비교와 이벤트 루프·TaskGroup, 측정에서 런타임 교체까지의 성능 최적화, CPython·PyPy(추적 JIT)·Jython(JVM, GIL 없음) 구현체 비교, 덕 타이핑과 Protocol.