프로그래밍 언어/Kotlin

[Kotlin] 프로퍼티

happy_life 2022. 10. 11. 11:09

description

코틀린 프로퍼티

1. 최상위 프로퍼티

클래스에 포함되지 않은 프로퍼티로 전역 변수/ 상수의 역할을 하는 프로퍼티입니다.

public/internal/private 등의 가시성 지정이 가능합니다.

private val prefix = "Hello World"

fun main () {
    fun readInt() = readLine()!!.toInt()
}

 

 

2. 늦은 초기화

생성자에서 초기화 되지는 않지만, 프로그램 흐름 상 실 사용 시에는 초기화 되는 것이 명백할 경우가 있씁니다. 이런 경우 lateinit이라는 예약어를 사용합니다. 하지만 이 경우 프로그래머가 반드시 초기화하는 코드를 작성해주어야합니다. 만약 실수로 초기화를 하지 않는 경우 UninitializedPropertyAccessException이 발생합니다. ( 가능하면 by lazy를 권장합니다) 참고로 lateinit 은 var에서만 사용가능합니다.

lateinit

 

 

3. 지연 계산 프로퍼티

프로퍼티에 접근할 때까지 프로퍼티 값에 대한 연산을 지연합니다.

class Content(var file: File) {
    val text by lazy {
        print("reding text from file")
        file.readText() }
}

fun main () {
    val c = Content(File("Quiz.txt"))

    println("Before access text")

    println(c.text)
}

c.text에서 값을 읽는 순간에 초기화가 진행됩니다.

 

 

4. 커스텀 접근자

프로퍼티에 대한 접근을 함수로 수행합니다.

 

4-1 get()을 통해 프로퍼티에 대해 접근

fullName이라는 프로퍼티 자체에 값을 저장하는 것이 아니라, get() 메서드가 호출되어 값을 return하는 구조입니다.

class Person(val firstName: String, val familyName: String) {
    val fullName: String
        get() {
            return "$firstName $familyName"
        }
}

fun main () {
    val p = Person("Charlie", "kim")
    println(p.fullName)
}

 

 

4-2 뒷받침 하는 필드

커스텀 접근자 게터를 사용하는 경우도 메모리에 뒷받침하는 필드를 두어 값을 저장할 수 있습니다. 이 경우 field라는 예약어로 해당 필드에 접근합니다.

class Person(val firstName: String, val familyName: String, age: Int) {
    val age: Int = age
        get(): Int {
            return field
        }
}

fun main () {
    val p = Person("Charlie", "kim", 25)
    println(p.age)
}

 

 

4-3 가변 프로퍼티를 위한 세터(setter)

var 프로퍼티를 위해서는 set(value)를 통해서 setter를 둘 수 있다.

class Person(val firstName: String, val familyName: String) {
    var age: Int? = null
        get(): Int? {
            return field
        }
    set(value) {
        field = value
    }
}

fun main () {
    val p = Person("Charlie", "kim")
    println("set 전: ${p.age}")
    p.age = 40
    println("set 후: ${p.age}")
}

 

 

4-4 프로퍼티 접근자를 통한 접근 통제

프로퍼티의 get / set에 대해 다른 접근자를 두어 접근을 통제할 수 있습니다.

class Person(name: String) {
    var lastChanged: Date? = null
        private set

    var name = name
        set(value) {
            lastChanged = Date()
            field = value
        }
}

접근제어자로 통제

 

'프로그래밍 언어 > Kotlin' 카테고리의 다른 글

[Kotlin] 객체  (0) 2022.10.13
[Kotlin] null 정리  (0) 2022.10.11
[Kotlin] 코틀린 클래스, 생성자  (0) 2022.10.09
[Kotlin] 코틀린 함수  (1) 2022.10.08
[Kotlin] 코틀린 문자열과 배열  (1) 2022.10.08