들어가기 전에
보통 객체지향 프로그래밍에서 클래스를 정의할 때 객체의 상태는 멤버변수 (필드)로, 행위는 메소드로 표현한다.
그리고 멤버변수가 있으면 객체의 값을 설정하고 가져오는 메소드( setter / getter)가 동반되는 경우가 많다.
코틀린에서는 이런 요소를 아우르는 프로퍼티라는 개념이 제공된다.
Property = Fileld + Getter + Setter
프로퍼티 정의
프로퍼티를 정의하는 전체 문법은 아래와 같다.
(var/val) <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]
- var / val : 프로퍼티 선언을 위한 예약어.
- var : 초기화 후 값 변경이 가능한 프로퍼티
- val: 초기화 후 값 변경이 불가능한 프로퍼티
- propertyName: 프로퍼티명
- PropertyType: 프로퍼티 타입 (타입 추론이 가능한 경우 생략 가능)
- propery_initializer: 프로퍼티 값 초기화 (초기화가 불필요한 경우 생략 가능)
- getter / setter : 해당 프로퍼티에 대한 getter / gsetter를 정의 (생략할 경우 default getter, setter 적용)
- var 프로퍼티는 setter / getter를 가짐
- val 프로퍼티는 setter를 가질 수 없으며, getter만 가짐
커스텀 Setter & Getter
코틀린에서 객체의 프로퍼티에 접근은 변수에 직접 접근하는 것이 아니라 Accessor 메소드(getter & setter)를 통해 이루어진다.
프로퍼티를 선언할 때 default로 정의된 메소드가 아닌, getter & setter 메소드를 커스텀으로 구현이 가능하다.
커스텀 Getter 함수
class MyList {
var size: Int? = 0
val isEmpty: Boolean
get() = this.size == 0
}
위 코드를 해석하자면 MyList 객체의 isEmpty라는 속성에 접근할 때에 MyList 객체의 size 속성 값이 0일 경우 true를 리턴, 아닐 경우 false를 리턴하는 코드이다.
커스텀 Setter 함수
class Person {
var name: String = "Not Assigned"
set(value){ //커스텀 setter
field = "Dev." + value
}
}
fun main(){
val person = Person()
person.name = "Ready"
println(person.name)
}
위 예제를 보면 set 메소드 내부의 "field"를 볼 수 있는데,
이는 프로퍼티가 자동으로 Accessor 메소드 안에서 참조할 수 있도록 Backing Field라고 불리는 field라는 식별자를 제공해준다. field가 가리키는 것 이 곧 name이다.
'Kotlin' 카테고리의 다른 글
[Kotlin] Object 키워드 (with companion object) (0) | 2024.11.02 |
---|---|
[Kotlin] Data Class란? (3) | 2024.11.02 |
[Kotlin] Sealed Class란? (2) | 2024.11.02 |
[Kotlin] 늦은 초기화 (lateinit, by lazy) (0) | 2023.08.22 |
[Kotlin] 범위 지정 함수(apply, with, let, also, run) (0) | 2023.07.22 |