본문 바로가기

Language/Kotlin

[Kotlin] 접근자 메소드, 게터(Getters)와 세터(Setters)

접근자 메소드에 관해 설명하기 전에 관련 용어의 정의들을 정리해보자.

프로퍼티(Property): 필드 + 접근자 메소드 (getter, setter)

필드(Field) : 프로퍼티를 참조하는 변수, 보조 필드(Backing Field)라고도 한다.
                   접근자 메소드 내에서만 사용할 수 있다.

 

클래스 외부에서 클래스 내부 변수에 직접 접근할 수 없을 때 getter와 setter를 통해 클래스의 프로퍼티에 접근해

값을 읽거나 변경할 수 있다.

자바에서는 클래스를 생성할 때 get() 함수와 set() 함수를 통해 getter와 setter를 직접 구현해야 하지만

코틀린에서는 getter와 setter가 자동으로 생성되며 변수의 값을 읽거나 지정할 때 자동으로 실행된다.

 

var로 선언된 변수는 get, set이 모두 가능하고, val로 선언된 변수는 처음 초기화할 때를 제외하고 get만 사용할 수 있다.

 

class person(var name: String, var job: String){
}

fun main(array: Array<String>) {

    var person1:person = person("박지원", "대학생")
    println(person1.name)
    println(person1.job)
    person1.job = "개발자"
    println(person1.job)
}

person 클래스는 name과 job를 필드로 갖고 있다.

person1.name / person1.job과 같은 코드가 객체의 프로퍼티에 직접 접근해서 읽는 것 같지만 내부적으로는 getter와 setter를 통해 접근한 것이다. 

 

자동으로 생성된 게터와 세터를 코드로 작성하면 다음과 같다.

class person() {
    var name: String = ""
        get() = field
		 set(value) {
            field = value
        }
        
    var job: String = ""
        get() = field
        set(value) {
            field = value
        }
        
    constructor(name: String, job: String) : this() {
        this.name = name
        this.job = job
}
getter를 get() = name이라고 작성하면 안되는 것인지 헷갈릴 수도 있다.
하지만 name의 값을 읽어오는 순간 getter가 다시 호출되면서 무한 재귀 호출에 빠져 StackOverflowError가 발생한다.

 

Custom Getters/Setters

사용자는 접근자 메소드를 직접 만들어 변형할 수 있다.

객체의 이름에 입력된 값이 "박지원"이 아니면 본인이 아님을 알려주도록 get()을 변경하고

직업에 "대학생"이 아닌 값이 대입되면 "이직하였습니다"를 출력하도록 set()을 변경하였다.

class person() {
    var name: String = ""
        get() {
            return if (field != "박지원") "본인이 아닙니다"
            else field
        }
        set(value) {
            field = value
        }

    var job: String = ""
        get() = field
        set(value) {
            if(value != "대학생" && value != "") println("이직하였습니다")
            field = value
        }

    constructor(name: String, job: String) : this() {
        this.name = name
        this.job = job
    }
}

fun main(array: Array<String>) {

    var person1: person = person()
    person1.name = "박지원" // set 호출
    println(person1.name) // get 호출
    person1.job = "대학생" // set 호출
    println(person1.job) // get 호출
    person1.job = "개발자" // set 호출
    println(person1.job) // get 호출

    var person2: person = person()
    println()
    person2.name = "홍길동" // set 호출
    println(person2.name) // get 호출
    person2.job = "대학생" // set 호출
    println(person2.job) // get 호출
    
    }

 

요약
- 코틀린은 접근자 메소드(getter, setter)가 자동으로 생성, 실행된다.
- 사용자가 getter와 setter를 변형해서 사용할 수 있다.

'Language > Kotlin' 카테고리의 다른 글

[Android/ Kotlin] findViewById 함수를 대체하는 뷰 결합  (0) 2021.08.22