4.3.2 분산과 접근 수정자의 효과

4.3.2 분산과 접근 수정자의 효과

오버라이딩은 분산(variance)의 규칙을 따릅니다. 즉 인자 타입은 반변(contravariance)(덜 특수한 타입)을 허용하고, 반환 타입은 공변(covariance)(더 특수한 타입)을 허용해요:

class Base {
  public function new() {}
}

class Child extends Base {
  private function method(obj:Child):Child {
    return obj;
  }
}

class ChildChild extends Child {
  public override function method(obj:Base):ChildChild {
    return null;
  }
}

class Main {
  static public function main() {}
}

직관적으로 이는 인자가 함수에 "쓰여지고" 반환 값이 함수에서 "읽혀지기" 때문입니다.

예제는 가시성(visibility)이 어떻게 바뀔 수 있는지도 보여줘요: 오버라이딩 필드는 오버라이드된 필드가 private여도 public일 수 있지만, 그 반대는 안 됩니다.

inline으로 선언된 필드는 오버라이드할 수 없어요. 이는 상충하는 개념 때문이에요: 인라이닝은 컴파일 타임에 호출을 함수 본문으로 교체하는 반면, 오버라이딩 필드는 반드시 런타임에 해석되어야 합니다.

출처: Effects of variance and access modifiers

본문

분산 규칙

오버라이딩에서 인자 타입은 반변(더 일반적으로), 반환 타입은 공변(더 특수하게) 허용돼요. 이는 인자는 함수에 "쓰여지고" 반환 값은 "읽혀지기" 때문이에요.

가시성

오버라이딩할 때 private 필드를 public으로는 넓힐 수 있지만, public을 private로 좁힐 수는 없어요.

inline과 오버라이드 불가

inline 필드는 오버라이드할 수 없어요. 인라이닝은 컴파일 타임에, 오버라이딩은 런타임에 해석되기 때문에 개념이 충돌합니다.

더 알아보기