참조형에서의 형 변환
참조형은 기본형을 제외한 자료형 (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 |