코틀린 클래스 위임

danbi lee·2024년 10월 24일

대규모 객체 지향 시스템에서 구현 상속은 코드의 결합도를 높이고 유연성을 떨어뜨릴 수 있는 문제를 야기할 수 있다. 특히 상속 구조가 깊어질수록 유지보수가 어려워지고 시스템이 취약해지기 쉽다.

코틀린은 이러한 문제를 방지하기 위해 모든 클래스를 기본적으로 final로 취급하여 상속을 막는다. 만약 상속이 필요할 경우, open 변경자를 사용하여 상속을 명시적으로 허용해야 한다.

하지만, 상속이 허용되지 않은 클래스에 새로운 동작을 추가해야 할 경우 코틀린에서는 데코레이터 패턴클래스 위임을 사용하여 문제를 해결할 수 있습니다.

데코레이터 패턴

기존 클래스의 기능을 확장하면서도 상속을 사용하지 않고 새로운 기능을 추가하는 방법.

  1. 기존 클래스와 동일한 인터페이스를 구현하는 새로운 클래스를 생성한다 => 클래스 데코레이터
  2. 기존 클래스의 인스턴스를 데코레이터 클래스의 내부 필드로 유지한다. 이를 통해 데코레이터는 기존 클래스의 기능을 재사용할 수 있다.
  3. 새로운 기능을 추가하면서도, 기존 클래스의 기능은 위임을 통해 그대로 사용할 수 있다.

코틀린의 클래스 위임

코틀린에서는 by 키워드를 사용하여 인터페이스의 구현을 다른 객체에 위임할 수 있다. 이렇게 하면 해당 인터페이스의 모든 메서드 구현을 자동으로 위임 객체에 전달하며, 명시적으로 표현할 수 있어 코드가 간결해진다.

class DelegatingCollection<T>(
    innerList: Collection<T> = ArrayList()
) : Collection<T> by innerList // by 키워드를 통해 Collection<T>의 구현을 innerList에 위임

fun main() {
    val myCollection = DelegatingCollection(listOf(1, 2, 3))  // 리스트를 전달
    println(myCollection.size)  // 출력: 3
    println(myCollection.contains(2))  // 출력: true
}
profile
계속해서 보완중

0개의 댓글