스물일곱 번째, 위임입니다.
위임 패턴은 구현 상속의 좋은 대안이라는 것이 입증돼 왔습니다. Kotlin은 이를 위한 기본적인 코드(bolierplate code) 없이 언어 차원에서 위임을 지원합니다.
클래스 Derived는 인터페이스 Base의 모든 public 멤버를 특정 객체에게 위임하는 방식으로 구현할 수 있습니다.
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
fun main() {
val b = BaseImpl(10)
Derived(b).print()
}
/* 결과
10
*/
Derived의 수퍼 타입 목록 부분의 by 절은 b가 Derived 객체에 내부적으로 저장될 것이고, 컴파일러가 b를 향하는 Base의 모든 메소드를 생성할 것이라는 것을 나타냅니다.
위임으로 구현되는 인터페이스 멤버 오버라이딩
위임과 관련한 오버라이딩은 예상대로 동작합니다. 즉, 컴파일러는 위임 받은 객체의 구현 대신 오버라이딩 구현을 사용합니다. override fun printMessage() { print("abc") }를 Derived에 추가하면, 프로그램은 printMessage()가 호출 됐을 때 10 대신 abc를 출력할 것입니다.
interface Base {
fun printMessage()
fun printMessageLine()
}
class BaseImpl(val x: Int) : Base {
override fun printMessage() { print(x) }
override fun printMessageLine() { println(x) }
}
class Derived(b: Base) : Base by b {
override fun printMessage() { print("abc") }
}
fun main() {
val b = BaseImpl(10)
Derived(b).printMessage()
Derived(b).printMessageLine()
}
/*
결과
abc10
*/
오버라이딩된 멤버는 위임된 객체의 멤버에서 접근하지 못한다는 점을 기억해야 합니다. 오버라이딩된 멤버는 인터페이스 멤버의 구현 자체에서만 접근 가능합니다.
interface Base {
val message: String
fun print()
}
class BaseImpl(val x: Int) : Base {
override val message = "BaseImpl: x = $x"
override fun print() { println(message) }
}
class Derived(b: Base) : Base by b {
// 이 프로퍼티는 b의 print 구현에서 접근되지 않습니다.
override val message = "Message of Derived"
}
fun main() {
val b = BaseImpl(10)
val derived = Derived(b)
// 위임 객체의 print()가 호출됩니다.
// 위임 객체(BaseImpl의 인스턴스)의 print는 Derived에서 오버라이딩한 message를 접근하지 않습니다.
// 그러므로, BaseImpl: x = 10이 출력됩니다.
derived.print()
println(derived.message)
}
/* 결과
BaseImpl: x = 10
Message of Derived
*/
프로퍼티 위임과 관련해서는 여기를 참고하세요.
'Kotlin' 카테고리의 다른 글
공식 문서로 배우는 코틀린 - 29. Type aliases (0) | 2024.03.13 |
---|---|
공식 문서로 배우는 코틀린 - 28. Delegated properties (0) | 2024.03.12 |
공식 문서로 배우는 코틀린 - 26. Object expressions and declarations (0) | 2024.03.12 |
공식 문서로 배우는 코틀린 - 25. Inline value classes (0) | 2024.03.11 |
공식 문서로 배우는 코틀린 - 24. Enum classes (0) | 2024.03.11 |