Kotlin 코틀린 Any와 Any?는 무엇이 다른가. 차이 설명 및 예제

자바의 최상위 클래스는 Object 클래스입니다.

코틀린 에서는 Any가 됩니다.

코틀린에서 자바의 함수를 사용 하는경우, 코틀린에서 자바로 전달한 파라미터나 돌려받은 반환값은 Object 타입이지만 코틀린에서는 Any가 됩니다.

단순히 이름만이 Object에서 Any로 바뀐 것이 아닙니다.

코틀린에서도 자바의 Object를 사용할 수 있습니다.

코틀린에서는 Object는 최상위 클래스가 아니지만, Any는 Object의 슈퍼 클래스입니다.

Any는 왜 필요한 것일까요?

자바에서는 primitive 타입을 Object에 대입하려면 우선 Integer처럼 Reference 타입으로 변형해줘야 합니다.

하지만 코틀린은 Int 등은 클래스로서 취급하기 때문에 Int와 Any의 서브 타입이 됩니다.

즉 Int 클래스의 인스턴스를 그대로 Any 타입 변수에 대입할 수 있는 것입니다.

// Kotlin
val a: Int = 42
val b: Any = a
// Int의 인스턴스인가 체크
if (b is Int) { 
	//b 를 Int 타입으로 사용
	println(b + 1) // 43
}

 

하지만 코틀린에는 Any에 대입할 수 없는 값이 있습니다.

바로 null입니다.

즉 Any는 Int? 처럼 Nullable Type은 대입할 수 없습니다.

코틀린에는 모든 값을 저장할 수 있는 최상위 오브젝트로 Any?가 존재합니다.

                [Any?]
                   |
        +—————+
        |                    |
     [Any]     [모든 Nullable]
        |
[모든 Non-null]

 

Any와 Any?의 차이는 Null 값을 대입할 수 있는지 없는지로만 보입니다.

하지만 제네릭 타입을 사용할 경우는 주의해야 합니다.

// Kotlin
// Nullable Type 도 대입
fun <T> id(x: T?): T? {
	return x
}

 

위 예제에서는 T?를 사용하고 있지만 ?는 필요 없습니다.

T는 Nullable Type를 대입가능하기 때문입니다.

// Kotlin
// T를 사용해도 Nullable Type 값을 대입 가능
fun <T> id(x: T): T {
	return x
}

 

만약 Non-null Type 값을 반환하고 싶지 않은 경우에는 다음과 같이 작성할 수 있습니다.

// Kotlin
// Nullable Type 반환 하지 않음
fun <T: Any> id(x: T): T {
	return x
}

 

Any와 Any?는 Null 값을 대입할 수 있는지 없는지의 차이를 가지고 있기는 하지만 T 타입을 사용할 때만큼은 주의해서 사용을 해야 하겠습니다.

댓글