본문 바로가기
코틀린

코틀린(15) - 다형성

by 왈레 2022. 3. 23.

다형성

다형성이란 쉽게 얘기해서 콜라를 '콜라 자체'로도 있지만 '음료라는 특성'으로도 있도록 만드는 것이 다형성의 개념이다.

class Drink{…}
class Cola : Drink() {…}

 

var a: Drink = Cola( ) // 음료(Drink) 담는 변수에 저장하면 '음료의 기능만 사용'하게되고, ( Cola 인스턴스를 생성했지만, Cola 메소드와 속성은 사용할 없고, Drink 메소드와 속성만 사용할 있다. ★★★참고로 클래스 모두 drink( )라는 함수가 정의되어있고, Cola클래스에의 drink( ) override 상태라면 a.drink( )구문을 실행했을때 비록 "음료(drink) 기능만 사용"한다 했지만, override Cola 메소드 drink함수를 실행하게 된다.)

 

var b:Cola = Cola( ) // 콜라를 담는 변수에 저장하면 '음료의 기능을 포함하여 콜라의 기능까지' 모두 사용할 있다.( Drink Cola 모든 메소드와 속성을 사용할 있다.)

// *변수의 자료형을 Cola 할땐 타입추론 기능으로 Cola 자료형은 생략가능 ex) var b: = Cola( )

 

Cola 인스턴스를 자료형이 Drink 변수에 저장하게 하위 자료형이 상위 자료형인 수퍼클래스로 변환한다고 하여 Up-Casting이라고 업캐스팅된 인스턴스를 다시 하위 자료형으로 변환하면 Down-Casting이라 부른다.

 

업캐스팅은 그냥 상위자료형에 담는것으로 동작하지만,

다운캐스팅은 '별도의 연산자' 필요한데, 바로 'as' 'is' 연산자이다.

 

as

'as' 변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자로 코드내에서 사용할 즉시 자료형을 변환(즉시 다운캐스팅)해주며 변환된 자료형을 반환 해주는 연산자이다.

var a : Drink = Cola()
var b : a as Cola // Cola자료형으로 변환된 결과를 반환받아 변수에 대입!

 

is

'is' 변수가 자료형에 호환되는지를 먼저 '체크한 변환'해주는 '캐스팅 연산자'

조건문 내에서 사용되는 특징 있다.

var a : Drink = Cola( )
if(a is Cola){
	// 이 안에서만 a가 cola가 된다. 빠져나오면 a는 다시 Drink가 된다
}
fun main(){
    var a = Drink()
    a.drink()

    var b:Drink= Cola()

    b.drink()

    if(b is Cola){
        b.washDishes()
    }

    var c = b as Cola

    c.washDishes()
    c.washDishes() // 에러! 이유는 b is Cola { 이 구문을 빠져나가면 Drink가 되기때문}
}

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}로 설거지를 합니다.")
    }
}

 

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

 

다형성을 활용하면 기능을 묶어서 관리하기가 편하다.

호환성을 유지하면서 기능확장도 가능하고, 서브클래스에서 생성한 객체들은 수퍼클래스를 담는 변수나 리스트등에도 담을 있다.

다만 너무 다형성에 집착해서 무조건 서브클래스로 나누려고 노력하지는 마시고요. 설계에 따라 적절히 사용하시는것이 중요하다.

 

 

 

 

 

 

댓글