티스토리 뷰
kotlin은 java와 호환되면서 간결하고 표현력있는 코드를 작성할 수 있는 언어입니다.
anroid는 대부분의 프로젝트에서 kotlin으로 개발을 이미 많이 하고 있는데 back-end 서버도 kotlin을 많이 사용하고 있는 추세입니다.
java 개발자라면 kotlin을 미리 익혀두면 나중에 큰 도움이 될 것입니다.
kotlin 책을 사서 보는 것도 좋지만 아래 문서 홈페이지에 가시면 다양한 예제들과 함께 기초적인 문법들을 익히실 수 있습니다.
https://kotlinlang.org/docs/home.html
우선 아래 사이트에서 가셔서 기초적인 문법을 익힙니다.
https://kotlinlang.org/docs/basic-syntax.html
문서 중에 코드 예제는 바로 실행시켜서 출력해볼 수 있고 왼쪽 아래에 있는 playground 링크를 통해서 playground에서 실행해 볼 수도 있습니다.
idioms 페이지에서 관용어구에 대해서 나와있는데 java 14부터 등장한 record 클래스와 같은 data class로 DTO를 생성하는 방법등이 나와 있습니다.
https://kotlinlang.org/docs/idioms.html
코드 예제 및 문서를 하나하나 따라가보면서 느끼는 건데 정말 간결하고 안전하게 개발할 수 있겠다라는 생각이 들었습니다.
kotlin을 불변성을 강제하진 않지만 권장합니다. 그래서 java에서 final로 선언했던 변수들을 val로 선언하면 됩니다.
var : mutable variable
val : immutable variable
기본적으로 강력한 타입 추론으로 인해서 따로 타입을 지정하지 않아도 컴파일러가 이해합니다.
var a: String = "initial" // 변할 수 있는 변수
println(a)
val b: Int = 1 // 불변형 변수
val c = 3 // 불변형 변수와 c는 Int라고 타입 추론함.
kotlin class와 method는 기본적으로 final입니다. 상속을 허용하고 싶으면 아래와 같이 open 이라는 수정자를 붙이시면 됩니다.
open class Dog { // 1 클래스 상속 허용
open fun sayHello() { // 2 함수 상속 허용
println("wow wow!")
}
}
class Yorkshire : Dog() { // 3
override fun sayHello() { // 4
println("wif wif!")
}
}
kotlin은 nullable value 정의와 null check 부분에 있어서 컴파일 단계에서 NPE(NullPointerException)를 막을 수 있습니다.
아래 함수는 Int 반환 타입에 끝에 ? 표가 있기 때문에 null을 반환할 수 있습니다.
fun parseInt(str: String): Int? {
// ...
}
아래와 같이 null check가 없는 상태에서 실행을 하면 컴파일 단계에서 아래와 같은 오류가 납니다.
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
println(x * y)
}
다음과 같이 x, y에 대해서 null check를 강제해서 runtime 시에 발생할 수 있는 NPE를 사전에 막을 수 있습니다.
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
// Using `x * y` yields error because they may hold nulls.
if (x != null && y != null) {
// x and y are automatically cast to non-nullable after null check
println(x * y)
}
else {
println("'$arg1' or '$arg2' is not a number")
}
}
아래 java 14부터 미리보기 기능으로 소개된 pattern matching이 kotlin에서 이미 제공됩니다.
java
if (o instanceof String s) {
System.out.printf("Object is a string %s", s);
} else if (o instanceof Number n) {
System.out.printf("Object is a number %n", n);
}
kotlin
fun getStringLength(obj: Any): Int? {
// `obj` is automatically cast to `String` on the right-hand side of `&&`
if (obj is String && obj.length > 0) {
return obj.length
}
return null
}
java에서 StringUtils로 정의해서 개발했던 것들이 확장 함수(extension functions)로 정의해서 사용하시면 됩니다.
fun String.spaceToCamelCase() { ... }
"Convert this to camelcase".spaceToCamelCase()
java에서 하위 object null check 코드로 많은 양을 작업했다면 if-not-null-else 구문으로 좀 더 가독성 있고 생산성 있게 개발할 수 있습니다.
val files = File("Test").listFiles()
println(files?.size ?: "empty") // if files is null, this prints "empty"
문서화가 잘되어 있어서 문서를 천천히 살펴보고 책은 기본 문법 서적 말고 샘플이나 심화과정으로 보는 것이 좋을 것 같습니다.