목차5개 항목
언어의 문법은 금방 익히지만, 그 문법이 컴파일된 뒤 무엇이 되는지(템플릿 인스턴스화, vtable, 예외 테이블)를 알면 성능과 버그를 설명할 수 있다. 이 주제에는 언어 일반 이론, C++·Java·Kotlin·Python·Go의 언어 내부 동작과 관용구, 언어를 넘어 쓰이는 객체 지향 설계 개념과 설계 사례를 모았다. C 언어와 포인터는 C-Programming에 있다.
하위 노트
언어 일반
- 프로그래밍 언어의 계보와 선택: 언어의 세대 구분, Fortran·LISP부터 Rust·Go·Kotlin까지 이어진 문제의식, 언어별 에너지 효율
- 프로그래밍 패러다임: 명령형·선언형·객체 지향·함수형·반응형·관점 지향·제네릭·동시성 프로그래밍 비교
- 프로그램이 실행되기까지: 컴파일, 바이트코드, 인터프리터, GC: 네이티브 컴파일·VM과 JIT·인터프리터, 실행 파일 적재, Java·Python·Go의 GC, WebAssembly
- 프로그래밍 언어 의미론: 구문, 바인딩, 람다 계산, 평가 전략: 구문과 의미론, AST, 연산·표시·공리적 의미론, 스코프와 클로저, 알파·베타와 변수 포획, 값·이름·필요·참조·공유에 의한 호출, CPS, Hoare 논리, 위생적 매크로
- 타입 시스템: 검사, 추론, 다형성, 변성, 건전성: 정적·동적 검사, 단일화, 곱·합·재귀 타입과 Option·Result, 다형성 세 종류, 명목·구조·덕 타이핑, 변성, 완전성 검사, 진행과 보존
C++
- C++ 기초: 문법, 참조자, 클래스, 복사와 이동, 오버로딩: 초기화와 L/R-value, 스트림, 헤더와 네임스페이스, 저장 지정자, switch fallthrough, 참조자, 접근 지정·friend·this, 생성자 종류와 초기화 리스트, static 멤버, RAII, private 생성자·소멸자, 복사 생성자와 복사 대입·깊은 복사·이동·3·5·0의 규칙, 함수·연산자 오버로딩, explicit
- C++ 스마트 포인터: unique_ptr, shared_ptr, weak_ptr: 소유권을 타입으로 드러내는 RAII 래퍼, 제어 블록과 make_shared, weak_ptr로 순환 참조 끊기, auto_ptr 제거, 인자로 넘기는 규칙
- C++ 템플릿: 함수·클래스 템플릿, 기본·비타입 인자, 특수화, 템플릿 재귀와 가변 인자
- C++ STL 컨테이너와 시간 복잡도: vector의 분할 상환 O(1), deque·list, 레드-블랙 트리 기반 set·map과 해시 기반 unordered
- C++ 예외 처리의 내부 동작: 스택 되감기, 동적 등록과 zero-cost 테이블 방식, 예외 객체의 힙 할당
- C++ 상속과 가상 함수: 접근 지정, 생성·소멸 순서, vtable, 슬라이싱, 다중 상속: 상속의 다섯 형태, 상속 방식별 접근 수준, 생성·소멸 순서, 재정의와 이름 가림, vptr과 vtable, pure virtual call, 가상 소멸자, 슬라이싱, 다이아몬드와 가상 상속
- 메모리 풀: 고정·가변 메모리 풀, operator new/delete 오버로딩, std::pmr
- C++ 코딩 표준과 clang-format: 코딩 표준이 정하는 항목, 이름 규칙 예, clang-format으로 서식 자동화
객체 지향 설계
- 객체 지향의 본질: 메시징: 앨런 케이가 본 OOP의 본질(메시징·캡슐화·늦은 바인딩)과 클래스·상속이 본질이 아닌 이유
- 추상 클래스와 인터페이스: is-a와 can-do, 템플릿 메서드와 훅, Java 8 디폴트 메서드, 고르는 기준
- 위임 패턴과 Kotlin by: 상속 대신 위임, 클래스·프로퍼티 위임, by lazy와 by viewModels()
- DTO와 VO, DAO와 Repository: 전송 객체와 값 객체, 테이블 중심 DAO와 도메인 중심 Repository
- 클린 코드: 함수와 이름: 작은 함수와 추상화 수준, 팩터리로 분기 가두기, 의미 있는 이름
- 책임 주도 설계: 협력·책임·메시지: 메시지를 먼저 정하고 책임을 가진 객체 고르기, 인터페이스는 메시지 집합
- 싱글턴 패턴: 인스턴스를 하나로 제한하는 Java 구현 여섯 가지(DCL과 volatile, 홀더, enum), C++ Meyers 싱글턴, 전역 상태의 단점
- GoF 디자인 패턴: 생성·구조·행위 패턴이 푸는 문제와 비유, 과용의 비용
- 객체 지향 설계 면접: 풀이 순서와 반복되는 설계 부품: 요구 사항 → 유스케이스 → 클래스 → 활동·시퀀스 → 코드 골격 순서, 계정과 사람·정의와 인스턴스 분리·상태 enum·Search 색인 같은 공통 부품, 사례별 패턴 지도와 SOLID, 안티패턴
- 객체 지향 설계 사례: 예약·대여 시스템: 도서관(5권·10일·연체료), 영화 예매(회차 좌석과 SERIALIZABLE), 항공(운항 회차·여정), 호텔(24시간 전 환불), 식당(좌석별 주문), 렌터카(다른 지점 반납·부가 서비스)
- 객체 지향 설계 사례: 주차장·ATM과 카드·보드 게임: 차종별 주차 자리 배정과 티켓 발급 락, ATM 부품·거래 커맨드·잔액 조회 시퀀스, 블랙잭 점수와 보험·스플릿·더블, 체스 말별 이동과 수 검증
- 객체 지향 설계 사례: 커머스·커뮤니티·플랫폼: 쇼핑몰 주문·배송과 결제 시퀀스, Stack Overflow 평판·현상금, 증권 주문 종류·부분 체결·묶음, LinkedIn·Facebook 연결과 2단계 BFS 추천, Cricinfo 경기 계층, Uber 매칭과 요금
- 좋은 코드를 위한 열 가지 원칙: 규약·주석·견고함·SOLID·테스트 용이성·적당한 추상화, 원칙끼리 부딪칠 때의 판단
- 같은 문제, 열다섯 가지 설계: 상태와 결합을 다루는 법: 터틀 그래픽을 클래스·순수 함수·의존성 주입·상태 모나드·이벤트 소싱·인터프리터 등으로 구현하며 상태 소유와 결합 비교
Java·Kotlin·Python·Go
- Java 언어 기본: 접근 제어자, static, 객체 비교, 제네릭, 리플렉션: 접근 제어자와 패키지, final·finalize, static, 오버로딩·오버라이딩, equals·hashCode와 String 비교, call by value, 상속보다 컴포지션, 오토박싱, 제네릭 타입 소거, 리플렉션·어노테이션·동적 프록시, 컬렉션 프레임워크
- 모던 Java 기능: 모듈, var, record, sealed, 패턴 매칭, switch 식: LTS별 기능 표, 모듈 시스템, var 제약, record·sealed, 패턴 매칭, switch 식, Sequenced Collections
- Java 실무 관용구: Enum, Optional, 예외와 자원, 날짜 API, 람다와 스트림, 비동기: Enum에 행위 묶기, Optional 규칙, unchecked 예외 전환, java.time, CompletableFuture
- Java 동시성: 메모리 모델, 동기화, 스레드 풀, 가상 스레드: happens-before, synchronized·volatile·Atomic·Lock, ConcurrentHashMap, ThreadLocal과 ScopedValue, ThreadPoolExecutor, Fork/Join, 가상 스레드
- Java 입출력과 직렬화: 스트림, Path·Files, Serializable, Jackson: 바이트·문자 스트림과 인코딩, 데코레이터 구조의 보조 스트림, 버퍼링, Path·Files, Serializable·serialVersionUID와 보안 문제, Jackson 어노테이션과 타입 정보 보존
- JVM 내부 구조: 실행 엔진, 클래스 로딩, 메모리 영역, GC: 바이트코드와 클래스 로딩, 런타임 데이터 영역, 세대별 GC, GC 로그·힙 덤프 진단
- Java 코딩 컨벤션: Google 스타일과 캠퍼스 핵데이 규칙: 두 컨벤션 비교, 이름·import·중괄호·Javadoc 규칙, Checkstyle·EditorConfig 자동 적용
- Kotlin 핵심 문법: 널 안전성, 클래스 종류, 지연 초기화, 스코프 함수: 널 안전성, data·sealed·object·companion object, lateinit과 by lazy, 스코프 함수 비교
- Python 언어 기본: 객체와 가변성, 함수, 데코레이터, 클래스, 타입 힌트, import: 가변·불변과 복사, 인자 종류, LEGB·nonlocal, 데코레이터, 컨텍스트 매니저, 매직 메서드, 디스크립터, 타입 힌트, import
- Python 언어 동작: 제너레이터, MRO, 메모리 관리, 동시성, 성능: 이터러블·이터레이터·제너레이터, C3 MRO와 super(), 참조 카운팅과 세대별 순환 수집, 누수 패턴, PyPy 추적 JIT, 덕 타이핑과 Protocol
- Go 언어: 설계 원칙, 타입, 에러 처리, 빌드와 테스트, GC: The Zen of Go, G·M·P 스케줄러, 동시 GC와 GOGC·GOMEMLIMIT, 계층별 프로젝트 구조
- Go 동시성: 고루틴, 채널, select, context, sync: G·M·P 스케줄러, 채널 상태별 동작, select, context 취소 전파, sync와 atomic, 레이스 디텍터