4.2.3 getter와 setter 규칙
4.2.3 getter와 setter 규칙
접근자 메서드의 가시성은 그 속성의 접근성에 영향을 주지 않아요. 즉 속성이 public이고 getter를 갖도록 정의되었다면, 그 getter는 그와 무관하게 private로 정의될 수 있어요.
getter와 setter 모두 데이터 저장을 위해 자신의 물리 필드(physical field)에 접근할 수 있어요. 컴파일러는 접근자 메서드 자신 안에서 이루어지는 이런 종류의 필드 접근이 접근자 메서드를 통과하지 않도록 보장하여, 무한 재귀를 피합니다:
class Main {
public var x(default, set):Int;
function set_x(newX) {
return x = newX;
}
static public function main() {}
}
하지만 컴파일러는 접근 식별자 중 적어도 하나가 default 또는 null인 경우에만 물리 필드가 존재한다고 가정해요.
정의: 물리 필드(Physical field) — 필드는 다음 중 하나이면 물리(physical) 라고 간주됩니다:
- 변수(variable)
- 읽기 또는 쓰기 접근 식별자가
default또는null인 속성(property):isVar메타데이터(metadata)를 가진 속성
그렇지 않으면 접근자 메서드 안에서 필드에 접근하면 컴파일 오류가 발생해요:
class Main {
// This field cannot be accessed because it is not a real variable
public var x(get, set):Int;
function get_x() {
return x;
}
function set_x(x) {
return this.x = x;
}
static public function main() {}
}
물리 필드가 실제로 의도된 경우, 해당 필드에 :isVar 메타데이터를 붙여 강제할 수 있어요:
class Main {
// @:isVar forces the field to be physical allowing the program to compile.
@:isVar public var x(get, set):Int;
function get_x() {
return this.x;
}
function set_x(x) {
return this.x = x;
}
static public function main() {}
}
본문
가시성 독립성
접근자 메서드의 가시성은 속성의 접근성에 영향을 주지 않아요. public 속성의 getter는 private일 수 있습니다.
물리 필드와 재귀 방지
getter/setter는 데이터 저장을 위해 물리 필드에 접근할 수 있고, 컴파일러는 접근자 안에서 접근자 메서드를 경유하지 않도록 해 무한 재귀를 방지해요. 물리 필드는 접근 식별자 중 하나가 default/null이거나 :isVar 메타데이터가 있을 때 존재한다고 간주됩니다.
물리 필드 강제
get/set 접근자 전용 속성처럼 물리 필드가 없으면 접근자 안에서의 필드 접근이 오류를 만듭니다. @:isVar 메타데이터로 물리 필드를 강제할 수 있어요.