Kotlin as 연산자

Kotlin as 연산자

  • 객체를 지정된 클래스 타입으로 변환하는 연산자이다.
  • 참조 변수 as 클래스 타입
  • 만약 객체가 지정된 클래스타입과 관계가 없을 경우 오류가 발생한다.
  • 형 변환이 발생한 참조 변수는 변환된 타입을 유지한다.
as 연산자

여기서 변수는 형변환을 수행하려는 변수이고, 타입은 변수를 변환하려는 타입입니다. as 연산자를 사용하여 변수를 다른 타입으로 변환하면, 변수는 해당 타입으로 강제로 변환됩니다.

명시적 형변환

Kotlin에서 as 연산자는 명시적으로 변수의 타입을 변환하기 위해 사용됩니다. as 연산자를 사용하여 변수를 다른 타입으로 변환할 수 있습니다. 이는 명시적 형변환이라고도 합니다.
fun main() {
val obj1:SubClass1 = SubClass1()
val super1:SuperClass1 = obj1
    // SubClass1 으로 명시적 형변환을 하지 않으면 subMethod1 을 사용할 수 없다.
    // super1 as SubClass1 // 주석을 해제 하면 Error가 해결된다.
super1.subMethod1() // Error
}

open class SuperClass1

interface Inter1

class SubClass1 : SuperClass1() {
fun subMethod1() {
println("subMethod1")
}
}
class SubClass2 : Inter1
Kotlin: Unresolved reference: subMethod1

fun main() {
val obj1:SubClass1 = SubClass1()
val super1:SuperClass1 = obj1
super1 as Inter1 // Runtime Error
}

open class SuperClass1

interface Inter1

class SubClass1 : SuperClass1() {
fun subMethod1() {
println("subMethod1")
}
}
class SubClass2 : Inter1
Exception in thread "main" java.lang.ClassCastException: SubClass1 cannot be cast to Inter1

super1 객체 참조 변수는 SuperClass1 타입이고, SuperClass1은 Inter1 인터페이스와 아무런 연관 관계가 없기때문에 ClassCastException 이 발생한다. 해당 에러는 빌드 타임에서 오류가 발생하지 않고, RunTime 에서 발생한다.

이처럼 as 연산자를 사용할 때는 주의해야 합니다. 만약 형변환할 수 없는 타입으로 변환을 시도하면 ClassCastException이 발생할 수 있다. 이는 실행 시간에 타입을 검사하기 때문에 타입 불일치가 발생할 경우 예외가 발생합니다.

as? 연산자

as 연산자를 사용하여 형변환을 수행할 때는 항상 안전성을 고려해야 합니다. 형변환할 수 없는 경우 예외가 발생하지 않도록 하려면, as? 연산자를 사용할 수 있습니다. 
as? 연산자는 형변환에 실패하면 null을 반환합니다.

fun main() {
val obj1:SubClass1 = SubClass1()
val super1:SuperClass1 = obj1
super1 as? Inter1
}

open class SuperClass1

interface Inter1

class SubClass1 : SuperClass1() {
fun subMethod1() {
println("subMethod1")
}
}
class SubClass2 : Inter1

as? 을 사용할 경우 null 을 반환하므로, Runtime Error 가 발생하지 않는다.

댓글

이 블로그의 인기 게시물

Intel® HAXM installation failed 해결하기

Kotlin Interface

Kotlin this, super