240522_디모의 코틀린 강의 #18강. 클래스의 다형성

2024. 5. 22. 16:26TIL(Today I Learned)

유튜브 - 디모의 코틀린 문법 강의 정리

 

#18강. 클래스의 다형성

 

1. 다형성: 클래스의 상속에서, 수퍼클래스를 서브클래스로 / 서브클래스를 수퍼클래스로 인식할 수 있는 개념

 

2. 업캐스팅(Up-Casting): Cola 인스턴스를 Drink 변수에 담는 것

var a:Drink = Cola()

 

3. 다운캐스팅(Down-Casting): 업캐스팅된 인스턴스를 하위 자료형으로 변환하는 것

  - 다운캐스팅 시 별도의 연산자인 'as', 'is'가 필요함

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

var a:Drink = Cola() // 업캐스팅
a as Cola // 다운캐스팅과 동시에 자료형 변환

 

  - is: 변수가 자료형에 호환되는지 확인한 후 변환하는 캐스팅 연산자(조건문과 함께 사용)

var a:Drink = Cola() //업캐스팅
if (a is Cola){
...
}

 

fun main(){
	var a = Drink()
    a.drink() // 음료를 마십니다
    var b:Drink = Cola()
    b.drink() // 음료 중에 콜라를 마십니다 => b는 Drink 변수라서 이대로는 washDished 함수 호출 불가 => 다운캐스팅 필요
    
   if (b is Cola){  // is => 조건문 하에서 잠시 다운캐스팅
      b.washDishes() // 콜라로 설거지를 합니다
  }
  
  var c = b as Cola
  c.washDishes() // 콜라로 설거지를 합니다
}

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