본문 바로가기
Kotlin

[Kotlin] 필드(Field)와 프로퍼티(Property)

by 태크민 2023. 8. 22.

들어가기 전에

보통 객체지향 프로그래밍에서 클래스를 정의할 때 객체의 상태는 멤버변수 (필드)로, 행위는 메소드로 표현한다.

그리고 멤버변수가 있으면 객체의 값을 설정하고 가져오는 메소드( 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이다.