코틀린 casting, is, as

Seongho·2021년 10월 30일
0

Kotlin

목록 보기
5/6

클래스를 구현할 때 캐스팅이라는 개념이 있다.

https://m.blog.naver.com/wnstn0154/221855117820

https://altongmon.tistory.com/601

0. 예시 코드

open class Drinks{
    var name :String = "음료수"
    open fun Drink(){
        println("${name}을 마십니다.")
    }    
}

class Cola : Drinks(){
    var type :String = "콜라"
    override fun Drink(){
        println("${name}${type}을 마십니다.")
    }
    fun Taste(){
        println("${type}향이 납니다.")
    }
}

1. up casting

업 캐스팅은 하위 클래스가 상위 클래스화 되는 것

위의 코드에서는 Cola 클래스가 Drinks 클래스가 되는 것을 말한다.

var A: Drinks = Cola()

이렇게 Drinks 타입이어야 하는 A 변수를 Cola 클래스를 이용하여 Cola 인스턴스로 만들어도 오류가 발생하지 않는다. Cola 클래스는 Drinks 클래스를 상속받아 Drinks의 함수를 재정의하고 있기 때문이다. (재정의 안해도 어쨋든 Drinks를 상속받아 Drinks의 함수를 모두 가지고 있어 문제 x)

2. down casting

다운 캐스팅은 상위 클래스가 하위 클래스화 되는 것

위의 코드에서는 Drinks 클래스가 Cola 클래스가 되는 것을 말한다.

var B: Cola = Drinks()

// error: type mismatch 발생

Cola 인스턴스가 가져야 할 Taste 함수를 Drinks() 로 만든 인스턴스는 당연히 가지고 있지 않으므로 오류가 발생한다. 또, Drink 함수도 Cola에서는 오버라이드하여 사용하고 있기 때문에 다르다.

3. is

is는 A is B 의 형태로 사용되며, A가 B와 호환되는지에 대한 정보를 반환한다.

자바에서는 instanceof 가 is의 역할을 한다고 함.

A instanceof B => A가 B의 인스턴스인가? => A 에서 B로의 형변환 가능 여부를 true나 false로 알려줌

var A = Drinks()
var B = Cola()

if (A is Cola) {...}

A가 Cola가 될 수 있으면 true를 반환하고 A는 Cola 타입이 되어 {...}에서 Cola의 property를 사용할 수 있게 된다.

is는 다음과 같이 사용하기도 한다.

val str = "str"

if (str is String) println("good")

if (str !is String) println("not good")
else println("good")
fun castMethod(a: Any) {
	if (a is String) {
        println(a.length) // a가 String 타입으로 자동 캐스팅
    }
}

4. as

as도 다운캐스팅을 할 때 사용할 수 있다. as로 지정한 타입으로 대상 값을 캐스트(변환) 하며, 해당 타입으로 바꿀 수 없으면 오류(ClassCastException)가 발생한다.

이때 as?를 사용하면, 오류 대신 null이 반환된다.

사진출처

data가 User가 될 수 있으면 (data is User == true) data가 User로 캐스팅되고,

그렇지 않으면 null을 반환..

0개의 댓글