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()
}
return과 throw는 모두 함수를 종료시키기 때문에 아무 의미가 없으며 따라서, 변수 a와 b에 할당되는 값도 없다.
return과 throw는 결과 타입으로 Nothing을 선언한다.
도달할 수 없는 코드가 있는 경우라면?
- 결과 타입이
Nothing이라고 선언한 요소를 호출한 뒤의 코드는 전부 도달할 수 없다.
Nothing인 인스턴스는 없으니 반환될 수가 없다는 점에서 합리적이다.
Nothing을 결과 타입으로 선언한 문장은 정상적인 방법으로는 완료되지 않기 때문에 그 다음 문장에 도달할 수 없게 된다.
fail과 throw 다음에 오는 모든 코드가 도달할 수 없는 이유이다.
fun test1() {
print("Before")
fail()
print("After")
}
fun test2() {
print("Before")
throw Error()
print("After")
}