4.3.1 메서드 오버라이딩(Overriding Methods)

4.3.1 메서드 오버라이딩(Overriding Methods)

필드 오버라이딩은 클래스 계층을 만드는 데 핵심적이에요. 많은 디자인 패턴이 그것을 활용하지만, 여기서는 기본 기능만 살펴볼게요. 클래스에서 오버라이드를 사용하려면 그 클래스가 부모 클래스(parent class)를 가져야 합니다. 다음 예제를 생각해 봐요:

class Base {
  public function new() {}

  public function myMethod() {
    return "Base";
  }
}

class Child extends Base {
  public override function myMethod() {
    return "Child";
  }
}

class Main {
  static public function main() {
    var child:Base = new Child();
    trace(child.myMethod()); // Child
  }
}

여기서 중요한 구성 요소는 다음과 같아요:

  • myMethod 메서드와 생성자를 가진 Base 클래스,
  • Base를 확장하고 override로 선언된 myMethod 메서드를 가진 Child 클래스,
  • childChild의 인스턴스를 생성·할당하고 myMethod()를 호출하는 main 메서드를 가진 Main 클래스.

child 변수는 명시적으로 Base로 타입이 매겨져 있어 중요한 차이를 강조해요: 컴파일 타임에 타입은 Base로 알려져 있지만, 런타임은 여전히 Child 클래스에서 올바른 myMethod 메서드를 찾아요. 필드 접근이 런타임에 동적으로 해석되기 때문입니다.

Child 클래스는 super.methodName()을 호출해 오버라이드한 메서드에 접근할 수 있어요:

class Base {
  public function new() {}

  public function myMethod() {
    return "Base";
  }
}

class Child extends Base {
  public override function myMethod() {
    return "Child";
  }

  public function callHome() {
    return super.myMethod();
  }
}

class Main {
  static public function main() {
    var child = new Child();
    trace(child.callHome()); // Base
  }
}

상속(Inheritance) 절이 이 개념을 확장해요.

출처: Overriding Methods

본문

오버라이딩의 기본

override 키워드로 부모 클래스의 메서드를 재정의할 수 있어요. var child:Base = new Child();처럼 부모 타입으로 참조해도 런타임은 실제 객체의 메서드를 호출합니다(동적 해석).

super 호출

super.methodName()으로 부모 클래스의 메서드를 호출할 수 있어요.

더 알아보기