• [이펙티브 코틀린] 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라

    2023. 4. 10.

    by. 하루플스토리

    반응형

    일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라

    • 프로퍼티 위임을 사용하면 일반적인 프로퍼티의 행위를 추출해서 재사용 할 수 있다.
    • 대표적인 예로 지연 프로퍼티가 있다. lazy는 이후에 처음 사용하는 요청이 들어올 때 초기화되는 프로퍼티다.
      • val value by lazy { createValue() }
    • 프로퍼티 위임으로 observable패턴을 쉽게 만들 수 있다.
    • 프로퍼티 위임 메커니즈으로 다양한 패턴을 만들 수 있다. 좋은 예로 뷰, 리소스 바인딩, 의존성 주입, 데이터 바인딩 등이 있다.
    • 일반적으로 이런 패턴을 사용할 때 자바 등에서는 어노테인션을 활용해야 하지만 코틀린은 프로퍼티 위임을 사용해 간단하고 type-safe하게 구현할 수 있다.
      • private val button: Button by bindView(R.id.button)
    • 코틀린 stdlib에서 다음의 프로퍼티 델리게이터를 알아두면 좋다.
      • lazy
      • Delegates.observable
      • Delegates.vetoable
      • Delegates.notNull
    • 프로퍼티 델리게이트는 프로퍼티와 관련된 다양한 조작을 할 수 있고, 컨텍스트와 관련된 대부분의 정보를 가진다.

     

    일반적인 알고리즘을 구현할 때 제네릭을 사용하라

    • 타입 아규먼트를 사용하는 함수 (타입 파라미터를 갖는 함수)를 제네릭 함수라고 부른다.
    • 대표적인 예로 filter 함수가 있다. filter는 타입 파라미터 T 를 갖는다.
    • 제네릭은 기본적으로 List<String> 또는 Set<User> 처럼 구체적인 타입으로 컬렉션을 만들 수 있게 클래스와 인터페이스에 도입된 기능이다. 컴파일 과정에서 최종적으로 이런 타입 정보는 사라지지만, 개발 중에는 특정 타입을 사용하게 강제할 수 있다.
    • 제네릭 제한 : 타입 파라미터의 중요한 기능 중 하나는 구체적인 타입의 서브타입만 사용하게 타입을 제한하는 것이다.

     

    타입 파라미터의 섀도잉을 피하라

    class Forest(val name: String) {

    fun addTree(name: String) {

    }

    }

    • 이 코드 처럼 프로퍼티와 파라미터가 같은 이름을 가질 수 있다. 이렇게 되면 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가린다. 이를 섀도잉 이라고 한다.
    • 섀도잉은 클래스 타입 파라미터와 함수 타입 파라미터 사이에서도 발생할 수 있다.
    • 이는 심각한 문제가 될 수 있고, 개발자가 스스로 문제를 찾아내기도 힘들다.
    • 만약 독립적인 파라미터를 의도한다면 이름을 아예 다르게 다는 것이 좋다.

     

    공통 모듈을 추출해서 여러 플랫폼에서 재사용하라

    • 기업이 한 플랫폼만을 대상으로 애플리케이션을 만드는 경우는 없다. 일반적으로 둘 이상의 플랫폼을 대상으로 하는 제품을 만들기 원한다.
    • 다른 플랫폼에 동일한 제품을 구현한다면 재사용 할 수 있는 부분이 많을 것이다. 따라서 소스코드를 공유할 수 있다면 큰 이득이 발생할 것이다.
    반응형

    댓글