티스토리 뷰

개발

kotlin 기초 학습

달리는개발자 2022. 4. 12. 15:06

kotlin은 java와 호환되면서 간결하고 표현력있는 코드를 작성할 수 있는 언어입니다.

anroid는 대부분의 프로젝트에서 kotlin으로 개발을 이미 많이 하고 있는데 back-end 서버도 kotlin을 많이 사용하고 있는 추세입니다.

java 개발자라면 kotlin을 미리 익혀두면 나중에 큰 도움이 될 것입니다. 

kotlin 자격 조건
kotlin 자격 조건

kotlin 책을 사서 보는 것도 좋지만 아래 문서 홈페이지에 가시면 다양한 예제들과 함께 기초적인 문법들을 익히실 수 있습니다.

https://kotlinlang.org/docs/home.html

 

Kotlin Docs | Kotlin

 

kotlinlang.org

 

우선 아래 사이트에서 가셔서 기초적인 문법을 익힙니다.

https://kotlinlang.org/docs/basic-syntax.html

 

Basic syntax | Kotlin

 

kotlinlang.org

문서 중에 코드 예제는 바로 실행시켜서 출력해볼 수 있고 왼쪽 아래에 있는 playground 링크를 통해서 playground에서 실행해 볼 수도 있습니다.  

idioms 페이지에서 관용어구에 대해서 나와있는데 java 14부터 등장한 record 클래스와 같은 data class로 DTO를 생성하는 방법등이 나와 있습니다.

https://kotlinlang.org/docs/idioms.html

 

Idioms | Kotlin

 

kotlinlang.org

코드 예제 및 문서를 하나하나 따라가보면서 느끼는 건데 정말 간결하고 안전하게 개발할 수 있겠다라는 생각이 들었습니다.

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"

 

문서화가 잘되어 있어서 문서를 천천히 살펴보고 책은 기본 문법 서적 말고 샘플이나 심화과정으로 보는 것이 좋을 것 같습니다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함