728x90
반응형
Drink 클래스와 이를 상속받은 Cola 클래스가 있다면 Cola의 인스턴스를 만들 때는 Drink의 내용을 담는 공간에 Cola의 내용을 담는 공간이 추가되어 생성된다.
var a: Drink = Cola()
Drink를 담는 변수에 저장하면 Drink의 기능만 사용하게 된다.
→ Up-Casting : 상위 자료형인 수퍼클래스로 변환
var b: Cola = Cola()
*타입추론 기능으로 Cola 자료형은 생략 가능
Cola를 담는 변수에 저장하면 Cola의 기능까지 모두 사용할 수 있다.
Down-Casting: Up-Casting된 인스턴스를 다시 하위 자료형으로 변환
다운캐스팅은 별도의 연산자 필요
- as : 변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자
var a: Drink = Cola()
a as Cola // 이후에는 a가 Cola로 동작
var b = a as Cola // Cola로 변환한 결과를 반환받아 변수에 넣을 수도 있음
- is : 변수가 자료형에 호환되는지를 먼저 체크한 후 변환해주는 캐스팅 연산자. 조건문 안에서 사용된다.
var a: Drink = Cola()
if(a is Cola) // a가 Cola와 호환되는지 여부 확인
{
// 이 안에서만 a가 Cola가 됨
}
<예시>
fun main(){
var a = Drink()
a.drink() // 음료를 마십니다
var b: Drink = Cola()
b.drink() // 음료중에 콜라를 마십니다
b.washDishes() // Error: Unresolved references
if(b is Cola){
b.washDishes() // 콜라로 설거지를 합니다
}
var c = b as Cola
c.washDishes() // 콜라로 설거지를 합니다
b.washDishes() // 콜라로 설거지를 합니다
// as를 사용하면 반환값 뿐만 아니라 변수 자체도 다운캐스팅됨
}
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}로 설거지를 합니다")
}
}
728x90
반응형
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 컬렉션(1) 리스트 (0) | 2023.09.18 |
---|---|
[Kotlin] 제너릭 (0) | 2023.09.17 |
[Kotlin] 익명객체와 옵저버 패턴 (0) | 2023.09.09 |
[Kotlin] 오브젝트 (0) | 2023.09.09 |
[Kotlin] 스코프 함수 (0) | 2023.09.07 |