공식 문서로 보는 Kotlin 문법 찍먹 (2)

업데이트:

공식 문서에 나온 내용을 정리한 글

지난 글에 이어 Kotlin의 문법에 대해 공식 문서를 통해 알아보도록 하자.

Basics

Idioms

Create DTOs(POJOs/POCOs)

data class Customer(val name: String, val email: String)

data class는 다음과 같은 메서드들을 제공해준다.

  • getter (var인 경우 setter까지)
  • equals()
  • hashCode()
  • toString()
  • copy()
  • component1(), component2, …, componentN

다음과 같은 요구사항을 충족해야 한다.

  • primary constructor는 하나 이상의 parameter가 있어야 한다.
  • 모든 primary constructor의 parameter는 val 또는 var로 mark 돼야 한다.
  • 데이터 클래스는 abstract, open, sealed, or inner가 될 수 없다.

컴파일러는 기본 생성자 내부에 정의된 속성만 사용한다.

data class Person(val name: String) {
    var age: Int = 0
}

이렇게 선언하면 toString(), equals(), hashCode()에는 name property만 들어가게 된다.

Default values for function parameters

fun foo(a: Int = 0, b: String = "") { ... }

kotlin은 함수 파라미터에 대한 디폴트 값을 정의할 수 있다.

Filter a list

val positives = list.filter { x -> x > 0 }

or

val positives = list.filter { it > 0 }

Instance checks

when (x) {
    is Foo -> ...
    is Bar -> ...
    else   -> ...
}

java의 instanceof 또는 isInstance()를 is만으로 대체했다.

Create a singleton

object Resource {
    val name = "Name"
}

object키워드로 클래스를 정의하면, 싱글턴 객체로 선언되어 객체가 하나만 생성된다.

null 처리

  • ? : 해당 변수가 nullable
  • ?. : 앞의 변수가 null이 아니면 오른쪽 함수 실행, null이면 null 반환
  • ?: : Elvis 연산자. null인 경우 default 값을 주고 싶을 때 사용
  • !! : 절대 null이 아님을 선언할 때 사용. null이 들어오면 NPE 발생
  • let : not null인 경우에 지정된 구문을 실행

shorthand

  • if-not-null

      val files = File("Test").listFiles()
        
      println(files?.size) // files가 null이 아니면 size 출력
    
  • If-not-null-else

      val files = File("Test").listFiles()
        
      println(files?.size ?: "empty") // files가 null이면 "empty" 출력
    

Execute a statement if null

val values = ...
val email = values["email"] ?: throw IllegalStateException("Email is missing!")

Execute if not null

val value = ...

value?.let {
    ... // value가 null이 아니면 이 블럭의 코드 실행
}

try-catch expression

fun test() {
    val result = try {
        count()
    } catch (e: ArithmeticException) {
        throw IllegalStateException(e)
    }

    // try-catch를 이용해 얻은 result로 로직 수행
}

정리

이전 글과 이어서 공식 문서를 정리해보았다. 필요한 내용은 따로 찾아보면서 보강했지만 여전히 궁금한 것도 많고 어렵기도 하다. 다만 null 처리에 관해 java에 비해 확연히 편하게 할 수 있는 여러 연산자들을 제공해주는 것은 인상깊었다. 다음에는 1편에서 언급했던 racing-car 미션에 대해 리뷰하는 내용을 작성하겠다.

태그:

업데이트:

댓글남기기