Kotlin

[Kotlin] 다형성 as is

98kg 2024. 3. 15. 16:06
다형성 
클래스의 상속관계에서 오는 인스턴스 호환성을 적극 활용할 수 있는 기능으로 
수퍼클래스가 같은 인스턴스를 한번에 관리하거나 
인터페이스를 구현하여 사용하는 코드에서도 이용됨

 

 

up-casting

up-casting 은 하위 자료형을 상위 자료형에 담는다
ex ) var a: Drink = Cola()

 

 down-casting 

up-casting 된 인스턴스를 다시 하위자료형으로 변환하는 것을 down-casting 이라고 한다

하위 자료형은 as, is 연산자를 사용한다

-  as

 변수를 호환되는 자료형으로 변환해주고
 ex  ) a as Cola

이후로는 a 는 Cola 로 동작함

 var b = a as Cola Cola 

변환한 결과를 반환받아 변수에 넣을 수도 있음

- is
변수가 자료형의 호환되는지 먼저 체크한 후  변환 해주는 연산자로 조건문 내에서 사용됨
ex) var a: Drink = Cola()

if(a is Cola){
이 안에서만 a 가 Cola 가 됨
}

 

(예시코드)

 

fun main() {
 	var a = Drink()
    a.drink()
    
 	var b: Drink = Cola()
    b.drink() 
    //b.washDishes() //  drink 변수 이므로 cola 에 washDishes  함수를 호출할 수 없다
    if(b is Cola){
        b.washDishes()
    }
    
    var c = b as Cola
    c.washDishes()
     b.washDishes()
     
     // as 를 사용하면 반환 값 뿐만 아니라 변수 자체도 다운캐스팅이 되어 참조할 수 없다는 컴파일 에러가 뜨지 않는다.
}

open class Drink{
    var name = "음료"
    
    open fun drink(){
        println("${name}를 마십니다.")
    }
}

class Cola:Drink(){
    var type ="콜라"
    
    override fun drink(){
         println("${name} 중에 ${type}를 마십니다.")
    }
    
    fun washDishes(){
        println("${type}로 설거지를 함")
    }
}