4.2.2 타입 시스템에 미치는 영향

4.2.2 타입 시스템에 미치는 영향

속성의 존재는 타입 시스템에 여러 결과를 가져와요. 가장 중요하게, 속성은 컴파일 타임 기능이라 타입을 알아야 한다(require the types to be known)는 점을 이해하는 것이 필요해요. 속성이 있는 클래스를 Dynamic에 할당하면 필드 접근은 접근자 메서드를 존중하지 않을 거예요. 마찬가지로 접근 제한도 더 이상 적용되지 않고 모든 접근이 실질적으로 public이 돼요.

get 또는 set 접근 식별자를 사용할 때, 컴파일러는 getter와 setter가 실제로 존재하는지 확인해요. 다음 코드 조각은 컴파일되지 않습니다:

class Main {
  // Method get_x required by property x is missing
  public var x(get, null):Int;

  static public function main() {}
}

get_x 메서드가 없지만, 부모 클래스가 정의하는 한 속성을 정의한 클래스 자체에 선언할 필요는 없어요:

class Base {
  public function get_x() return 1;
}

class Main extends Base {
  // ok, get_x is declared by parent class
  public var x(get, null):Int;

  static public function main() {}
}

dynamic 접근 수정자는 get 또는 set과 정확히 동일하게 동작하지만, 존재 여부를 검사하지 않아요.

출처: Impact on the type system

본문

속성은 컴파일 타임 기능

속성은 컴파일 타임에만 존재해요. 클래스를 Dynamic에 할당하면 접근자가 존중되지 않고 접근 제한도 사라져 사실상 모두 public이 됩니다.

접근자 존재 확인

get/set을 쓰면 컴파일러가 해당 getter/setter 존재를 확인해요. 부모 클래스가 정의해도 됩니다. dynamic 접근자는 같은 동작이지만 존재를 검사하지 않습니다.

더 알아보기