Kotlin, 13. 상속

이도현·2023년 8월 10일
0

Kotlin 공부

목록 보기
13/20

Room 클래스

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())
}

서브 클래스 정의하기

oepn 키워드

  • 부모 클래스에서 사용
  • open class: 상속을 허용
  • open fun 오버라이드를 허용

상속 구문

class TownSqure : Room("Town Square")

load 함수 오버라이딩

  • 부모 클래스의 open 함수가 대상
  • 자식 클래스는 override 키워드 오버라이딩을 명시

  • 가시성
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: 클래스 상속 구조에서 자식 클래스 내부에서 부모 클래스의 멤버에 접근하려 할 때 사용

final

  • 더 이상 오버라이드를 못하게 함

타입 검사

room = Room()
room is not TownSquare

townSqure = TownSqure()
townSqure is Room

상속 계층

  • 코틀린 모든 클래스의 최상위 클래스 -> Any
  • 자식 클래스 타입은 부모 클래스 타입으로 항상 변환 가능
  • 부모 클래스 타입은 자식 클래스 타입으로 변환을 보장하지 못함
    - 실제 인스턴스가 해당 자식 클래스 타입일 경우에만 변환 가능
    • 변환 전 검사 필요
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 타입을 사용하는 코드는 변경할 필요 없이 해당 타입을 처리할 수 있습니다. 이로써 코드의 유지보수와 확장성이 향상됩니다.
profile
좋은 지식 나누어요

0개의 댓글