Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[Kotlin] 프로퍼티 위임 : 일반적인 프로퍼티 패턴을 구현하는 방법 본문

Java & Kotlin

[Kotlin] 프로퍼티 위임 : 일반적인 프로퍼티 패턴을 구현하는 방법

mangdo 2022. 3. 30. 16:07

  코틀린의 프로퍼티 위임(Delegation)을 이용하면 일반적인 프로퍼티 패턴들을 간단하게 사용할 수 있다. 대표적인 예시로 표준 라이브러리의 lazy(처음 사용하는 요청이 들어올 때 초기화하는 패턴), observable(변화가 있을 때 감지하는 패턴)와 의존성 주입, 데이터 바인딩 등에 활용될 수 있다. 일반적으로 이런 패턴들을 사용할 때 자바에서는 어노테이션들을 많이 활용해야 한다. 하지만 코틀린에서는 프로퍼티 위임을 사용해서 간단하고 type-safe하게 구현할 수 있다. 우선 프로퍼티 위임에 대해서 간단히 알아보고, 동작 원리, 어떻게 활용될 수 있는지에 대해서 차례대로 알아보자.


 

✏️  프로퍼티 위임(Delegation)

  프로퍼티 위임은 프로퍼티의 접근자(getter, setter) 구현을 다른 객체에게 맡길 수 있는 문법이다. 즉, 다른 객체의 메서드를 활용해서 프로퍼티의 접근자(getter, setter)를 만들 수 있다. 반복적으로 사용되는 프로퍼티 행위를 추출해서 재사용함으로써 코드를 간결하게 만들 수 있다.

  예를 들어서, Int 타입의 프로퍼티에 음수가 저장되는 것을 방지하는 Setter를 프로젝트 내에서 반복적으로 사용하고 싶을 수 있다. 이러한 요구사항을 가진 프로퍼티마다 Setter를 일일이 정의하는 것은 너무 번거로울 수 있다. 따라서 이러한 프로퍼티 행위를 추출하여 OnlyPositive라는 객체를 만들자. 이때 메서드 이름이 중요하다. Getter는 getValue, Setter는 setValue 함수를 사용해서 만들어야한다. 이후 프로퍼티 선언문 뒤에 "by 객체"를 적으면 해당 객체가 프로퍼티의 Getter, Setter를 대리 구현하게 된다. 

 

 

 

✏️  프로퍼티 위임의 동작방식

  프로퍼티 위임이 어떻게 동작하는지 이해하기 위해서는 by가 어떻게 컴파일되는지 코드를 보는 것이 가장 명확한 방법일 것 이다. 위의 코드는 다음과 비슷한 형태로 컴파일이 된다. (프로퍼티가 top-level에서 사용될 때에는 this 대신 null로 바뀐다.)

 

  코드에서 알 수 있는 것처럼 getValue와 setValue는 단순하게 값만 처리하게 바뀌는 것이 아니라, 컨텍스트(this)와 프로퍼티 레퍼런스의 경계도 같이 사용하는 형태로 바뀌게 된다 프로퍼티에 대한 레퍼런스는 이름, 어노테이션과 관련된 정보등을 얻을 때 사용된다. 그리고 컨텍스트는 함수가 어떤 위치에서 사용하되는지와 관련된 정보를 제공해준다. 이러한 정보로 인해서 getValue()와 setValue() 메서드가 여러개 있어도 컨텍스트를 활용함으로, 상황에 따라서 적절한 메서드가 선택된다. 객체를 프로퍼티에 위임하려면 val는 getValue 연산, var의 경우 getValue와 setValue연산이 필요하다.

  이러한 연산은 지금까지 살펴본 것처럼 멤버 함수로도 만들 수 있지만, 확장함수로도 만들 수 있다. 예를 들어 다음 코드는 코틀린의 stdlib안에 Map<>.getValue 확장 함수가 정의되어 있기 때문에 가능하다.

 

 

✏️  프로퍼티 위임의 활용 예시

다음은 코틀린의 stdlib에서 프로퍼티 델리게이트들이다. 범용적으로 사용되는 패턴들에 대한 프로퍼티 델리게이터임으로 알아두면 좋다.

- lazy

- Delgates.observable : 변화가 있을 때 감지

- Delgates.vetoable

- Delgates.notNull

  프로퍼티 델리게이트는 프로퍼티와 관련된 다양한 조작을 할 수 있으며, 컨텍스트와 관련된 대부분의 정보를 갖는다. 이러한 특징으로 인해서 다양한 프로퍼티의 동작을 추출해서 재사용할 수 있다. 표준 라이브러리의 lazy와 observable이 이에 대한 대표적 예시이다. 프로퍼티 위임은 프로퍼티 패턴을 추출하는 일반적인 방법으로 많이 사용되고 있다.

 

 

 

 

 

Reference :

이펙티브 코틀린(마르친 모스칼라 저)

초보자를 위한 코틀린 200제(엄민석 저)