Kotlin

코틀린 Unit vs Nothing

SKaSha 2019. 8. 2. 12:49

코틀린에서는 데이터와 관계 없이 특수 상황을 표현하기 위하여 Unit과 Nothing이라는 타입을 제공합니다.

Unit

Unit은 자바에서 void에 해당하는 예약어로써 아무것도 반환하지 않는 것을 의미합니다.
또한 Unit 예약어는 아래와 같이 생략이 가능합니다.

fun func1() {}
fun func2(): Unit {}

자바에서 void는 존재하지 않음을 뜻하지만 코틀린에서 Unit은 아무것도 반환하지 않는 타입을 의미하기 때문에 약간의 차이가 있습니다.
자바에서 void 타입을 출력 할 수 없지만, 코틀린에서는 Unit이라는 타입은 출력이 가능합니다.

val myVal: Unit = Unit

fun main(args: Array<String>) {
    println(myVal)
}

출력결과
kotlin.Unit

제네릭에서 Unit

Unit도 타입이기때문에 다음과 같이 제네릭 타입에서 이용 할 수 있습니다.

interface MyInterface<T> {
    fun myFun(): T
}

class MyClass: MyInterface<String> {
    override fun myFun(): String {
        return "hello"
    }
}

class MyClass2: MyInterface<Unit> {
    override fun myFun() {

    }
}

Nothing

의미가 있는 데이터가 없다는 것을 명시적으로 선언하기 위해 사용되는 타입입니다.
아래와 같이 정상적으로 끝나지 않는 함수를 명시적으로 표현할 수 있습니다.

fun func(arg: Nothing?) : Nothing {
    throw Exception()
}

제네릭에서 Nothing

제네릭의 Variance는 covariance와 contravariance로 나뉘어지는데 이중 contravariance 부분에서 Nothing을 사용하면 유용합니다.
아래 코드에서 in 어노테이션을 이용하여 어떤 제네릭 타입도 대입 받을 수 있도록 하였습니다.

class MyClass<T>

fun someFun(arg: MyClass<in Nothing>) { }

fun main(args: Array<String>) {
    someFun(MyClass<Int>())
    someFun(MyClass<String>())
}