더북(TheBook)

가변 프로퍼티에는 두 가지 접근자가 있으므로 두 접근자를 모두 커스텀화하고 두 접근자가 모두 다 field 키워드를 통해 뒷받침하는 필드를 사용하지 않는 경우를 제외하면 항상 뒷받침하는 필드가 생긴다. 예를 들어 앞의 age 프로퍼티는 디폴트 게터를 사용하고 세터에서 field를 직접 언급하기 때문에 뒷받침하는 필드를 생성한다. 반면 다음 프로퍼티는 그렇지 않기 때문에 뒷받침하는 필드가 생기지 않는다.

class Person(var firstName: String, var familyName: String) {

  var fullName: String
    get(): String = "$firstName $familyName"
    set(value) {
      val names = value.split(" ") // 공백으로 구분해 단어를 분리한다
      if (names.size != 2) {
        throw IllegalArgumentException("Invalid full name: '$value'")
      }
      firstName = names[0]
      familyName = names[1]
    }
}

프로퍼티 접근자에 별도로 가시성 변경자를 붙일 수도 있다. 여러분이 프로퍼티가 포함된 클래스 외부에서는 프로퍼티의 값을 변경하지 못하게 해서 바깥 세계에서 볼 때는 실질적으로 객체가 불변인 것처럼 여겨지게 하고 싶을 때 이런 방식을 사용할 수 있다. 단순한 접근자 구현(뒷받침하는 필드를 바로 돌려주는 게터와 뒷받침하는 필드에 값을 바로 대입하는 세터)만 필요한 경우에는 그냥 get이나 set 키워드만 사용해서 게터와 세터를 정의할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.