자바와의 비교
자바와의 비교 (Comparison to Java)
자바에 익숙하다면 Kotlin을 처음 만났을 때 '자바에서 불편했던 이 문제는 어떻게 해결되지?'라는 궁금증이 들기 마련이에요. Kotlin은 자바가 오랫동안 안고 있던 여러 문제를 언어 설계 차원에서 해결했어요. 어떤 부분이 달라졌는지, 양쪽에만 있는 기능은 무엇인지 나란히 놓고 비교해 볼게요.
출처: Kotlin 공식 문서
본문
Kotlin이 해결한 자바의 문제들
Kotlin은 자바가 겪고 있던 이런 문제들을 바로잡았어요.
- 널 참조가 타입 시스템에 의해 제어돼요.
- raw 타입이 없어요.
- Kotlin의 배열은 불변(invariant)이에요.
- 자바의 SAM 변환과 달리, Kotlin에는 제대로 된 함수 타입이 있어요.
- 와일드카드 없이 사용 지점 변성(use-site variance)을 써요.
- Kotlin에는 체크 예외가 없어요.
- 읽기 전용과 가변 컬렉션을 위한 인터페이스가 따로 분리돼 있어요.
자바에는 있지만 Kotlin에는 없는 것
- 체크 예외(checked exceptions)
- 클래스가 아닌 원시 타입(primitive types). 바이트코드에서는 가능한 한 원시 타입을 쓰지만, Kotlin에서 명시적으로 다루지는 못해요.
- 정적 멤버(static members) 대신 동반 객체(companion objects), 최상위 함수(top-level functions), 확장 함수 또는 @JvmStatic을 사용해요.
- 와일드카드 타입 대신 선언 지점 변성(declaration-site variance)과 타입 프로젝션(type projections)을 사용해요.
- 삼항 연산자
a ? b : c대신 if 표현식을 사용해요. - 레코드(Records)
- 패키지 전용(package-private) 가시성 수정자
Kotlin에는 패턴 매칭이 없지만, Kotlin의 스마트 캐스트가 자바의 패턴 매칭과 비슷한 기능을 제공해요.
이 내용은 공식 Kotlin by JetBrains 채널의 영상에서 더 자세히 확인할 수 있어요.
Kotlin에는 있지만 자바에는 없는 것
- 람다 표현식 + 인라인 함수 = 성능 좋은 커스텀 제어 구조
- 확장 함수
- 널 안전성(null-safety)
- 문자열 템플릿
- 프로퍼티(properties)
- 주 생성자(primary constructors)
- 일급 위임(first-class delegation)
- 변수와 프로퍼티 타입의 타입 추론 (자바 10의 로컬 변수 타입 추론(Local-Variable Type Inference)과 대응)
- 싱글턴(singletons)
- 선언 지점 변성과 타입 프로젝션
- 범위 표현식(range expressions)
- 연산자 오버로딩
- 동반 객체(companion objects)
- 데이터 클래스(data classes)
- 코루틴(coroutines)
- 최상위 함수(top-level functions)
- 기본값을 가진 파라미터
- 이름 붙은 인자(named parameters)
- 중위 함수(infix functions)
- expect/actual 선언
- 명시적 API 모드(explicit API mode)와 API 표면의 더 세밀한 제어
자바에는 스마트 캐스트가 없지만, 패턴 매칭이 Kotlin의 스마트 캐스트와 비슷한 기능을 제공해요.
이 내용 역시 공식 Kotlin by JetBrains 채널의 영상에서 더 자세히 확인할 수 있어요.
더 알아보기 (Learn more)
- Java와 Kotlin에서 문자열의 대표 작업 — 자주 쓰는 문자열 처리를 양쪽 언어로 비교해요.
- Java와 Kotlin에서 컬렉션의 대표 작업 — 컬렉션 작업을 언어별로 대조해요.
- Java와 Kotlin에서 널 다루기 — 널 안전성 처리 차이를 설명해요.