Kotlin이란 간결한 문법과 높은 안전성을 보장하는 Java와 100% 호환이 가능한 오픈 소스 기반의 프로그래밍 언어 입니다.
2017년 Google에서 Android의 공식 언어로 Kotlin을 추가하였으며, 현재는 구글 내부의 안드로이드 프로젝트에서도 Java 대신 Kotlin을 사용하고 있을만큼 영향력이 커져가고 있습니다.
Kotlin의 특징
정적 타입 언어 (Static Typed Language)
Kotlin의 경우 컴파일 시점에 변수의 타입이 결정되는 정적 타입 언어입니다.
정적 타입 언어는 타입 에러로 인한 문제를 컴파일 시 해결할 수 있기 때문에 안정성이 높다는 장점과 컴파일 시 미리 타입을 결정하기 때문에 실행 속도가 빠르다는 장점을 가지고 있습니다.
// Kotlin 코드(정적 타입)의 예
var m: Int = 13
m = 15 // Ok
m = "hello" // Error
m = 15.0 // Error
# Python 코드(동적 타입)의 예
m = 13 # int
m = "hello" # str
m = 13.0 # float
간결한 문법 제공
1. 항상 문장 끝에 넣어줘야 했던 세미콜론(;)의 생략이 가능해졌습니다.
2. 객체 생성 시 new 키워드의 생략이 가능해졌습니다.
3. 타입 추론을 지원하여 변수 선언 시 타입의 생략이 가능해졌습니다.
Null 안정성
Java에서는 객체 타입의 변수에서 Null 값의 허용 여부를 구분할 수 없었지만 Kotlin에서는 ?, !!를 이용하여 Null 값의 허용 여부를 구분할 수 있게 됐습니다. 이를 통하여 NullPointerException(NPE) 오류가 발생할 가능성을 크게 줄여 개발되는 프로그램의 안정성을 크게 증가시킬 수 있었습니다.
가변과 불변의 구분
val (불변) : 한번 선언한 이후에는 값 변경이 불가능함
var (가변) : 한변 선언한 이후에도 값을 변경 시킬 수 있음
함수 타입에 대한 지원
Kotlin은 함수형 프로그래밍(Functional Programming)을 지원하기 때문에 함수를 변수에 저장하거나 다른 함수에 전달하거나 반환할 수 있습니다. 이를 통하여 가독성을 높이고 유지보수를 용이하게 할 뿐만 아니라 함수를 통하여 불변 데이터 구조를 사용하기 때문에 다중 쓰레드를 사용하더라도 안정적으로 사용할 수 있습니다.
fun add(a: Int, b: Int) = a + b
fun subtract(a: Int, b: Int) = a - b
fun main() {
val functions = mutableListOf(::add, ::subtract)
println(functions[0])
// fun add(kotlin.Int, kotlin.Int): kotlin.Int
println(functions[0](12, 30))
// 12+30 = 42
println(functions[1](57, 12))
// 57-15 = 42
}
또한, SAM(Single Abstract Method) 변환을 지원하여 함수의 인자로 전달되는 인터페이스의 객체를 람다식으로 표현할 수 있습니다.
val view = ....
// SAM 변환을 통해 OnClickListener
// 인터페이스의 인스턴스를 람다식으로 표현함
view.setOnClickListener {
Toast.makeText(it.context, "Click", Toast.LEGTH_SHORT).show()
}
Kotlin과 Java의 컴파일 과정
Koltin과 Java의 경우 아래와 같은 절차를 걸쳐 컴파일이 이뤄집니다.
Java
1. TestClass.java 파일을 작성한 뒤 컴파일을 위해 javac(Java Compiler)로 전달 함
2. javac는 Java Source 파일(TestClass.java)을 JVM이 이해할 수 있는 Java Byte Code 파일(TestClass.class)로 컴파일 함
3. Java Byte Code 파일은 JVM(Java Virtual Machine)으로 전달됨
4. JVM은 Byte Code를 이해하고 JIT(Just-In-Time) Compiler를 사용하여 기계어로 변환함
5. 기계 코드는 메모리로 보내지고 CPU에 의해 실행됨
Kotlin
1. TestClass.kt 파일을 작성한 뒤 컴파일을 위해 kotlinc(Kotlin Compiler)로 전달 함
2. kotlinc는 Kotlin Source 파일(TestClass.kt)을 JVM이 이해할 수 있는 Java Byte Code 파일(TestClass.class)로 컴파일 함
3. Java Byte Code 파일은 JVM(Java Virtual Machine)으로 전달됨
4. JVM은 Byte Code를 이해하고 JIT(Just-In-Time) Compiler를 사용하여 기계어로 변환함
5. 기계 코드는 메모리로 보내지고 CPU에 의해 실행됨 (kotlinc로 변환된 코드는 Kotlin Runtime Library에 의존함)
참고로 Android에서는 JVM이 아닌 DVM(Dalvik Virtual Machine)과 ART(Android Run Time)를 사용하고 있어 동작 방식이 조금 달라집니다.
구분 | DVM | ART |
컴파일러 | JIT(Just In Time) | AOT(Ahead Of Time) |
실행 | Dex, ODEX | OAT(ART) |
GC 알고리즘 | CMS 알고리즘 | Customized CMS 알고리즘 (기존보다 2배 빠름) |
설치 속도 | 빠름 | 느림 (설치 시점에 전체 Byte Code를 기계어로 변환) |
실행 속도 | 느림 | 빠름 |
배터링 수명 | 짧음 | 긺 |
앱 설치 공간 | 적게 필요함 | 많이 필요함 |
먼저 DVM을 사용하는 경우 아래와 같은 절차를 거쳐 컴파일이 이뤄집니다.
ART를 사용하는 경우 아래와 같은 절차를 거쳐 컴파일이 이뤄집니다.
'Study > WEB' 카테고리의 다른 글
Spring Boot + Kotlin의 모니터링 도구, Spring Actuator, Prometheus, Grafana (1/2) (0) | 2022.09.18 |
---|---|
URI, URL, URN의 차이점 (0) | 2022.08.17 |
Spring과 Spring Boot의 차이점에 대해 알아보기 (0) | 2022.07.26 |
[Spring Boot With Kotlin] Spring Interceptor (0) | 2022.07.25 |
[Spring Boot] Bean 이해하기 (With Spring Container) (0) | 2022.07.25 |
댓글