이번 학습은 지난 학습에 이어
코틀린의 클래스에 대해 학습하겠습니다
지난 학습에 클래스의 생성과 초기화에 대해 알아보았는데요
모르신다면 아래의 링크로↓↓↓
2020/05/04 - [Android] - [Android] 코틀린(Kotlin) 클래스(Class) 생성과 초기화
이번에는 먼저 상속(inheritance)에 대해 알아보겠습니다
상속은 타입 간의 계층적인 관계를 정의하기 위해 사용할 수 있는 객체지향 원리로서
상속해 주는 클래스인 부모 클래스 혹은 슈퍼 클래스(superclass)와
슈퍼 클래스의 모든 속성과 함수를 공유하는 서브 클래스(subclass)가 있습니다
package com.ros.sandbox
open class Room(val name: String) {
protected open val dangerLevel = 5
fun description() = "Room: $name\r\n" + "Danger Level : $dangerLevel"
open fun load() = "No one came here"
}
open class TownSquare: Room("Town Square") {
override val dangerLevel: Int
get() = super.dangerLevel - 3
private val bellSound = "ding-dong"
final override fun load() = "All residents are welcome to participate!\r\n${ringBell()}"
private fun ringBell() = "The bell tower announces your arrival. $bellSound"
}
코틀린은 서브 클래스를 가질 수 있도록 하기 위해서는
슈퍼 클래스에 open 키워드를 사용하여야 하고
overriding 하기 위해서도 마찬가지입니다
만약 더 이상 오버라이딩하지 못하게 하려면 final 키워드를 사용합니다
fun printIsSourceOfBlessings(any: Any) {
val isSourceOfBlessings = if ( any is Player ) {
any.isBlessed
} else {
/* type casting */
(any as Room).name == "Fount of Blessings"
}
println("$any is a source of blessings: $isSourceOfBlessings")
}
fun main(args: Array<String>) {
val townSquare = TownSquare()
var className = when(townSquare) {
is TownSquare -> "TownSquare"
is Room -> "Room"
else -> throw IllegalArgumentException()
}
printIsSourceOfBlessings(townSquare)
}
위의 코드는 타입 검사와 타입 변환을 보여줍니다
is 를 이용해서 타입 검사를 하며
as 를 이용해서 타입 변환을 합니다
만약 as 로 변환될 수 없을 경우는 ClassCastException이 발생하고
변환될 수 없는 경우는 상속관계가 없을 경우입니다
지난 시간에 스마트 캐스팅(smart casting)을 언급했습니다
여기서 보면 Player 클래스이면 any.isBlessed를 실행하게되어있는데
isBlessed는 Player 클래스의 속성입니다
이 개념이 바로 스마트 캐스팅으로 if 분기를 통해
코틀린 컴파일러가 이미 any의 타입이 Player임을 알고
알아서 변환 후에 처리해줍니다
Any 클래스는 코틀린의 모든 null 불가능 클래스가 상속받는 클래스로서
null 불가능 클래스에 공통적으로 필요한 equals, hashCode, toString을 정의하고
확장된 속성과 함수도 가지고 있는데 쉽게 말해서 최상위 슈퍼 클래스입니다
이것으로 이번 학습을 마치겠습니다
그럼 이만-_-
'Android' 카테고리의 다른 글
[Android] 코틀린(Kotlin) sealed 클래스, 추상클래스, 인터페이스 (0) | 2020.05.08 |
---|---|
[Android] 코틀린(Kotlin) 다른 타입의 클래스(Class) (0) | 2020.05.04 |
[Android] 코틀린(Kotlin) 클래스(Class) 생성과 초기화 (0) | 2020.05.04 |
[Android] 코틀린(Kotlin) 컬렉션(Collection) (0) | 2020.04.28 |
[Android] 코틀린(Kotlin) 표준 라이브러리 함수(Standard Library Functions) (0) | 2020.04.26 |