프로퍼티
지난 글에서 공부했던 프로퍼티에 대해 더 자세히 알아봅시다. 프로퍼티는 객체의 구성요소로서 객체가 가지는 데이터들을 뜻합니다.
코틀린의 프로퍼티는 자동으로 게터와 세터가 생성되어 인스턴스.프로퍼티 로 객체에 접근하거나 값을 변경하는 것이 가능합니다.
만약, 게터와 세터를 직접 지정하고 싶다면 다음과 같은 방법을 사용합니다.
value : 외부로부터 받아온 값
field : 프로퍼티를 참조하는 변수
var 프로퍼티명: 프로퍼티타입 = 매개변수로 받아온 프로퍼티
get() = field
set(value) {
field = value
}
지연 초기화 lateinit, lazy
코틀린 익히기 2 - 자료형, 연산자에서 짧게 다뤘던 지연초기화를 기억하시나요? 생성과 동시에 초기화하기 어려운 경우 lateinit과 lazy 키워드를 사용하여 지연 초기화합니다.
lateinit
lateinit var 변수명: 자료형
lateinit의 제한
- var에서만 사용할 수 있습니다.
- Int, Long, Short, Double, Float, Boolean, Byte 자료형은 사용할 수 없습니다.
- 프로퍼티에 대한 게터와 세터를 사용할 수 없습니다
lateinit의 특징
- 사용 전 원하는 시점에 초기화할 수 있습니다.
lazy
val 변수명: 자료형 by lazy {
...
}
lazy의 제한
- val에서만 사용할 수 있습니다.
lazy의 특징
- 변수가 처음으로 사용되는 시점에 by lazy 블록 {} 이 실행되며 리턴값이 초기값으로 할당됩니다.
위임 Deligation
지연 초기화의 lazy에서 앞에 by라는 키워드를 붙여 사용했죠. by는 위임 역할을 합니다. 위임이 무엇이고 어떻게 위임할 수 있는지 알아봅시다.
by를 통한 위임
위임은 책임을 넘겨주는 것입니다.
프로퍼티 위임
프로퍼티의 위임은 게터, 세터의 책임을 특정 객체에게 넘겨주는 것을 의미합니다. 따라서 by lazy를 사용하여 lazy 객체에게 초기화 권한을 넘길 수 있었던 것이죠.
<val|var> 프로퍼티 이름: 자료형 by 프로퍼티를 대신할 객체
클래스 위임 (인터페이스 구현 위임)
클래스의 위임은 구현의 책임을 특정 객체에게 넘겨주는 것을 의미합니다. by 위임으로 인터페이스를 구현하지 않고도, 이미 인터페이스를 구현한 클래스의 메서드를 사용할 수 있습니다.
class 클래스 이름 : 인터페이스 by 인터페이스를 구현한 클래스의 객체
observable() 메서드의 위임
import kotlin.properties.Delegates
프로퍼티를 감시하고 있다가 특정 코드의 로직에서 변경이 일어날 때 호출되는 콜백함수입니다.
import kotlin.properties.Delegates
class Student {
var name: String by Delegates.observable("Cheolsu") {
prop, old, new ->
println("$old -> $new") // 이벤트가 발생할 때 실행
}
}
fun main () {
val student = Student()
student.name = "Younghee"
student.name = "Minju"
}
// Cheolsu -> Younghee
// Younghee -> Minju
vetoable() 메서드의 위임
import kotlin.properties.Delegates
프로퍼티를 감시하고 있다가 특정 코드의 로직에서 변경이 일어날 때 람다식의 반환값이 true일 때만 변경을 허락합니다.
import kotlin.properties.Delegates
class Student {
var name: String by Delegates.vetoable("Cheolsu") {
prop, old, new ->
new.length > old.length
}
}
fun main() {
val student = Student()
println(student.name)
student.name = "Younghee"
println(student.name)
student.name = "Minju"
println(student.name)
}
// Cheolsu
// Younghee
// Younghee
컴패니언 객체 (이름 △, 싱글톤 O)
컴패니언 객체는 프로퍼티나 메서드를 자바의 static 멤버처럼 사용할 수 있게 합니다. 클래스 안에 companion object 키워드로 선언합니다. 컴패니언 객체는 싱글톤으로 생성되며 클래스명.companion object의 멤버로 접근할 수 있습니다. [companion object 이름] 처럼 뒤에 이름을 붙여 사용하는 것이 가능합니다.
class 클래스명 {
companion object {
프로퍼티
메서드
}
}
❓ 싱글톤이란 무엇인가요?
- 싱글톤이란 하나만의 객체를 생성하고 어디에서든 그 객체를 참조할 수 있게 만드는 디자인 패턴입니다.
object 선언 (이름 O, 싱글톤 O)
class 대신 object로 선언하면 컴패니언 객체처럼 인스턴스를 만들지 않고 object이름.멤버로 접근할 수 있습니다. 생성자는 사용할 수 없지만 init 초기화 블록은 사용할 수 있습니다. object 접근 시에 싱글톤으로 객체가 생성됩니다.
전역으로 사용할 수 있는 싱글톤 객체를 만들고 싶을 때 사용합니다.
object OCar : Car {
fun drvie() = {}
init {
println()
}
}
fun main() {
OCar.drvie()
}
❗ 위에서 배운 컴패니언 객체는 사실 Companion이라는 이름의 object선언과 같습니다. 즉, object Companion {} 과 같습니다.
object 표현식 (이름 X, 싱글톤 X)
자바의 익명객체와 같이 사용할 수 있는 object 표현식입니다. object 표현식은 object 선언과 달리 싱글톤으로 생성되지 않습니다. 이름이 없기 때문에 재사용이 불가능 합니다.
일회성으로 사용할 객체를 만들고 싶을 때 사용합니다.
// 상속받거나 구현하고 싶을 때
object: 상속받을 클래스() 혹은 구현할 인터페이스 {
override ...
}
// 그냥 일회용으로 사용할 객체를 만들 때
object {}
앞선 글들을 공부하셨다면 지속적으로 언급되는 프로퍼티에 대해 궁금하셨겠죠? 이번글에서는 프로퍼티의 생성과 초기화 등에 대해 자세히 알아보았습니다.
자바를 먼저 공부하신 분들께서는 static 변수에 대응되는 것이 무엇인지도 궁금하셨을 것 같습니다. 코틀린에서는 companion object를 사용합니다. object선언과 표현식은 클래스 대신 아주 유용하게 사용될 수 있습니다. 다음 글에서는 다양한 클래스와 인터페이스로 찾아오겠습니다.
'개발공부 > Kotlin : 코틀린' 카테고리의 다른 글
코틀린 익히기 8 - 제네릭 (0) | 2023.09.28 |
---|---|
코틀린 익히기 7 - 다양한 클래스와 인터페이스 (0) | 2023.09.27 |
코틀릭 익히기 5 - 클래스와 객체 (0) | 2023.09.21 |
코틀린 익히기 4 - 함수형 프로그래밍 (0) | 2023.09.20 |
코틀린 익히기 3 - 조건문과 반복문 (1) | 2023.09.19 |