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);
};

접근자 조합과 사용 가능한 접근 식별자에 대한 전체 개요는 이 절을 참고하세요.

출처: Common accessor identifier combinations

본문

예제

ro(default, null)은 밖에서 읽기 가능하고 클래스 안에서만 쓰기 가능해요. wo(null, default)는 그 반대입니다. x(get, set)은 getter/setter를 통한 접근이고, y(get, never)는 getter 읽기만 가능하고 쓰기는 없어요.

생성된 코드

getter/setter가 있는 속성은 읽기 접근 시 getter 호출, 쓰기 접근 시 setter 호출로 컴파일됩니다. += 같은 복합 연산은 복잡한 표현식(부수 효과 포함)을 지역 변수에 캐시한 뒤 set_x(get_x() + 1)처럼 생성합니다.

더 알아보기