안녕하세요. 점냥입니다 :)
여러분들은 Kotlin
언어를 알고 있나요? 열심히 Android 공부를 하고 있는 여러분이라면 이미 알고 있겠죠 ㅎㅎㅎ
Kotlin은 Google I/O 17년도에서 Android 공식 언어로 지정되었습니다!!
아직 Kotlin을 사용하지 않는 다면 서두르세요. 어느새 Android Develop 사이트 전반적인 코드 샘플들과 공식 유투브에서 Kotlin 언어를 기본으로 사용중인 것을 확인할 수 있습니다. 이 포스팅을 읽고 나서 Kotlin 언어에 대한 흥미가 생기셨으면 좋겠습니다.
Kotlin 배경
Kotlin 언어가 나오기 전 Android 플랫폼에서는 C++ 언어도 쓰이긴 했지만, 대다수의 개발자들은 Java 언어를 사용해서 개발했습니다. Java 언어는 JVM에서 동작하여 운영체제와 상관이 없어 여러 플랫폼에서 사용되었고, 객체지향 프로그래밍 언어이기 때문에 굉장히 인기가 있었습니다.
하지만 Java는 지금 Kotlin과 비교하면 많은 단점이 있었습니다. 예를 들어 Java 8 Lamda가 나오기 전, 불필요한 익명 객체를 전부 선언해야 하는 등 불필요한 코드들이 많아 간결하지 않았고, null-safe 하지 않기 때문에 런타임에서 NPE
가 발생하며 프로세스가 종료되는 버그도 많았죠.
Kotlin은 이러한 상황 속에서 개발되었습니다.
그러면 Kotlin 쓰면 어떤것이 좋나요?
Kotlin을 한번 쓰고 나면 Java로 다시 못 넘어간다는 말이 있죠:)
몇 가지 Kotlin 코드의 예시를 확인해 봅시다
세미클론을 생략
//java int a = 10;
val a = 10
최신 언어들의 공통적인 특징이죠. 코드 문장의 끝에 ;
을 붙이지 않는 다는 거에요 :)
타입 추론
//int x = 10; 변수 명 앞에 타입을 명시해주어야 한다.
val x: Int = 10
var y = 5 //5 값으로 y변수 타입 추론 -> Int
y += 5
kotlin에서는 변수 명 앞에 타입 대신 val, var 키워드가 선언됩니다. 그리고 kotlin은 타입 추론이 가능하여
변수 명 뒤에 타입을 명시하지 않아도 동작합니다.
Koltin은 정적 타입 지정 언어로 런타임에서 변수 타입이 정해지는 것이 아닌 컴파일 타임에서 변수의 타입이 정해집니다. 코드에서 명시적으로 타입을 선언하지 않아도 변수에 입력된 값을 분석하여 컴파일러가 타입을 유추합니다.
NPE 제어
var a : Int = 10
a = null // a는 Nullable 변수가 아니므로 null이 들어갈 수 없다.
var b : Int? = null
kotlin은 null이 허용된 변수만 null 값이 들어갈 수 있습니다. 이는 개발자가 null이 발생할 수 있는 환경을 인지하고 프로그래밍을 할 수 있다는 장점이 있습니다.
null 값이 들어가지 못하는 변수를 제어할 때 NPE
걱정 없이 코드를 구현할 수 있겠죠. 그렇다면 null 값이 들어가 있을 수 있는 nullable 변수에 접근하는 방법에는 어떤 것이 있을 까요?
세이프 콜
접근하고자 하는 변수가 null이라면 에러 없이 null반환
var str1 : String? = "Hello"
str1 = null
println("${str1?.length}")
//출력: null
null 허용 변수 뒤에 물음표(?). 붙여주면서 만약 str1이 null라면 null 출력 null이 아니라면 length 호출
위 코드라면 null이 출력이 됩니다.
non-null
접근하고자 하는 변수는 null이 아니라고 단정하는 방법으로 물음표 2번(!!)이 사용됩니다
따라서 null일 경우 NPE가 발생합니다.
var str1 : String? = "Hello"
str1 = null
println("${str1!!.length}")
// NPE ERROR 발생!!!
이 방법은 안쓰는 것을 추천합니다. 개발자가 Null이 아닐 경우를 모든 상황을 파악하여 단정하기는 불가능에 가까워 되도록이면 세이프 콜 또는 let 등의 고차 함수를 사용하여 null을 제어하는 것이 좋습니다.
Java와는 비교되는 간결성
함수
fun sum(a:Int,b:Int):Int = a + b //return 생략
fun sum(a:Int,b:Int) = a + b // Return Type 추론 생략
fun max(a:Int,b:Int) = if(a>b) a else b
Kotlin은 Java와 달리 (타입 추론 등) 함수를 더 간결하게 선언할 수 있습니다.
//public void a(int one) { ... }
//public void a(int one, int two) { ... }
//public void a(int one, int two, int three) { ... }
fun a (one : Int = 0,
two : Int = 1,
three : Int = 2) { ... }
Java의 오버로드는 굉장히 좋은 기능이지만 그래도 불필요하게 중복된 함수 선언이 존재하죠..
Kotlin에서는 Default 매개변수
로 인해서 한번의 함수 선언으로 가능하게 됩니다.
Data class
public class sample {
private int a;
public sample(int a) { this.a = a; }
public int getA() { return a; }
public void setA(int a) { this.a = a; }
@Override
public String toString() { return "" + a; }
@Override
public boolean eqauls(Object obj) { ... }
@Override
public int hashCode() { ... }
}
data class sample(val a: Int)
Java에서 Data 전달/ 비교를 위해 클래스를 작성할 때 간단한 작업이 아닙니다. 프로퍼티 하나하나 getter, setter 함수를 만들어 줘야하고 동일한 객체를 비교하기 위해 equals()
, hashcode()
오버라이드 해줘야 합니다.
하지만 Kotlin에서는 data class
키워드 하나면 Java에서 선언한 클래스와 동일하게 됩니다.
Java와의 호환성
Kotlin 언어가 굉장히 좋다고 해도 이미 많은 프로젝트에서 Java로 개발되었을 텐데, 모두 없애고 Kotlin으로 새로 짤 수는 없겠죠.
때문에 코틀린은 애초에 개발할 당시 자바와의 호환성을 고려하여 개발되었습니다. 추가로 Kotlin 표준 라이브러리를 제공해주므로 더 효율적으로 코드를 작성할 수 있습니다. 이것이 가능한 이유는 코틀린 파일들은 컴파일러에 의해 JVM에서 실행될 수 있는 자바 바이트 코드로 변환되고 Kotlin 런타임 라이브러리와 함께 배포되기 때문입니다.
코틀린 파일은 자바 바이트 코드로 컴파일 되기 때문에 Decomplie하게 되면 kotlin 파일의 내부 동작 원리를 살필 수 있습니다.
정리하며
아직 Kotlin을 사용해보지 않으셨다면 얼른 시작해보세요!.
이미 Android 개발에 도움되는 KTX
라이브러리 들이 새롭게 만들어지고 있습니다. Kotlin 흥행 열차에 다같이 탑승합시다 :)
참고
- Kotlin in Action
'Language > kotlin' 카테고리의 다른 글
[Kotlin] Enum의 새로운 values Function 등장, entries (0) | 2024.05.05 |
---|---|
[Kotlin] 데이터 표현을 위한 Data Object (0) | 2024.03.26 |
[Kotlin] Singleton (0) | 2020.06.01 |
[Kotlin] - 기본문법 2 (0) | 2020.02.10 |
Kotlin의 유용한 함수들 - let, apply, run, with (0) | 2020.02.10 |