Kotlin ‐ 코틀린 타입 시스템의 묘미[Effective Kotlin Item 20] - woojin-playground/Backend-PlayGround GitHub Wiki

Any

  • 코틀린에서 모든 클래스의 슈퍼 클래스는 Any이며, 자바의 Object와 비슷하다.
  • 모든 타입의 슈퍼 타입은 Any가 아니라 Any?이다.
  • Any는 널 가능하지 않은 모든 타입의 슈퍼 타입이다.

Unit

  • Unit은 타입 계층구조에서 어떤 위치도 차지하지 않는다.
  • 함수가 결과 타입을 명시하지 않았을 때, 선언되는 객체이다.

Nothing: 모든 타입의 서브타입

  • Nothing은 모든 타입의 서브타입이다.
  • 그래서 Nothing 타입의 인스턴스가 있다면 어떤 것이든지 대체하여 사용할 수 있다.
  • 영원히 실행되거나, 프로그램을 종료하거나, 예외를 던지는 경우에 사용할 수 있다.
fun runForever(): Nothing {
    while (true) {
        // 연산이 없다.
    }
}

fun endProgram(): Nothing {
    exitProcess(0)
}

return과 throw 결과 타입

fun main() {
    val a = return
    val b = throw Error()
}
  • returnthrow는 모두 함수를 종료시키기 때문에 아무 의미가 없으며 따라서, 변수 a와 b에 할당되는 값도 없다.
  • returnthrow는 결과 타입으로 Nothing을 선언한다.

도달할 수 없는 코드가 있는 경우라면?

  • 결과 타입이 Nothing이라고 선언한 요소를 호출한 뒤의 코드는 전부 도달할 수 없다.
  • Nothing인 인스턴스는 없으니 반환될 수가 없다는 점에서 합리적이다.
  • Nothing을 결과 타입으로 선언한 문장은 정상적인 방법으로는 완료되지 않기 때문에 그 다음 문장에 도달할 수 없게 된다.
  • failthrow 다음에 오는 모든 코드가 도달할 수 없는 이유이다.
fun test1() {
    print("Before")
    fail()
    print("After")
}

fun test2() {
    print("Before")
    throw Error()
    print("After")
}