티스토리 뷰

반응형

우리가 필요로 할 때마다 수작업으로 구현할 수 있지만 일반적으로 한 번만 구현하고 라이브러리에 넣는 것이 좋을 것입니다. 예 :

  • 게으른 속성 : 첫 번째 액세스시에만 값이 계산됩니다.
  • 관찰 가능한 속성 : 리스너는이 속성에 대한 변경 사항에 대한 알림을받습니다.
  • 각 속성에 대한 별도의 필드 대신지도에 속성을 저장합니다.

이러한 (및 기타) 사례를 다루기 위해 Kotlin은 위임 된 속성을 지원 합니다 .

import kotlin.reflect.KProperty

fun main(args: Array<String>) {
	val ex = Example()
	ex.p = "홍길동" // setValue 호출
	println(ex.p) // getValue 호출
}

class Example {
	var p: String by Delegate()
}

class Delegate {
	operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
		return "getValue 호출"
	}
	operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
		println("setValue 호출")
	}
}

 

lazy (게으른)

  • val에서 만 사용 가능합니다.
  • 초기화는 첫 호출 시 한번 만 실행되며, 그 뒤로 get()에 기억 된 결과 만 반환합니다.
  • 기본적으로 동기화됩니다.  동기화가 필요하지 않고 여러 스레드가 동시에 실행하고 싶을 때는  LazyThreadSafetyMode.PUBLICATION 매개 변수로 lazy() 함수에 전달 하십시오. 초기화가 항상 단일 쓰레드에 일어날 경우 LazyThreadSafetyMode.NONE 쓰레드 안전 보장과 관련 오버 헤드를 발생 시키지 않는 모드를 사용할 수 있습니다.
val lazyValue: Int by lazy {
	var x = 1
	var y = 1
	x++;

	x + y
}

fun main(args: Array<String>) {
	println(lazyValue)
	println(lazyValue)
	println(lazyValue)
}
/*
  실행 결과
  3
  3
  3 
*/

 

Observable & Vetoable (관찰 & 거부권)

    Delegate.observable()을 이용하면 속성이 할당 할 때마다 호출됩니다.

    vetoable()을 이용하면 할당 이전에 호출 할수 있습니다.

import kotlin.properties.Delegates

fun main(args: Array<String>) {
	val user = User()
	user.name = "홍길동"
	user.name = "김철수"
	
	user.num = 10
	println(user.num)
	user.num = 5
	println(user.num)
}

class User {
	var name: String by Delegates.observable("초기 이름 없음") { prop, old, new ->
		println(old + " -> " + new)
	}
	var num: Int by Delegates.vetoable(0) { prop, old, new ->
		new > old
	}
}
/*
 실행 결과
 초기 이름 없음 -> 홍길동
 홍길동 -> 김철수
 10
 10
 */

 

Storing Properties in a Map (맵에 속성 저장)

    Map(val: 읽기 전용),  MutableMap(var: 읽기, 쓰기 가능) 차이를 가지고 있습니다.

fun main(args: Array<String>) {
	val user = User(
		mapOf(
			"name" to "홍길동",
			"age" to 25
		)
	)
	print(user.name)
	println(user.age)
	user.name = "청길동" // 수정 불가 에러 발생

	val mutableUser = MutableUser(
		mutableMapOf(
			"name" to "김철수",
			"age" to 20
		)
	)
	print(mutableUser.name)
	println(mutableUser.age)

	mutableUser.name = "박철수"
	mutableUser.age = 15
	print(mutableUser.name)
	println(mutableUser.age)
}

class User(val map: Map<String, Any?>) {
	val name: String by map
	val age: Int     by map
}

class MutableUser(val map: MutableMap<String, Any?>) {
	var name: String by map
	var age: Int     by map
}
/*
 실행 결과
 홍길동25
 김철수20
 박철수15
 */

 

위 코드를 이해하기 위해서는 아래 코틀린 문법이 필수입니다.

2019/05/19 - [Kotlin] - 코틀린 기초 문법) 1. 코틀린 변수 정의하기

2019/05/19 - [Kotlin] - 코틀린 기초 문법) 2. 코틀린 함수 정의하기

2019/05/19 - [Kotlin] - 코틀린 기초 문법) 6. 코틀린 any, is, instancedof 타입검사 및 형변환

2019/05/22 - [Kotlin] - 코틀린 기초 문법) 10. 코틀린 클래스와 생성자, init 키워드 알아보기

2019/05/31 - [Kotlin] - 21. 코틀린 위임 (Delegation) 알아보기

반응형
댓글
최근에 올라온 글
최근에 달린 댓글