Java 멀티스레드 vs Kotlin 코루틴

Java 멀티스레드와 Kotlin 코루틴의 핵심 차이는 스케줄링 주체입니다. OS가 강제로 전환하느냐, 코드가 자발적으로 양보하느냐. OS 레벨 병렬처리 OS 레벨 ├── 멀티 프로세스 (독립 메모리) └── 멀티 스레드 (공유 메모리, OS 스케줄링) 언어 레벨 └── 코루틴 (공유 메모리, 언어 스케줄링) 핵심 차이: 누가 스케줄링하느냐 Java 멀티스레드 OS가 CPU 클럭 단위로 강제 스위칭 → 선점형(Preemptive) 스레드 전환 비용이 큼 (스택, 레지스터 저장/복원) 스레드 1개 = OS 스레드 1개 (~1MB) Kotlin 코루틴 suspend 포인트에서 자발적으로 스레드 반납 → 협력형(Cooperative) 전환 비용이 매우 작음 (힙에 상태 저장, ~수KB) 스레드 몇 개 위에서 코루틴 수천 개 동작 가능 계층 구조 코루틴은 스레드를 대체하는 게 아니라 스레드 위에서 동작합니다. ...

2026년 3월 22일

Kotlin의 접근 제어자 설계 철학

Java package-private 클래스를 Kotlin 테스트 코드에서 접근하려니 생성자 호출이 안 되어 reflection을 써야 했습니다. 왜 이런 문제가 발생할까요? Java와 Kotlin 접근 제어자 비교 Java public: 전체 protected: 상속 + 같은 패키지 (default): 같은 패키지 private: 같은 클래스 Kotlin public: 전체 internal: 같은 모듈 protected: 상속 관계만 private: 같은 클래스 (클래스 멤버) / 같은 파일 (최상위 선언) 핵심 차이 Java Kotlin 캡슐화 단위 패키지 모듈 테스트 접근 같은 패키지 필요 같은 모듈이면 OK package-private 있음 없음 (internal로 대체) protected 상속 + 같은 패키지 상속만 Kotlin의 설계 철학 패키지는 캡슐화 경계가 아니다 // 원래 라이브러리 (example-lib.jar) package com.example.core; class InternalClass { // package-private void sensitiveMethod() { } } // 악의적 사용자 코드 (다른 프로젝트) package com.example.core; // 같은 패키지명 사용 public class Hacker { void access() { new InternalClass(); // package-private인데 접근됨 } } 패키지는 코드 조직화 수단일 뿐, 실제 캡슐화는 컴파일/배포 단위인 모듈에서 이루어져야 합니다. ...

2026년 1월 13일