티스토리 뷰

app/kotlin

[kotlin/코틀린] 프로퍼티

hsm914 2023. 6. 22. 22:46
728x90

 

  1. 늦은 초기화 (lateinit)
  • 인스턴스를 생성할 때 프로퍼티를 초기화하지 않고, 필요시 초기화하기 위해 사용한다.
  • 값을 읽을 때 프로퍼티가 초기화되지 않으면 UninitializedPropertyAccessException 예외를 던진다.
  • lateinit 프로퍼티의 조건
    • 가변 프로퍼티로 정의해야 한다.
    • 참조 타입, non-nullable type이어야 한다. (내부에서는 초기화되지 않은 상태를 표현하기 위해 널을 사용하기 때문)
    • 선언과 동시에 초기화할 수 없다.
  • 최상위 프로퍼티와 지역 변수에서도 사용할 수 있다.

 

 

 

       2. 커스텀 접근자

  • 프로퍼티는 커스텀 접근자를 통해 변수와 함수의 동작을 하나의 선언에 조합할 수 있다.
  • 커스텀 접근자는 프로퍼티 값을 읽거나 쓸 때 호출되는 함수다.

 

  • 커스텀 게터
class Person(val firstName: String, val familyName: String) {
  val fullName: String
    get(): String { // get() = "$firstName $familyName"
      return "$firstName $familyName"
    }
}
 
  • 프로퍼티를 읽으면 자동으로 게터를 호출한다.
  • 파라미터가 없으며 반환 타입은 프로퍼티의 타입과 같아야 한다. 
  • 프로퍼티를 읽을 때마다 다시 계산된다.
  • 위의 게터처럼, 계산에 의해 값을 돌려주는 프로퍼티의 경우 뒷받침하는 필드가 존재하지 않는다.
    • 뒷받침하는 필드 (backing field) 
      • 프로퍼티의 값을 저장하고 있는 필드를 뜻한다.
      • 하나 이상의 디폴트 접근자를 사용하거나 커스텀 접근자에서 field 키워드를 사용하면 생성된다.
      • 프로퍼티를 초기화하는 경우 뒷받침하는 필드에 직접 대입된다.
      • 접근자의 본문 내에서만 쓸 수 있다.

 

  • 커스텀 세터
class Person(val firstName: String, val familyName: String) {
    var age: Int = 0
      set(value) {
        field = value
      }
}

fun main() {
    val person = Person("John", "Doe")
    person.age = 20       // 커스텀 세터 호출
    println(person.age)   // 20 (디폴트 게터 호출)
}
  • 가변 프로퍼티에는 게터와 세터 두가지 접근자를 선언할 수 있다.
  • 하나의 파라미터를 가지며, 프로퍼티의 타입과 같아야 한다.
  • 커스텀 게터/세터에 접근 제한자를 붙일 수 있다.
  • 기본 구현을 변경하지 않고 접근 제한자만 필요한 경우 get, set 키워드만 사용하여 정의할 수 있다.
    • ex) private set
  • lateinit 프로퍼티는 항상 자동으로 접근자가 생성되기 때문에 커스텀 접근자를 정의할 수 없다.
  • 주생성자 파라미터의 프로퍼티도 커스텀 접근자를 정의할 수 없다.

 

 

 

       3. 지연 계산 프로퍼티

val text by lazy {
    "Hello"
}

fun main() {
    println(text)
}
  • 프로그램이 시작될 때 초기화되지 않고, 처음으로 lazy 프로퍼티의 값을 읽을 때 초기화된다. 그 이후는 저장된 값을 읽는다.
  • lazy 블록 안에는 프로퍼티를 초기화하는 코드를 지정한다.
  • 초기화 후에 변경되지 않는 불변 프로퍼티다.
  • by 키워드를 통한 위임 프로퍼티다. 

 

 

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함