프로퍼티(Property)

Minsuk Jang·2021년 11월 15일
0

코틀린

목록 보기
3/4
post-thumbnail

코틀린의 프로퍼티에 알아보자

🤔 프로퍼티란?

  • 클래스의 변수를 프로퍼티(Property)라고 한다.
  • 변수처럼 보이지만 사실 내부에 getter, setter 함수가 내장돼 있다.
  • Java에서는 클래스의 field + 접근자 메소드 = 프로퍼티라 한다.
  • 어떤 블록({ ... }) 에 포함되지 않은 최상위 레벨 변수 or 클래스 내부에 선언한 변수만 프로퍼티를 사용할 수 있다. (지역 변수는 사용 x)
fun main(args: Array<String>) {
    val user = User()
    println("Name: ${user.name}, Age: ${user.age}")
}

class User {
    var name: String = "jang"

    /*    get() = field
        set(value) {
            field = value
        }*/
    val age: Int = 10
  //      get() = field

}

주석을 제거해도 동일한 결과를 출력한다.

user.name = "kim" or println("${user.name}") 을 수행하게 되면 내부적으로 set(), get() 메소드를 호출한다.

Backing field

  • 프로퍼티의 값을 저장하는 field 값
  • get(), set() 메소드 내에서는 field를 통해 프로퍼티가 가지는 값에 접근

field를 안쓰고 직접 접근해보자.

Java 형태로 set(), get() 메소드를 이용하여 name 변수에 접근하는 코드이다.

fun main(args: Array<String>) {
    val user = User()
    user.name = "jang"
    println("Name: ${user.name}, Age: ${user.age}")
}

class User {
    var name: String
        get() = name
        set(value) {
            name = value
        }
    val age get() = 10
}

get() 과 set() 둘 다 StackOverFlow가 발생한다.

get()의 경우

  1. 값을 얻기 위해 name을 반환하는데 name의 값을 얻기 위해 get() 함수를 호출한다. 무한 재귀 루프를 돌고 있다.

set()의 경우

  1. user.name = "jang"은 사실 User 클래스의 set()를 호출한 것과 동일하다.
  2. User 클래스의 set() 를 보면 name 변수에 직접 값을 할당하고 있다. set() 함수 내에서도 set() 함수를 호출하고 있다.

따라서, StackOverflow가 발생하지 않게 Backing field를 이용하여 코드를 수정하면 아래와 같다.

class User {
    var name: String = "jang"
        get() = field
        set(value) {
            field = value
        }
    val age get() = 10
}

Backing field 사용 규칙

1. get(), set() 내부에서는 field 값으로 접근한다.
2. var로 선언한 프로퍼티는 set(), get() 둘 다 정의할 수 있지만 val은 get()만 가능하다.

👏 참고

profile
Positive Thinking

0개의 댓글