개발일지

Kotlin in A..Z (16) - 프로퍼티 getter, setter 본문

Kotlin (코틀린)

Kotlin in A..Z (16) - 프로퍼티 getter, setter

강태종 2020. 7. 15. 22:13

C++이나 Java에서는 멤버 변수를 private으로 선언하고 getter, setter를 public으로 선언하여 접근하였다. 따라서 멤버 변수가 많아지면 그에 상응하는 getter, setter가 많아져 코드량이 길어지는 단점이 있다. Kotlin은 getter와 setter를 선언하지 않아도 자동으로 만들어준다.

 

getter와 setter의 작동방식

  • Kotlin은 자동으로 getter와 setter를 만들어준다.
  • val로 선언된 프로퍼티는 읽기전용이기 때문에 setter를 만들지 않는다.
  • private으로 선언된 프로퍼티는 getter와 setter를 만들지 않는다.

 

코드

// 프로퍼티 선언시 자동으로 getter와 setter가 정의된다.
class Base(var id: Long = 0, var name: String = "") {
    
}

fun main() {
    val base = Base()
    
    base.id = 1 // id의 setter를 호출하여 1이 들어간다.
    println(base.id) // id의 getter를 호출하여 id의 값을 불러온다. 
    
    base.name = "개발일지" // name의 setter를 호출하여 개발일지 값이 들어간다.
    println(base.name) // name의 getter를 호출하여 name의 값을 불러온다.
}

 

결과

1
개발일지

- getter와 setter 직접 지정하기

 

코드

// 프로퍼티 선언시 자동으로 getter와 setter가 정의된다.
class Base {
    public var id = 0L
        get() {
            println("Base id Getter")
            return field
        }

        set(value) {
            println("Base id Setter")
            field = value
        }
}

fun main() {
    val base = Base()

    base.id = 1 // id의 setter를 호출하여 1이 들어간다.
    println(base.id) // id의 getter를 호출하여 id의 값을 불러온다.
}

 

결과

Base id Setter
Base id Getter
1

value와 field의 의미

value는 setter에서 들어오는 값의 의미이고, field는 프로퍼티의 의미이다.

value와 field를 두는 이유는 프로퍼티 = value 이런 식의 표현식을 작성하면 setter가 계속 재귀호출 되면서 스택오버플로를 발생하기 때문이다.


- 프로퍼티 오버라이딩

 

코드

// 프로퍼티 선언시 자동으로 getter와 setter가 정의된다.
open class Base {
    open public var id = 0L
        get() {
            println("Base id Getter")
            return field
        }

        set(value) {
            println("Base id Setter")
            field = value
        }
}

class Test : Base() {
    override var id: Long = 0L
        get() {
            println("Test id Getter")
            return field
        }

        set(value) {
            println("Test id Setter")
            field = value
        }
}

fun main() {
    val test = Test()

    test.id = 1
    println(test.id)
}

 

결과

Test id Setter
Test id Getter
1

 

Comments