코틀린에서 프로퍼티의 getter와 setter를 정의하는 방법은?
_____A: 코틀린에서는 클래스의 프로퍼티에 대해 커스텀 getter와 setter를 정의할 수 있습니다. 기본적으로 프로퍼티는 자동으로 getter와 (var일 경우) setter가 생성되나, 필요에 따라 이들을 직접 구현할 수 있습니다.
---
Q: 기본적인 문법은 어떻게 되나요?
A:
```kotlin
var propertyName: PropertyType = initialValue
get() {
// getter 구현
return field
}
set(value) {
// setter 구현
field = value
}
```
- `field`는 프로퍼티의 백킹 필드(backing field)를 가리키며, 반드시 getter와 setter 내에서만 사용할 수 있습니다.
- `value`는 setter 호출 시 전달되는 새 값을 의미합니다.
- `val` 프로퍼티는 setter가 없고, getter만 정의할 수 있습니다.
---
Q: 예제: 커스텀 getter와 setter 사용법
```kotlin
class Person {
var name: String = "Unknown"
get() {
println("Getter 호출")
return field
}
set(value) {
println("Setter 호출: $value")
field = value
}
}
```
- getter 호출 시 로그 출력 후 값을 반환
- setter 호출 시 로그와 함께 값을 변경
---
Q: 커스텀 getter만 정의하는 경우 (읽기 전용 속성)
```kotlin
val isAdult: Boolean
get() = age >= 18
```
- 백킹 필드가 없는 계산 속성(computed property)으로 활용 가능
---
Q: 백킹 필드 사용 시 주의사항은 무엇인가요?
- 커스텀 getter/setter 내에서 `field` 식별자를 통해 실제 저장된 값을 읽거나 쓸 수 있습니다.
- `field`는 프로퍼티 이름과 같지 않고 내부 식별자임.
- 직접 필드 변수 없이 커스텀 getter만 정의하고 싶으면, `field` 사용 없이 계산된 값을 반환합니다.
---
Q: 예제: 읽기 전용 계산 프로퍼티
```kotlin
class Rectangle(val width: Int, val height: Int) {
val area: Int
get() = width * height
}
```
- `area`는 백킹 필드 없이 매번 계산
---
Q: 기본 getter/setter 자동 생성과의 차이점은?
- 프로퍼티에 초기 값을 주면 자동으로 getter와 setter가 생성되고 내부에 백킹 필드를 관리해 기본 동작을 구현함.
- 커스텀 getter/setter를 정의하면 기본 동작 대신 직접 구현한 로직이 작동함.
---
요약:
- `var` 프로퍼티는 `get()`과 `set(value)` 모두 정의 가능
- `val` 프로퍼티는 `get()`만 정의 가능
- 프로퍼티 내에서 `field` 키워드를 사용하여 실제 저장 공간 접근
- getter/setter는 프로퍼티 선언부 내에서 중괄호로 선언
---
더 자세한 문법 참조:
https://kotlinlang.org/docs/properties.html getters-and-setters
그러나 필요에 따라 사용자 정의 getter와 setter를 구현할 수도 있습니다.
이 글에서는 코틀린에서 프로퍼티의 getter와 setter를 정의하는 방법에 대해 자세히 설명하겠습니다.
기본 프로퍼티 정의 코틀린에서 프로퍼티를 정의하는 기본적인 방법은 다음과 같습니다: ```kotlin class Person { var name: String = "Unknown" var age: Int = 0 } ``` 위의 코드에서 `name`과 `age`는 자동으로 getter와 setter가 생성됩니다.
`name`의 경우, `get()` 메서드는 `name`의 값을 반환하고, `set(value)` 메서드는 `name`의 값을 설정합니다.
사용자 정의 Getter와 Setter 사용자 정의 getter와 setter를 정의하려면, `get()`과 `set(value)`를 오버라이드하면 됩니다.
예를 들어, `age` 프로퍼티에 대해 0보다 작은 값이 설정되지 않도록 제한하는 코드를 작성할 수 있습니다.
```kotlin class Person { var name: String = "Unknown" var age: Int = 0 get() = field // 기본 getter set(value) { if (value >= 0) { field = value // 기본 setter } else { println("Age cannot be negative.") } } } ``` 위의 코드에서 `age` 프로퍼티의 setter는 입력된 값이 0 이상인지 확인하고, 그렇지 않으면 경고 메시지를 출력합니다.
`field` 키워드는 프로퍼티의 실제 저장소를 참조합니다.
읽기 전용 프로퍼티 읽기 전용 프로퍼티를 정의하려면 `val` 키워드를 사용합니다.
읽기 전용 프로퍼티는 setter가 없으며, getter만 정의할 수 있습니다.
예를 들어: ```kotlin class Circle(private val radius: Double) { val area: Double get() = Math.PI * radius * radius // radius를 사용하여 면적을 계산 } ``` 위의 `Circle` 클래스에서 `area` 프로퍼티는 `radius`를 기반으로 계산된 값을 반환하는 사용자 정의 getter를 가지고 있습니다.
프로퍼티 초기화 프로퍼티의 초기화는 생성자에서 수행할 수 있습니다.
다음은 생성자에서 프로퍼티를 초기화하고, 사용자 정의 getter와 setter를 사용하는 예입니다.
```kotlin class Rectangle(private var _width: Double, private var _height: Double) { var width: Double get() = _width set(value) { if (value > 0) { _width = value } else { println("Width must be positive.") } } var height: Double get() = _height set(value) { if (value > 0) { _height = value } else { println("Height must be positive.") } } val area: Double get() = width * height // 면적 계산 } ``` 이 예제에서 `Rectangle` 클래스는 `width`와 `height` 프로퍼티를 가지고 있으며, 각각의 setter에서 값이 양수인지 확인합니다.
또한, `area` 프로퍼티는 면적을 계산하여 반환합니다.
결론 코틀린에서 프로퍼티의 getter와 setter를 정의하는 것은 매우 간단하고 유연합니다.
기본적으로 제공되는 getter와 setter를 사용할 수도 있지만, 필요에 따라 사용자 정의 로직을 추가하여 프로퍼티의 값을 제어할 수 있습니다.
이러한 기능은 데이터의 무결성을 유지하고, 비즈니스 로직을 구현하는 데 유용합니다.
작성자:
정수빈 [비회원]
| 작성일자: 1년 전
2024-09-09 09:47:16
조회수: 129 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 129 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.