코틀린

[Youtube DiMo] 18강. 다형성

iseohyun 2022. 4. 29.

목차

    [18강] https://youtu.be/dgcLsnJodu8

     

    1. 다형성

    객체의 생성문법을 아래와 같이 볼 때 :
    var a : A = A()
    생성요청 생성핸들 : 그릇 = 실제크기
    실제크기를 많이 만들어서, 그릇에 담을 수 있을 만큼만 담는 것은 문제가 안되는데,
    쥐꼬리 만큼 만들어서, 기대한 그릇에 담다가 마는 행위는 용납할 수 없습니다.
    아래 예시에서 마지막 구문은 에러가 나기 때문에 주석처리 하였습니다.
    fun main() {
       var a = A(1)
       a.whoAmI()
       
       var b = B(2)
       b.whoAmI()
       
       var c : A = B(3)
       c.whoAmI()
       
    //    var d : B = A(4)	// Error
    //    d.whoAmI()
    }
    
    open class A(var value : Int) {
        fun whoAmI(){
            var str = when(this){
                is B -> "B"
                is A -> "A"
                else -> "X"
            }
            println("$str : $value")
        }
    }
    
    class B(value : Int) : A(value) {
    }
    A : 1
    B : 2
    B : 3

     

     

    2. Downcasting (is와 as)

    단, 컴파일러의 판단 기준은 해당객체의 실제 사이즈보다 명시적으로 선언된 타입에 관계가 있으므로,
    선언된 타입안에서 함수(메서드)를 사용 할 수 있고,
    is 구문 안에서는 일시적으로 사용 가능
    as 구문 이후에는 영구적으로 사용이 가능합니다.
    fun main() {
        var c : A = B()
        c.original()	// 1
        // c.premium() // 에러 발생
        
    	if(c is B) {
    		c.premium()	//2
    	}
        
        var d = c as B
        c.premium()	// 3
        d.premium()	// 4
        
    }
    
    open class A() {
        fun original() { println("일반 기능") }
    }
    
    class B() : A() {
        fun premium() { println("확장 기능") }
    }
    일반 기능
    확장 기능
    확장 기능
    확장 기능

    댓글