Kotlin

프로퍼티 (Getter / Setter)

공부처음하는사람 2023. 12. 24. 22:14

프로퍼티의 접근

자바의 필드(Fields)

  • 단순한 변수 선언만 가지기 때문에 접근을 위한 메서드를 따로 만들어야 함

코틀린의 프로퍼티 (Properties)

  • 변수 선언과 기본적인 접근 메서드를 모두 가지고 있음
  • 따로 접근 메서드를 만들지 않아도 내부적으로 생성하게 됨

* 자바의 Fields == 코틀린의 Property.

자바에서의 접근 메서드 형식

class Person {

// 멤버필드
private String name;
private int age;

// 생성자
public Person(String name, int age) {
    this.name = name;
    this.age = age;
}

// 게터와 세터
public String getName() {
    return name;
}

public void setName(String name){
    this.name = name;
}

public int getAge() {
    return age;
}

위와 같이 자바에서는 모든 필드에 접근 메서드를 만들어야한다.

코틀린에서 게터와 세터가 작동하는 방식

class User(val id: Int, var name: String, var age: Int) {  

}

fun main() {
    val user = User(1, "sean", 30)

    // 게터에 의한 값 획득

    // name에 있는것을 가져오기 때문에 우리 눈에 보이진 않지만
    // 코틀린 컴파일러가 내부적으로 String name = user.getName() 형식으로 가져오는 것이다.
    val name = user.name  

    // 세터에 의한 값 지정

    // 위와 반대로 age의 값을 새로 설정하기때문에 세터가 작동한다.
    // user.setAge(41);
    user.age = 41

    println("name: $name, ${user.age}")  // 게터
}

val로 선언된 불변 변수는 재설정 할 수 없으니 세터를 가질수 없다.

var로 선언된 경우에는 게터/세터 둘다 정의된다.

게터와 세터 직접 지정 (custom get/set)

package com.example.demo.inherit

class User(_id: Int, _name: String, _age: Int) {
    // 프로퍼티
    val id: Int = _id
        get() = field
// id를 가리키면 또다시 get이 생성되고 무한재귀에 빠진다. 특정변수 field는 id를 가리키는 포인트이다.

    var name: String = _name
        get() = field
        set(value) {  // value는 외부로 부터의 값
            field = value
        }

    var age: Int = _age
        get() = field
        set(value) {
            field = value + 10  // custom한 setter가 된다.
        }
}

fun main() {
    val user1 = User(1, "kildong", 30)
    // user1.id = 2, val로 선언되었기 때문에 값 변경 불가
    user1.age = 35 // setter
    println("user1.age = ${user1.age}") // getter
}
  • var age에 set을 custom하지 않으면 age의 값은 35가 출력되는데, value값에 10을 더했기 때문에 45가 출력된다.

 

  • value : 세터의 매개변수로 외부로부터 값을 가져옴
    외부의 값을 받을 변수이므로 value 대신 어떤 이름이던 상관없다.
  • field: 프로퍼티를 참조하는 변수로 보조 필드(backing field)로 불림
    프로퍼티를 대신할 임시 필드로 만일 프로퍼티를 직접 사용하면
    게터와 세터가 무한으로 호출되는 재귀에 빠지게 되니 그것을 방지하기 위한 것이다.

* 무한재귀에 빠지게 되면 스택오버플로우가 발생할 수 있다.

 

더 자세한 내용은 doit 책을 참조할것!!

 

 

'Kotlin' 카테고리의 다른 글

추상클래스  (1) 2023.12.25
지연초기화  (1) 2023.12.25
캡슐화  (0) 2023.12.24
다형성  (0) 2023.12.23
예외 처리  (1) 2023.12.23