class Room(val name: String) {
fun description() = "Room: $name"
fun load() = "아무도 여기에 오지 않았습니다."
}
fun main(args: Array<String>) {
var currentRoom = Room("Foyer")
println(currentRoom.description())
println(currentRoom.load())
}
class TownSqure : Room("Town Square")
open class Room(val name: String) {
protected open val dangerLevel = 5
fun description() = "Room: $name\r\n" +
"위험 수준: $dangerLevel"
open fun load() = "아무도 여기에 오지 않았습니다."
}
class TownSquare : Room("Town Square") {
override val dangerLevel = super.dangerLevel - 3
private val bellSound = "댕댕"
override fun load() = "당신의 참여를 주민들이 다 함께 환경합니다!\r\n" +
ringBell()
private fun ringBell() = "당신의 도착을 종탑에서 알림니다. $bellSound"
}
super: 클래스 상속 구조에서 자식 클래스 내부에서 부모 클래스의 멤버에 접근하려 할 때 사용
room = Room()
room is not TownSquare
townSqure = TownSqure()
townSqure is Room
fun printIsSourceOfBlessings(any: Any) {
val isSourceOfBlessings = if(any is Player) {
any.isBlessed
} else {
(any as Room).name = "Fount of Blessings"
}
println("$any is a source of blessings: $isSourceOfBlessings")
}
as 는 any를 Room타입으로 캐스팅
any 의 장점
- 다양한 타입 처리: 특정 함수나 클래스가 여러 타입을 받아야 할 때 Any 타입을 사용하면 유연하게 다룰 수 있습니다.
- 범용 코드 작성: 범용 알고리즘 또는 유틸리티 함수를 작성할 때 Any 타입을 사용하면 모든 타입의 객체에 대해 동일한 로직을 적용할 수 있습니다.
- 타입 안정성 유지: 적절한 검사와 캐스팅을 통해 Any 타입을 사용하면 여전히 타입 안정성을 유지할 수 있으며, 이를 통해 런타임 오류를 방지할 수 있습니다.
- 코드의 확장성: 미래에 새로운 타입이 추가되더라도, 기존의 Any 타입을 사용하는 코드는 변경할 필요 없이 해당 타입을 처리할 수 있습니다. 이로써 코드의 유지보수와 확장성이 향상됩니다.