Kotlin In Action 1장 코틀린이란 무엇이며, 왜 필요한가? 내용을 요약했습니다.
아래의 코드는 http://try.kotl.in에서 실행해볼 수 있습니다.
코틀린이란 ?
코틀린은 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어다. 자바 코드와의 상호운용성을 중시한다.
1.1 코틀린 맛보기
1 data class Person(val name: String,
2 val age: Int? = null)
3
4 fun main(args: Array<String>) {
5 val persons = listOf(Person("철수"),
6 Person("영희", age = 29))
7
8 val oldest = persons.maxBy { it.age ?: 0 }
9 println("나이가 가장 많은 사람: $oldest")
10 }
- data class를 정의합니다.
Int?는 Int형 nullable을 의미하고, null은 default값을 의미합니다.
- 철수는 Person(name: "철수", age: null) 입니다.
- 영희는 Person(name: "영희", age: 29) 입니다.
- maxBy 함수에 전달한 람다 식은
it 파라미터를 받습니다. person과 같은 다른 값을 사용하니 에러가 발생했습니다. 엘비스 연산자 ?: 는 age가 null이면 0을 반환합니다. 아니면 age를 반환합니다.
1.2 코틀린의 주요 특성
1.2.1 대상 플랫폼
코틀린의 주목적은 자바가 사용되고 있는 곳에 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것입니다.
1.2.2 정적 타입 지정 언어
코틀린은 타입 추론, nullable type, function type을 지원합니다.
정적 타입 지정 언어 & 타입 추론 지원
코틀린은 자바와 동일하게 정적 타입 지정 언어입니다.
- 정적 타입 지정 언어: 컴파일시에 구성 요소의 타입을 지정합니다.
- 동적 타입 지정 언어: 런타임시에 데이터 타입이 지정합니다.
컴파일러가 문맥을 고려해 변수 타입을 결정하는 기능을 타입 추론(type inference)라 합니다.
코틀린은 아래의 코드에서 x의 타입이 Int임을 자동으로 알아내며 정적 타입 지정 언어의 불편함을 해소합니다.
val x = 1
nullable type
코틀린은 null이 될 수 있는 타입을 지원합니다.
nullable을 지원함에 따라 컴파일 시점에 null pointer exception여부를 검사할 수 있어 신뢰성을 높일 수 있습니다.
function type
코틀린은 function type을 지원합니다.
함수형 프로그래밍 특징
- 함수를 변수에 저장할 수 있습니다.
- 함수를 인자로 다른 함수에 전달할 수 있습니다.
- 불변성 : 내부 상태가 바뀌지 않는 불변 객체입니다.
- 부수 효과 없음 : 입력이 같으면 항상 같은 출력을 내고, 다른 것과 상호작용하지 않는 순수 함수를 사용합니다.
- 강력한 추상화를 할 수 있고, 코드 중복을 막을 수 있습니다.
- 다중 스레드에서 안전합니다.
1.4 코틀린의 철학
1.4.1 실용성
- 코틀린은 이미 성공적으로 검증된 해법과 기능에 의존한 언어입니다.
1.4.2 간결성
- Getter/Setter와 생성자 등 준비 코드를 코틀린은 묵시적으로 제공합니다.
- 다양한 표준 라이브러리로 컬렉션에서 원소를 찾는 등 반복되거나 길어질 수 있는 코드로 대치할 수 있습니다.
1.4.3 안전성
- 더 큰 안전성을 얻기 위해서는 프로그램에 더 많은 정보를 덧붙여야하기 때문에 생산성이 하락할 수 있습니다.
- JVM에서 실행되므로 메모리 안전성을 보장, 버퍼 오버플로를 방지 등 다양한 문제를 예방할 수 있습니다.
- NullPointerException, ClassCastException과 같이 구조적으로 일부 오류를 방지할 수 있습니다.
NullPointerException
코틀린은 null이 될 수 없는 값을 추적하며, 실행 시점에 NPE이 발생할 수 있는 연산을 사용하는 코드를 금지합니다.
val s: String? = null
val s: String = ""
ClassCastException
코틀린은 타입 검사와 캐스트가 한 연산자에서 이뤄집니다.
if (value is String)
println(value.toUpperCase())
1.4.4 상호운용성
- 코틀린은 자바의 기존 라이브러리를 그대로 사용할 수 있습니다.
- 코틀린은 기존 자바 라이브러리를 최대한 활용합니다. (코틀린은 자체 컬렉션이 없고, 자바 표준 라이브러리에 의존합니다.)
- 위 의미는 자바와 코틀린 사이에 아무런 장치없이 연동된다는 의미입니다.
1.5 코틀린 빌드 과정

- 코틀린 컴파일러는 .kt 코드를 분석해서 .class 파일을 만듭니다.
- 코틀린 컴파일러로 컴파일 된 코드는 코틀린 런타임 라이브러리에 의존합니다. 런타임 라이브러리에는 코틀린 표준 라이브러리와 자바 API의 기능을 확장한 내용이 들어있습니다. 따라서, 배포할 때는 런타임 라이브러리도 함께 배포해야 합니다.
ETC
- 코틀린 표준 라이브러리 함수는 인자로 받은 람다 함수를 inlining합니다. 따라서 람다를 사용해도 새로운 객체가 만들어지지 않으므로 객체 증가로 인한 gc가 늘어나지는 않습니다.
References