본문 바로가기

kotlin

코틀린 : 참조형에서의 형 변환

참조형에서의 형 변환

 

참조형은 기본형을 제외한 자료형 (Boolean, Byte, Short, Int, Long, Float, Double, Char 제외)

 

1) 자동형 변환

=> 상위 클래스 타입의 변수에 하위 클래스 타입의 인스턴스를 대입하는 경우 

강제 형 변환 없이 가능

 

2) 강제 형 변환

=> as 연산자

상위 클래스 타입의 as 하위 클래스 타입의 변수

상위 클래스 타입의 변수를 하위 클래스 타입의 인스턴스 형태로 강제 형 변환 하는 것

 

이 때 상위 클래스 타입의 변수에 하위 클래스 타입의 인스턴스가 대입되어 있을 때만 가능 하다.

그 이외의 경우는 실행 할 때 예외가 발생한다.

 

Null 이 가능한 자료형 as Null 이 불가능한 자료형으로 변환

=> 데이터가 Null 이

 

as?

Null 이 가능한 자료형 as? Null 이 불가능한 자료형

 : 데이터가 null 이면 null을 반환 하고 null 이 아니면 형 변환을 수행한다.

 

3) 매개변수나 리턴 타입

=> 매개 변수가 어떤 클래스의 자료형으로 되어 있으면 이것의 의미는 클래스의 인스턴스 뿐아니라 그 클래스의 하위 클래스의 인스턴스를 대입해도 된다는 의미

 

View Class => Button, TextView

view 클래스에는 View 클래스의 하위 뷰로 추가 할 수 있는 addSubView(subView:View) 가 존재

 

 

=> 어떤 함수의 리턴 타입이 클래스로 되어 있으면 상황에 따라서는 하위 클래스로 형변환 해서 사용해야 할 수 도 있다

된다는 

된다는 

대입해도 

 

4) Polymorphism (다형성)

=> 클래스 타입의 변수는 변수를 선언 할 때 설정한 클래스의 멤버만 호출이 가능하다.

=> 오버라이딩 된 메소드는 변수를 선언할 때 사용한 클래스의 것이 호출되는 것이 아니고 대입한 인스턴스의 것이 호출 됩니다.

=> 이 기능을 이용해서 동일한 코드가 상황에 따라 다른 메소드를 호출 할 수 있도록 만들 수 있습니다. 이러한 특성 다형성이라고 합니다.

=> 객체지향의 이 특성 때문에 GUI 프로그램이 마우스나 터치를 사용할 수 있습니다.

class T {
   method1()
   open method2()
}

class V : T(){
   method3()
   overrid method2()
}


 

var t : T = V() // 하위 클래스의 인스턴스를 상위 클래스의 변수에 대입이 가능
t 는 method1 과 method2 만 호출 가능

method1을 호출하면 T 의 것이 호출
method2를 호출 하면 V의 것이 나온다.

t.method2() // V의 method2가 호출

t = T()
t.method2() // T의 method2가 호출

 

import java.sql.DriverManager.println
import kotlin.properties.Delegates


Class T{
    //name의 값이 변경되면 함수를 호출하도록 만드는 방법
    var name : String by Delegates.observable (initialValue: "noname",
    {props, old, new -> println("$props 가 변경됨")
      println("$old 에서 $new 로 변경 됨"


    })
}

open class Super {
    open fun method() {
        println("상위 클래스의 메소드")
    }
}
open class Sub : Super() {
    override fun method() {
        //상위 클래스의 메소드를 호출
        //super.method()
        println("하위 클래스의 메소드")
    }
}
    fun main(args :Array<String>){
        // 일반적인 인스턴스 생성 - 변수의 자료형과 생성자의 자료형을 일치
        var parent : Super = Super()
        val child : Sub = Sub()
        
        // 객체 지향에서는 상위클래스의 참조형 변수에 하위 클래스 인스턴스를 대입 할 수 있다.
        parent = child
        
        //반대로는 에러. 반대의 경우는 형 변환을 해야 한다
        // child = Super()
        
        //이 경우에는 대입된 인스턴스가 하위 클래스 타입이어야 에러가 안난다.
        child = parent as Sub //as 가 형 변환
        
        //child  = Super() as Sub //문법적으로는 에러 아님
        //실행하면 에러가 발생
        //Super() 는 Sub으로 형 변환이 안 된다.
        
        parent = Super()
        parent.method() //method는 overriding 되어 있기 때문에 
        // 인스턴스를 보고 메소드를 호출
        //Super 의 메소드 호출
        parent = Sub()
        parent.method() //Sub 의 메소드를 호출
        
    }

}

'kotlin' 카테고리의 다른 글

코틀린 : 추상화 개념 다잡기  (0) 2020.10.19
코틀린: 추상의 개념으로 간단한 게임 코딩  (0) 2020.10.15
코틀린 : 상속  (0) 2020.10.15
코틀린 : 메소드  (0) 2020.10.15
코틀린 : 프로퍼티  (0) 2020.10.15