Languages

kotlin의 구조분해 선언과 component 함수

!쪼렙조햄 2020. 5. 18. 16:16
반응형

7.4 구조 분해 선언과 component 함수

val p = Point(10,20)
val (x, y) = p
print(x)
print(y)
  • 구조 분해를 사용하면 복합적인 값을 분해해서 여러 다른 변수를 한꺼번에 초기화 할 수 있다
  • 내부에서 구조 분해 선언은 또 관례를 이용한다
// 외부 사용시
val (x, y) = p
// 내부에서는
val x = p.component1()
val y = p.component2()
  • 내부 구조분해 선언
    • data 클래스의 주 생성자에 들어있는 프로퍼티에 대해서 자동으로 component 함수를 만들어준다
    • 여러 값을 한꺼번에 반환할때, 모든 값이 들어갈 데이터 클래스를 정의하고 함수의 반환 타입을 그 데이터 클래스로 바꾼다
  • 배열, 컬렉션에도 componentN 함수가 있다
    • 코틀린 표준 라이브러리에서는 맨 앞의 다섯 원소에 대한 componentN을 제공한다
  • 표준 라이브러리의 Pair나 Triple 클래스를 사용하면 함수에서 여러 값을 더 간단하게 반환할 수 있다?
    • Pair, Triple은 그 안에 담겨있는 원소의 의미를 말해주지 않으므로 가독성이 떨어질 수 있지만, 직접 클래스를 작성할 필요가 없으므로 코드는 더 단순해진다
    • Pair, Triple

7.4.1 구조 분해 선언과 루프

  • 함수 본문 내의 선언 뿐만아니라 루프 안에서도 구조 분해 선언을 사용할 수 있다
fun printEntries(map: Map<String,String>){
    for((key, value) in map){
        println("$key -> $value")
    }
}

7.5 프로퍼티 접근자 로직 재활용 : 위임 프로퍼티

  • 위임 프로퍼티
    • 위임 프로퍼티를 사용하면 값을 뒷받침하는 필드에 단순히 저장하는 것보다 더 복잡한 방식으로 작동하는 프로퍼티를 쉽게 구현할 수 있다
    • 객체가 직접 작업을 수행하지 않고 다른 도우미 객체가 그 작업을 처리하게 맡기는 디자인 패턴

7.5.1 위임 프로퍼티 소개

class Foo{
    var p : Type by Delegate()
}
  • p 객체는 접근자 로직을 다른 객체에게 위임한다
    • Delegate 클래스의 인스턴스를 위임 객체로 사용한다
  • 컴파일러는 내부에서 Delegate라는 숨겨진 도우미 프로퍼티를 만든다
    • 이를 이용해서 인스턴스를 초기화한다
    • Delegate 클래스는 getValue, setValue 메소드를 제공해야 한다
class Delegate{
    operator fun getValue(...){...}
    operator fun setValue(..., value : Type){...}
}
class Foo{
    var p : Type by Delegate()
}
val foo = Foo()
val oldValue = foo.p
// foo.p 라는 프로퍼티 호출은 내부에서 delegate.getValue()를 호출한다
  • 코틀린 라이브러리는 프로퍼티 위임을 사용하여 프로퍼티 초기화를 지연시켜 줄 수 있다

7.5.2 위임 프로퍼티 사용 : by lazy()를 사용한 프로퍼티 초기화 지연

  • 지연 초기화
    • 객체의 일부분을 초기화 하지 않고 남겨뒀다가 실제로 그 부분의 값이 필요한 경우 초기화
class Person(val name : String){
    val emails by lazy{ loadEmails(this)}
}
  • person class에 email 값이 디비에서 불러오는데 오래 걸리는 경우, 이메일 프로퍼티의 값을 최초로 사용할 때 단 한번만 디비에서 가져오고 싶다면 by lazy() 사용

7.5.3 위임 프로퍼티 구현

  • 어떤 객체의 프로퍼티가 바뀔 때마다 리스너에게 변경 통지를 보내기
반응형