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) 라고 간주됩니다:

그렇지 않으면 접근자 메서드 안에서 필드에 접근하면 컴파일 오류가 발생해요:

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() {}
}

출처: Rules for getter and setter

본문

가시성 독립성

접근자 메서드의 가시성은 속성의 접근성에 영향을 주지 않아요. public 속성의 getter는 private일 수 있습니다.

물리 필드와 재귀 방지

getter/setter는 데이터 저장을 위해 물리 필드에 접근할 수 있고, 컴파일러는 접근자 안에서 접근자 메서드를 경유하지 않도록 해 무한 재귀를 방지해요. 물리 필드는 접근 식별자 중 하나가 default/null이거나 :isVar 메타데이터가 있을 때 존재한다고 간주됩니다.

물리 필드 강제

get/set 접근자 전용 속성처럼 물리 필드가 없으면 접근자 안에서의 필드 접근이 오류를 만듭니다. @:isVar 메타데이터로 물리 필드를 강제할 수 있어요.

더 알아보기