본문 바로가기

코틀린

Kotlin에서 Unit 과 Nothing

반응형
val nullableValue: String? = null
val value: Int = nullableValue?.toInt() ?: return

Unit 타입 : 코틀린의 void

코틀린이 void와 다른점

Unit은 싱글톤 인스턴스이다. 코틀린에서 Unit은 키워드 타입이며 동시에 객체이기도 하다.

val unit: Unit = Unit

Unit은 객체기도 하며, Any의 자식이다.

Generic type으로 Unit을 지정하면 return을 명시적으로 넣지 않아도 된다.

만약 Void type이라도 return은 반드시 넣어야 하나 코틀린의 Unit은 return 없이 사용 가능

자바에서 void는 존재하지 않음을 뜻하지만 코틀린에서 Unit은 아무것도 반환하지 않는 타입을 의미한다. 따라서 자바에서 void 타입을 출력할 수 없지만, 코틀린에서는 Unit이라는 타입은 출력이 가능하다.

val myVal: Unit = Unit

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

출력결과
kotlin.Unit
fun returnsUnit(): Unit {
}
 
fun returnsUnitExplicitly1(): Unit {
    return
}
 
fun returnsUnitExplicitly2(): Unit {
    return 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

함수가 리턴될 일이 없을 경우

unit은 아무런 값도 리턴을 하지 않는다는 의미였다. 즉 리턴의 대상이 없을 뿐이지 리턴이라는 행위 자체를 하지 않는 다는 의미는 아니였다. 반면 Nothing은 리턴이라는 행위 자체를 하지 않는다는 의미다.

fun infiniteLoop(): Nothing {
    while (true) {
        println("Hi there!")
    }
}

무한루프이기 때문에 함수가 리턴될 일이 없기 때문에 Nothing을 쓰기에 적절하다.

 

nothing타입은 모든 타입의 서브타입이다.

val nullableValue: String? = null
val value: Int = nullableValue?.toInt() ?: return

return의 타입은 Nothing 이다.

코틀린에서 Any는 모든 타입의 조상이다. 코틀린에서 Nothing은 모든 타입의 자식이다. Nothing은 내가 새로 만든 클래스의 자식이기도 한다.

제네릭에서 Nothing 타입

in 어노테이션을 이용하여 어떤 제네릭 타입도 받을 수 있게 할 수 있다.

class MyClass<T>

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

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

'코틀린' 카테고리의 다른 글

코루틴 상태는 한 방향으로 이동  (0) 2020.12.21
코루틴 1탄  (0) 2020.12.08
코틀린에서 Sequence와 SAM  (0) 2020.04.14
Nothing 타입  (0) 2020.03.15
멤버 함수의 중위 표기법 (Infix Notation)  (0) 2020.02.16