4.2.1 일반적인 접근자 조합
4.2.1 일반적인 접근자 조합
다음 예제는 속성에 대한 일반적인 접근 식별자 조합을 보여줘요:
class Main {
// read from outside, write only within Main
public var ro(default, null):Int;
// write from outside, read only within Main
public var wo(null, default):Int;
// access through getter get_x and setter
// set_x
public var x(get, set):Int;
// read access through getter, no write
// access
public var y(get, never):Int;
// required by field x
function get_x() return 1;
// required by field x
function set_x(x) return x;
// required by field y
function get_y() return 1;
function new() {
var v = x;
x = 2;
x += 1;
}
static public function main() {
new Main();
}
}
main 메서드의 필드 접근이 무엇으로 컴파일되는지 이해하기 위해 JavaScript 출력을 도울 수 있어요:
var Main = function() {
var v = this.get_x();
this.set_x(2);
var _g = this;
_g.set_x(_g.get_x() + 1);
};
지정된 대로, 읽기 접근은 get_x() 호출을 생성하고, 쓰기 접근은 x에 할당되는 값인 2와 함께 set_x(2) 호출을 생성해요. +=가 생성되는 방식은 처음에 좀 이상해 보일 수 있지만, 다음 예제로 쉽게 정당화됩니다:
class Main {
public var x(get, set):Int;
function get_x() return 1;
function set_x(x) return x;
public function new() {}
static public function main() {
new Main().x += 1;
}
}
여기서 일어나는 일은 main 메서드의 x 필드 접근의 표현식 부분이 복잡(complex) 하다는 것입니다: 이는 이 경우 Main의 생성 같은 잠재적 부수 효과를 가져요. 그래서 컴파일러는 += 연산을 new Main().x = new Main().x + 1로 생성할 수 없고, 복잡한 표현식을 지역 변수에 캐시해야 합니다:
Main.main = function() {
var _g = new Main();
_g.set_x(_g.get_x() + 1);
};
접근자 조합과 사용 가능한 접근 식별자에 대한 전체 개요는 이 절을 참고하세요.
본문
예제
ro(default, null)은 밖에서 읽기 가능하고 클래스 안에서만 쓰기 가능해요. wo(null, default)는 그 반대입니다. x(get, set)은 getter/setter를 통한 접근이고, y(get, never)는 getter 읽기만 가능하고 쓰기는 없어요.
생성된 코드
getter/setter가 있는 속성은 읽기 접근 시 getter 호출, 쓰기 접근 시 setter 호출로 컴파일됩니다. += 같은 복합 연산은 복잡한 표현식(부수 효과 포함)을 지역 변수에 캐시한 뒤 set_x(get_x() + 1)처럼 생성합니다.