SSH vs SSL/TLS — 같은 재료, 다른 조립
둘 다 공개키+대칭키로 안전한 채널을 만들지만, SSH는 원격 접속까지 통합한 완결형 L7 프로토콜이고 TLS는 어떤 앱이든 감싸는 범용 보안 계층이다. 'SSH가 SSL 기반이냐'는 흔한 오해를 계층 구조로 정리한다.
둘 다 공개키+대칭키로 안전한 채널을 만들지만, SSH는 원격 접속까지 통합한 완결형 L7 프로토콜이고 TLS는 어떤 앱이든 감싸는 범용 보안 계층이다. 'SSH가 SSL 기반이냐'는 흔한 오해를 계층 구조로 정리한다.
gradlew bootRun에 -Xmx나 시스템 프로퍼티를 넘기려다 --args가 안 먹는 이유를 파헤친다. 핵심은 bootRun이 Gradle 데몬 JVM과 앱 JVM 두 개를 띄운다는 것. --args(앱 인자)와 -Dspring-boot.run.jvmArguments(앱 JVM 옵션)가 각각 어디로 흘러가는지, 왜 java -jar에는 그런 래핑이 필요 없는지 정리한다.
컬렉션의 내부 구조를 노출하지 않고 원소를 하나씩 훑는 공통 인터페이스가 이터레이터다. 거기에 map·filter를 지연(lazy)으로 엮으면 중간 컬렉션 없이 한 번에 훑는다. C++ STL 이터레이터·알고리즘에 넘기던 그 람다가 Rust Iterator 어댑터의 클로저이고, C++20 ranges의 지연 view가 Rust에선 언어 중심이 된 과정을 대응시킨다.
변수를 대입하거나 함수에 넘길 때 값이 복사되는가(copy), 같은 것을 가리키게 되는가(reference), 소유권이 넘어가는가(move). C++이 셋을 손으로 고르던 선택을 Go는 '복사 기본', Rust는 '이동 기본'으로 굳혔다. C++의 타입별 moved-from 계약과 Rust의 이동 후 사용 금지를 정확히 대응시킨다.
여러 실행 흐름이 데이터를 안전하게 나눠 쓰는 두 갈래 — 공유 상태를 락으로 지키기(C++ std::mutex)와 메시지 전달 규약으로 공유를 줄이기(Go 채널/CSP)를 정리한다. safe Rust가 Mutex
여러 타입을 공통 타입으로 다루고 실제 동작을 런타임에 고르는 서브타입 다형성을 정리한다. C++ 가상 함수가 하는 일을 Go interface 값과 Rust dyn Trait trait object가 어떻게 제공하는지, 대표 구현 모델과 static vs dynamic dispatch, 명목적 vs 구조적 만족 규칙을 대응시킨다.
타입을 매개변수로 받아 여러 타입에 같은 코드를 재사용하는 제네릭(파라미터 다형성)을 언어 공통 개념으로 정리한다. 구현이 갈리는 지점(단형화 vs 타입 소거), 아무 타입이나 막는 제약(constraints)을 짚고, C++ 템플릿·Go generics·Rust 제네릭이 같은 개념을 어떻게 다르게 구현하는지 대응시킨다.
함수가 실패했을 때 그것을 호출자에게 어떻게 전달하는가. 예외(C++/Java)·에러 값 반환(Go)·Result/Option 타입(Rust)이라는 세 모델을 명시성·강제성·성능 축으로 비교하고, '복구 가능한 에러'와 '프로그래밍 버그'를 왜 다르게 다뤄야 하는지 정리한다.
힙 메모리를 언제 잡고 언제 푸느냐를 누가 결정하는가. 수동 관리(C/C++)·가비지 컬렉션(Go/Java)·소유권(Rust)이라는 세 모델을 안전성·성능·예측성 축으로 비교하고, C++의 RAII와 스마트 포인터, Go의 GC, Rust의 소유권/빌림이 같은 문제를 어떻게 다르게 푸는지 정리한다.
클로저를 언어에 종속되지 않은 공통 개념으로 정리한다. 함수와 클로저의 차이, 값 캡처와 참조 캡처의 구분, 언어마다 반복되는 '루프 변수 캡처' 함정을 짚고, C++·Go·Rust·JavaScript가 이 개념을 각각 어떻게 구현했는지 대응시킨다.