컴퓨터 언어/코틀린

[Kotlin] 코틀린 다형성의 개념과 사용방법 is, as 연산자

훈츠 2020. 2. 16. 13:14
반응형

안녕하세요. 훈츠 입니다. 오늘은 다형성의 개념과 Downcasting 할때 사용되는 is와 as 연산자에 대해 알아보도록 하겠습니다. 

다형성 (Polymorphism)

클래스를 상속하다보면 하위 클래스에서 상위 클래스와 똑같은 이름의 프로퍼티나 메서드를 지정 할일이 생깁니다. 하위 클래스에서 이름은 같지만 호출 매개변수가 다르거나 전혀 다른 동작의 메서드를 정의할 필요가 있습니다. 이렇게 이름은 같지만 매개변수가 다르거나 다른 동작을 하도록 하는것을 다형성(Polymorphism) 이라고 합니다. 

다형성에 대해 클래스로 예를 들어 보겠습니다. 

  • Class Animal : super class
  • Class Tiger : sub class (eat 함수를 override 하고, tiger 클래스만의 shout함수를 만들었습니다.)
open class  Animal(var name:String, var type:String){
    open fun eat(){
        println("저는 ${type}이고, 이름은 ${name} 이며, 음식을 먹습니다.")
    }
}

//animal 클래스를 상속 받아 tiger 클래스를 만들었습니다.
class Tiger(name:String): Animal( name,"호랑이"){
    override fun eat() {
        println("저는 ${type}이고, 이름은 ${name} 이며,고기를 먹습니다.")
    }
    fun shout(){
        println("어흥어흥")
    }
}
fun main() {
    var a : Animal = Animal("사랑이","동물")
    var b : Tiger = Tiger("호랭이")
    var c : Animal = Tiger("호랑말코")
    b.shout()
    c.eat()
    //c.shout()//호출할수 없습니다.
    if(c is Tiger){
        c.shout()
    }
    //c.shout()//shout 함수를 호출 할수 없습니다.
    c as Tiger
    c.shout()
}

//출력화면 
어흥어흥
저는 호랑이이고, 이름은 호랑말코 이며,고기를 먹습니다.
어흥어흥
어흥어흥
    
타이거 인스턴스는 당연히, shout함수를 이용 할수 있습니다. 하지만 Animal 클래스 타입에 Tiger를 넣은 c는 shout함수를 이용하려면 is 혹은 as 키워드를 이용하여, 'DownCasting' 해야만 Tiger 클래스의 shout 함수를 이용할수 있습니다. is 함수는 if문 안에서만 shout 함수를 이용 할수 있지만, as 키워드를 이용하면 DownCasting이 완전히 이루어져, 계속 shout 함수를 이용할수 있습니다. 

 

 

타입 캐스팅 

  • 상속받은 하위클래스에서 상위 클래스로 변경하는것을 업캐스팅 이라고 합니다. 
  • 다시 업캐스팅된 자료형을 하위 클래스로 변경하는것을 다운 캐스팅 이라고 합니다.
  • 이때 다운 캐스팅 할때 필요한 키워드는 as 와 is 가 있습니다. 

is 연산자 

  •  if (a is Tiger) { " 이 문 안에서 tiger 로서 동작 "} 빠져나가면 다시 Animal class로 동작

 as 연산자

  •  a as Tiger 다음 구문 부터 Tiger class로 동작

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

반응형