[Kotlin] 클래스의 다형성(+as, is) 설명 & 예제

728x90

클래스의 다형성

음료수로 비유를 해보면 콜라를 콜라 자체로 볼 수도 있지만 기호에 따른 음료 라고 볼 수 도 있다. 콜라를 음료 특성으로 만드는 것이 다형성이라고 할 수 있다.

//Cola의 기능까지 모두 사용 가능
//타입 추론으로 Cola 자료형은 생략 가능
var b: Cola = Cola()

업 캐스팅(Up-Casting)

//Drink의 기능만 사용
//Up-Casting : 상위 자료형에 담는다
var a: Drink = Cola()

다운 캐스팅(Down-Casting)

업 캐스팅 된 것을 하위 자료형으로 변환 시키는 것

as

변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자

var a: Drink = Cola()

//이후로는 a는 cola로 작동, 반환도 가능
a as Cola
var b = a as Cola

is

변수가 자료형에 호환되는지를 먼저 체크한 후 변환 해주는 캐스팅 연산자
조건문 내에서 사용 되는 특징이 있음

var a: Drink = Cola()
if(a is Cola) {
    //이 안에서만 a가 Cola 가 됨
}

예제

fun main() {
    var a = Drink()
    a.drink()

    //Up-Casting
    //washdishes 함수 호출 불가
    var b: Drink = Cola()
    b.drink()

    //b가 Cola와 호환되는지 확인
    //Down-Casting
    if (b is Cola){
        //중괄호 안에서만 Cola 함수 사용 가능
        b.washDishes()
    }

    var c = b as Cola
    c.washDishes()
    //as 사용시 반환 뿐만아니라 + 변수 자체도 Down-Casting 되기 때문에 에러 뜨지 않는다
    b.washDishes()
}

//open : 상속  가능
open class Drink{
    var name = "음료"

    //함수앞 open : override 가능
    open fun drink(){
        println("${name}를 마십니다")
    }
}

class Cola: Drink(){
    var type = "콜라"

    override fun drink() {
        println("${name}중에 ${type}를 마십니다")
    }

    fun washDishes(){
        println("${type}로 설거지를 합니다")
    }
}


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

 

728x90

댓글

Designed by JB FACTORY