Kotlin Any Type
Any Type
- Kotlin은 모든 클래스가 직접 혹은 간접적으로 Any 클래스를 상속받는다.
- 따라서 모든 객체의 주소 값은 Any 타입 참조 변수에 담을 수 있다.
- Any 타입과 is 연산자를 활용하여 다양한 타입의 객체에 대응할 수 있는 코드를 만들 수 있다.
Any
코틀린에서 any는 모든 타입의 상위 타입(슈퍼 타입)이며, 모든 클래스의 공통 조상입니다. 즉, 모든 코틀린 클래스의 인스턴스를 저장할 수 있는 공통의 타입을 말합니다.
Any는 자바의 Object와 유사한 역할을 합니다. 코틀린의 클래스들은 기본적으로 Any 클래스를 상속받기 때문에, 모든 클래스의 인스턴스는 Any 타입으로 취급될 수 있습니다.
fun main() {
val obj1:SubClass1 = SubClass1()
val obj2:SubClass2 = SubClass2()
anyMethod(obj1)
anyMethod(obj2)
anyMethod(100)
anyMethod("문자열")
}
open class SuperClass1
interface Inter1
class SubClass1: SuperClass1() {
fun subMethod1() {
println("SubClass1의 subMethod1입니다")
}
}
class SubClass2: Inter1 {
fun subMethod2() {
println("SubClass2의 subMethod1입니다")
}
}
fun anyMethod(obj : Any){
println(obj.javaClass)
if ( obj is SubClass1 ) {
obj.subMethod1()
} else if ( obj is SubClass2 ) {
obj.subMethod2()
} else if ( obj is Int ) {
println("정수입니다.")
} else if ( obj is String ) {
println("문자열입니다.")
}
}
결과값 >
class SubClass1
SubClass1의 subMethod1입니다
class SubClass2
SubClass2의 subMethod1입니다
class java.lang.Integer
정수입니다.
class java.lang.String
문자열입니다.
anyMethod
anyMethod 함수에서 주어진 객체를 검사하여 해당하는 타입에 따라 다른 동작을 수행합니다.
- obj1은 SubClass1의 인스턴스이므로, obj.subMethod1()이 호출되어 "SubClass1의 subMethod1입니다"라는 메시지가 출력됩니다.
- obj2는 SubClass2의 인스턴스이므로, obj.subMethod2()가 호출되어 "SubClass2의 subMethod2입니다"라는 메시지가 출력됩니다.
- 100은 Int 타입이므로, "정수입니다."라는 메시지가 출력됩니다.
- "문자열"은 String 타입이므로, "문자열입니다."라는 메시지가 출력됩니다.
스마트 캐스팅
fun anyMethod(obj : Any){
println(obj.javaClass)
obj.subMethod1() // 에러 발생
if ( obj is SubClass1 ) {
obj.subMethod1()
} else if ( obj is SubClass2 ) {
obj.subMethod2()
} else if ( obj is Int ) {
println("정수입니다.")
} else if ( obj is String ) {
println("문자열입니다.")
}
}
Kotlin: Unresolved reference: subMethod1
위 anyMethod 내부에 obj.subMethod1을 is 연산자 조건문 밖에서 호출하게 될 경우, obj 인스턴스는 어떤 클래스의 인스턴스 인지 확인 할 수 없으므로, 해당 subMethod1 을 찾을 수 없다는 오류 메시지가 발생하게 된다.
하지만, is 연산자 조건문 안에서는 obj.subMehtod1()을 호출할 수 있게되며, 이는 자동으로 스마트 캐스팅이 일어나서, obj 가 SubClass1 객체 타입의 인스턴스로 자동 형변환이 되어서 가능하다.
주의할 점
주의할 점은 Any는 기본 데이터 타입 (Int, Boolean, Double 등)을 포함하여 모든 클래스의 인스턴스를 허용하지만, 기본 데이터 타입은 객체가 아니기 때문에 일반 클래스와 같은 방식으로 다루지 않습니다. 따라서 Any로 기본 데이터 타입을 저장하면 해당 값들은 자동으로 박싱(boxing)되어 참조 타입으로 변환됩니다.
Any 타입은 어떤 타입이든 받아들일 수 있으므로, 여러 타입을 다루는 일반적인 상황에서 유용하게 사용될 수 있습니다. 그러나 사용시 타입 캐스팅 등을 유의해야 하며, 가급적 구체적인 타입으로 대체하여 사용하는 것이 좋습니다.
댓글
댓글 쓰기