[Kotlin] by 키워드의 역할 알아보기

HEETAE HEO·2022년 6월 27일
0
post-thumbnail

by 키워드

개발하다 보면 하위 클래스가 상위 클래스를 상속해서 상위 클래스 메소드를 오버라이드를 하는 경우가 많습니다.

이러한 상황에서 유지보수를 하다보면 상위 클래스가 변경이 되는 경우 하위 클래스가 상위 클래스에 의존하고 있던 상황이 변경되면서 예기치 않은 오류가 발생합니다.

그래서 코틀린에서는 기본적으로 클래스는 final입니다.
상속 가능한 클래스는 open을 해서 상속이 가능하다는 것을 알려줍니다. 상위 클래스 변경 시 하위 클래스에 영향을 줄 수 있다는 것을 인지시켜 줄 수 있습니다.

by 키워드를 이해하기 위해서는 Delegate Patter을 이해하는 것이 중요합니다.

Delegate Pattern

디자인 패턴에서 Delegate Pattern은 어떤 기능을 자신이 처리하지 않고 다른 객체에 위임을 시켜 그 객체가 일을 처리하도록 하는 것입니다. Delegate Pattern을 설명할 때, 상속(Inheritance)과 구성(Composition)에 대해서 이야기를 합니다.

상속 : 클래스의 변수와 메서드를 모두 받기 때문에 재구현할 필요가 없어서 편리하다는 장점이 있지만 객체의 유연성이 떨어진다는 단점이 있습니다.

그렇기에 사용하는 방법이 구성(Composition)

구성 : 클래스가 다른 클래스의 객체를 멤버 데이터로 포함하는 기능입니다. 예를 들어 A 클래스는 B클래스의 개체를 멤버로 포함할 수 있습니다. 여기서 B에 정의된 모든 공개 메서드(또는 함수)는 클래스 A내에서 실행될 수 있습니다.

상속과 구성의 차이점

두 가지 모두 OOP 개념이지만 프로그래머가 달성할 수 있는 방식은 상당히 다릅니다. 상속은 클래스가 클래스를 확장하여 클래스와 속성 및 동작을 상속하는 기능이며, 구성은 클래스가 다른 클래스의 객체를 멤버 데이터로 포함하는 기능입니다.

클래스가 확장되면 모든 공용 및 보호 된 속성/ 동작을 상속하며 하위 클래스가 해당 동작을 재정의 할 수 있습니다. 그러나 클래스가 다른 클래스에 포함된 경우 컨테이너는 포함된 동작을 변경하거나 추가할 수 있습니다. 상속은 OOP에서 "is-a" 구성은 "has-a" 관계를 나타냅니다.

Delegate Pattern 예제

// Iwindow라는 인터페이스가 구현되어 있고
interface IWindow {
    fun getWidth() : Int
    fun getHeight() : Int
}

// 인터페이스를 구현한 TransparnetWindow가 있습니다.
open class TransparentWindow : IWindow {
    override fun getWidth(): Int {
        return 100
    }

    override fun getHeight() : Int{
        return 150
    }
}

Delegate Pattern을 구현하기 위해 모든 메서드에 대해서 
mWindow이 갖고이쓴 메서드를 호출함으로써 기능을 
위임시키게 됩니다. 

class UI(window: IWindow) : IWindow {
    val mWindow: IWindow = window

    override fun getWidth(): Int {
        return mWindow.getWidth()
    }

    override fun getHeight(): Int {
        return mWindow.getHeight()
    }
}

by 키워드의 역할

따라서 코틀린에서는 Delegate Pattern 구현 시 이러한 보일러 플레이트 코드들을 줄이기 위해서 by 키워드를 제공하게 됩니다. 아래처럼 by 키워드 사용하게 되면, 컴파일러가 자동으로 Delegate Pattern 코드를 작성해주게 됩니다.

class UI(window: Iwindow) : IWindow by window{}

by 키워드를 사용하면 메서드들이 모두 구현되기 때문에 보일러플레이트를 작성해여하는 수고를 덜어준다.

reference

https://codechacha.com/ko/kotlin-deligation-using-by/

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글