코틀린 by 키워드

TRASALBY·2024년 3월 19일
0

학습내용 옮기기

목록 보기
1/8

그냥 쓰고 있었던 건데 by 키워드가 뭐지?..

private val args: RoutineEditorFragmentArgs by navArgs()
private val viewModel: RoutineEditorViewModel by viewModels()

코드를 구현하면서 by키워드를 사용해 변수를 선언한 적이 많다. 특히 뷰모델을 사용하게 되면서

by viewModels 를 사용해 뷰모델을 선언 했었다.

그런데 다시 코드를 읽다 보니 그래서 by가 무슨 역할을 하는거지? 라는 생각이 들어서 학습해 보기로 했다.

Delegate 패턴

디자인 패턴 중 Delegate 패턴이 있다. 코틀린의 by 키워드는 Delegate 패턴을 쉽게 구현할 수 있도록 도와주는 키워드 이다.

우선 Delegate패턴이 무엇인지 부터 확인해 보자.

Untitled

파파고에 따르면 delegate라는 단어의 뜻에는 ‘위임하다’라는 동사의 뜻이 담겨있다. 이것을 바탕으로 생각해 보면 어떠한 역할을 다른 쪽으로 위임, 떠넘기는 방식의 패턴일 것으로 생각된다.

객체 지향적으로 다시 풀어 보자면 한 객체에서 모든 일을 처리하는 것이 아니라 일부를 다른 객체에게 위임하는 방식의 패턴이라고 할 수 있다.

예제

interface IWindow {
    fun getWidth() : Int
    fun getHeight() : Int
}

open class TransparentWindow : IWindow {
    override fun getWidth(): Int {
        return 100
    }

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

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

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

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

위 코드를 보면 TransParentWindw와 UI 클래스 모두 IWindow 인터페이스를 상속 받고 있다.

UI는 내부에 mWindow값을 가지고 있고 getWidth를 오버라이드 하여 값을 구하고 있다.

이때 UI클래스는 길이를 구하는 역할을 내부의 mWindow에게 위임하여 값을 구하도록 구현 하고 있다. 이 구조에서 IWindow의 메소드가 많아지게 된다면 그만큼 UI에서 구현해야 할 오버라이드 함수도 늘어나게 될 것이다.

위의 클래스 들은 아래와 같이 사용될 수 있다.

fun main(args: Array<String>) {
    val window: IWindow = TransparentWindow()
    val ui = UI(window)
    System.out.println("Width : ${ui.getWidth()}, height: ${ui.getHeight()}")
}

UI클래스의 인자로 TransparentWindow를 넘겨 주어 ui.getWidth 가 실행되면 UI객체의 내부에 mWindow가 인자로 받은 TransparentWindow가 되어 길이를 구하는 역할을 대신 위임받아 진행하게 된다.

코틀린에서 by를 사용한 delegate 패턴 구현

interface IWindow {
    fun getWidth() : Int
    fun getHeight() : Int
}

open class TransparentWindow() : IWindow {
    override fun getWidth(): Int {
        return 100
    }

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

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

}

by를 사용하지 않은 구현에서는 불필요한 보일러 플레이트 코드들이 많이 있었는데 by를 사용하여 UI 클래스 내부의 불필요한 코드를 모두 제거할 수 있게 되었다. by를 사용해 컴파일러에서 자동으로 Delegate 패턴의 코드를 작헝해 주기 때문이다.

0개의 댓글