더북(TheBook)

함수와 비슷하게 접근자에도 식이 본문인 형태를 사용할 수 있다.

val fullName: String
  get() = "$firstName $familyName"

게터에는 파라미터가 없다는 점을 기억하라. 반면 게터의 반환 타입은 (만약 반환 타입을 지정한다면) 프로퍼티의 타입과 같아야 한다.

val fullName: Any
  get(): String { 
    // error: getter return type must be equal to the type of the property, i.e. 'Any'
    return "$firstName $familyName"
  }

코틀린 1.1부터는 프로퍼티와 게터 정의에서 프로퍼티의 타입을 생략하고 타입 추론에 의존하면 된다.

val fullName
  get() = "$firstName $familyName" // 타입이 String으로 추론된다

앞의 코드처럼 도입한 프로퍼티의 값은 매번 fullName 프로퍼티를 읽을 때마다 다시 계산된다. firstName, familyName과 달리 fullName에는 뒷받침하는 필드(backing field)가 없기 때문에 클래스 인스턴스에서 전혀 메모리를 차지하지 않는다. 즉, 기본적으로 fullName은 프로퍼티 형태인 함수와 같다. 자바에서는 이런 경우 보통 getFullName()으로 게터 이름을 정한다. 뒷받침하는 필드와 관련한 규칙은 다음과 같다. 프로퍼티에 명시적으로 field를 사용하는 디폴트 접근자나 커스텀 접근자가 하나라도 있으면 뒷받침하는 필드가 생성된다. 불변 프로퍼티의 접근자는 읽기 접근자 하나뿐이므로 앞 예제에서 fullName은 직접 뒷받침하는 필드인 field를 참조하지 않는다는 사실을 쉽게 알 수 있다. 따라서 fullName 프로퍼티에는 뒷받침하는 필드가 없다.

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