반응형
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 위임 프로퍼티 구현
- 어떤 객체의 프로퍼티가 바뀔 때마다 리스너에게 변경 통지를 보내기
반응형
'Languages' 카테고리의 다른 글
kotlin의 inline 함수 (고차함수, synchronized) (0) | 2020.05.26 |
---|---|
kotlin의 고차함수 (lambda) (0) | 2020.05.26 |
kotlin 의 비교 연산자 오버로딩 (equals, compareTo) (0) | 2020.05.18 |
kotlin 산술 연산자 오버로딩 (+, - *) (0) | 2020.05.18 |
kotlin의 null 가능성과 collection (0) | 2020.05.07 |