먼저, 몇가지 알아둬야할 것들을 적어보자면,
* Kotlin에서는 자바와 달리 변수를 만들면 자동적으로 getter와 setter가 내부적으로 생성이 된다.
* 불변변수인 val 의 경우 (그 값이 변경되서는 안되니) getter만 내부적으로 생성이 된다.
자, 그럼 만들었던 Glass 클래스 코드를 다시 보자.
class Glass(var content: Int, val capacity: Int)
content 의 특정상 가변변수(var)로 쓰여있는데 이 경우, 마음대로 그 값을 변경해도 허용이 되는 일이 일어나게 된다.
fun main(){
val glass1 = Glass(90,150)
glass1.content = 250
glass1.content = -180
}
이런식으로 마이너스값까지 아무 제한없이 허용하게 되는데, 이는 가시성 수정자(visibility modifier)나 다른 메카니즘을 통해 확인되거나 보호가 되지 않아서 그런것이다. 속성 content 는 0보다 작거나 기존 제한 용량점보다 커질수가 없다. 이를 해결할 수 있는 방법은 Setter 메서드를 통해 가능하다.
glass1.content = 250 할당은 내부적으로 Set 메서드, 즉 glass1의 Content 속성값을 설정하는 메서드에 대한 호출로 이어진다. set 메서드는 앞에 얘기햇듯, 자동적으로 생성되며 전달된 값을 Backing Field 에 할당한다. Backing Field는 Int 오브젝트의 실제 데이터 필드, 즉 값이 실제로 위치한 메모리의 위치다. 언급했던 문제를 해결하기 위해, 우리는 set 메서드를 직접 설정해주면 된다.
이를 위한 단계
* 속성 content를 Constructor가 아닌 클래스 내부에 둔다.
* 해당 속성의 set메서드를 정의한다.
* 클래스 Constructor(생성자)에 시작값을 설정하는 매개변수를 둔다.
: 속성의 set 메서드는 항상 속성 바로 뒤에 정의해야 한다. 이 메서드는 정확히 하나의 매개변수, 즉 재설정할 값으로 보통 value 로 많이 쓴다. 키워드 field는 실제 값이 저장되어있는 메모리에 접근할 수 있게 해준다. 이 set메서드에 아까와 같은 오류들을 방지하기 위한 조건들을 써주면 된다. 우리의 경우 content의 값이 마이너스값일 경우 0으로, 용량보다 클 경우 그 값을 용량과 같은 양으로 만들어준다고 적은 것.
제대로 작동하는지 확인해 보자.
결과를 통해 set메서드가 제대로 값을 고쳐준 걸 확인해 볼 수 있다.
'언어 > Kotlin' 카테고리의 다른 글
Kotlin : 리스트 (list) (0) | 2022.10.12 |
---|---|
Kotlin : Setter 와 Getter 1.5 (0) | 2022.10.12 |
Kotlin : 중간점검 (1) | 2022.10.11 |
Kotlin : ArrayList (배열 + 리스트) (0) | 2022.09.07 |
Kotlin : Objectreference (ft. Call by value) (0) | 2022.09.05 |