Загружаем каталог…
Загружаем каталог…
I. 살펴보기 Kotlin에서 클래스를 공부하다 보면 프로퍼티를 선언할 때 Getter와 Setter를 직접 정의하는 경우가 있다. 처음에는 Getter는 값을 가져오고 Setter는 값을 바꾸는 것이라고 이해했지만, Setter 안에서 갑자기 등장하는 field 가 무엇인지 헷갈렸다. 이번 글에서는 Kotlin의 Getter와 Setter가 무엇인지, 그리고 커스텀 Setter에서 field 를 사용하는 이유를 정리해보려고 한다. II. Kotlin의 프로퍼티 다음과 같이 var 로 변수를 선언해보자. var balance: Int = 0 단순히 변수 하나를 선언한 것처럼 보이지만, Kotlin에서는 이를 프로퍼티(Property) 라고 한다. var 로 선언한 프로퍼티에는 기본적으로 값을 읽기 위한 Getter와 값을 변경하기 위한 Setter가 존재한다. 따라서 println(balance) 처럼 값을 읽으면 Getter가 호출되고, balance = 100 처럼 값을 변경하면 Setter가 호출된다. 별도로 Getter와 Setter를 작성하지 않아도 Kotlin이 기본적인 동작을 제공해준다. III. 커스텀 Getter Getter가 호출될 때 단순히 저장된 값을 반환하는 것이 아니라 다른 계산을 수행하도록 만들 수도 있다. 예를 들어 현재 잔액의 절반을 반환하는 프로퍼티를 만들어보자. val halfBalance: Int get() = balance / 2 halfBalance 에 접근하면 저장된 값을 가져오는 것이 아니라 balance / 2 를 계산한 결과를 반환한다. balance = 100 println(halfBalance) 출력 결과는 다음과 같다. 50 여기서 중요한 점은 halfBalance 라는 값을 따로 저장하고 있는 것이 아니라는 것이다. halfBalance 를 요청할 때마다 Getter가 실행되어 현재 balance 를 기준으로 값을 계산한다. IV. 커스텀 Setter Setter도 직접 정의할 수 있다. 예를 들어 은행 계좌의 잔액이 음수가 되지 않도록 만들고 싶다고 해보자. var balance: Int = 0 set(value) { field = if (value < 0) { 0 } else { value } } 이제 다음과 같이 값을 넣으면 balance = 100 Setter의 value 에는 100 이 전달된다. 반대로 balance = -50 을 실행하면 value 에는 -50 이 전달되지만, 조건문에 의해 실제로 저장되는 값은 0 이 된다. 즉, Setter는 프로퍼티에 값이 저장되기 전에 값을 검사하거나 변환할 수 있게 해준다. V. 그런데 field 는 무엇일까? 여기서 가장 헷갈렸던 부분이 바로 이것이었다. field = value 왜 그냥 다음처럼 작성하지 않는 걸까? balance = value Setter 안에서 balance 는 지금 Setter를 정의하고 있는 바로 그 프로퍼티이다. 따라서 Setter 안에서 balance = value 라고 작성하면 balance 에 값을 넣으려고 하면서 Setter가 다시 호출된다. 다시 호출된 Setter 안에서도 또 balance = value 가 실행되고, 다시 Setter가 호출된다. 결국 다음과 같은 과정이 반복된다. balance에 값 저장 → Setter 호출 → balance에 값 저장 → Setter 호출 → balance에 값 저장 → Setter 호출 → ... 즉, 무한 재귀가 발생한다. 이 문제를 피하기 위해 사용하는 것이 field 이다. VI. field 는 실제 저장 공간을 의미한다 Setter 내부의 field = value 에서 field 는 해당 프로퍼티의 값을 실제로 저장하는 Backing Field 를 의미한다. 쉽게 생각하면 balance = 100 은 "balance의 Setter를 호출해서 100을 넣어줘" 라는 의미이고, Setter 내부의 field = 100 은 "Setter를 다시 호출하지 말고 실제 저장 공간에 100을 저장해줘" 라는 의미라고 볼 수 있다. 따라서 Setter 안에서는 자기 자신의 값을 실제로 저장할 때 field 를 사용한다. VII. 전체 예제 Getter와 Setter를 함께 사용하면 다음과 같은 클래스를 만들 수 있다. class BankAccount(initialMoney: Int) { var balance: Int = initialMoney set(value) { field = if (value < 0) { 0 } else { value } } val halfBalance: Int get() = balance / 2 fun info(): String { return "Balance: $balance, Half: $halfBalance" } } 사용해보면 다음과 같다. val account = BankAccount(100) println(account.info()) account.balance = 200 println(account.info()) account.balance = -50 println(account.info()) 마지막에 -50 을 넣더라도 Setter가 값을 확인하기 때문에 balance 에는 0 이 저장된다. VIII. Getter와 Setter 정리 Getter와 Setter의 역할을 정리하면 다음과 같다. > Getter 프로퍼티의 값을 읽을 때 호출된다. 필요하면 값을 계산해서 반환할 수도 있다. > Setter 프로퍼티의 값을 변경할 때 호출된다. 저장하기 전에 값을 검사하거나 변환할 수 있다. > value Setter에 새롭게 들어온 값이다. > field 현재 프로퍼티의 실제 값이 저장되는 공간이다. Setter를 다시 호출하지 않고 값을 직접 저장할 때 사용한다. 특히 value 와 field 를 구분하는 것이 중요하다. 예를 들어 balance = -50 을 실행했을 때 Setter 내부에서는 value = -50 field = 기존 balance가 저장되어 있던 실제 공간 이라고 생각할 수 있다. 그리고 field = 0 을 실행하면 최종적으로 balance 의 실제 저장값이 0 이 된다. IX. 마무리 처음에는 Setter 안에서 왜 굳이 field 라는 새로운 키워드를 사용하는지 이해하기 어려웠다. 하지만 핵심은 간단했다! 프로퍼티 이름을 사용하면 Getter 또는 Setter를 거치고, field 를 사용하면 해당 프로퍼티의 실제 저장 공간에 접근한다. 특히 Setter 안에서 자기 자신의 프로퍼티에 값을 저장하려고 다시 프로퍼티 이름을 사용하면 Setter가 계속 호출될 수 있기 때문에 field 를 사용한다. 앞으로 커스텀 Setter를 볼 때는 다음과 같이 생각하면 될 것 같다. value 는 새로 들어온 값, field 는 실제로 저장할 곳.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
[Kotlin] Getter와 Setter 이해하기: field는 왜 필요할까?. I. 살펴보기 Kotlin에서 클래스를 공부하다 보면 프로퍼티를 선언할 때 Getter와 Setter를 직접 정의하는 경우가 있다. 처음에는 Getter는 값을 가져오고 Setter는 값을 바꾸는 것이라고 이해했지만, Setter 안에서 갑자기 등장하는 field 가 무엇인지 헷갈렸다. 이번 글에서는 Kotlin의 Getter와 Setter가 무엇인지, 그리고 커스텀 Setter에서 field 를 사용하는 이유를 정리해보려고 한다. II. Kotlin의 프로퍼티 다음과 같이 var 로 변수를 선언해보자. var balance: Int = 0 단순히 변수 하나를 선언한 것처럼 보이지만, Kotlin에서는 이를…
Открыть источник