[swift] 상속된 메서드와 부모 클래스 메서드의 호출 우선순위

Swift에서는 부모 클래스에서 정의한 메서드를 자식 클래스가 재정의(overriding)할 수 있습니다. 하지만, 자식 클래스에서 해당 메서드를 호출할 때 호출 우선순위(Dispatch Priority)에 대해 고려해야 합니다.

메서드 호출 우선순위

일반적으로 Swift에서는 메서드 호출 시 다음과 같은 우선순위를 따릅니다.

  1. 동적 디스패치(Dynamic Dispatch): 객체의 실제 타입에 따라 메서드를 호출합니다. 이는 상속된 메서드의 경우 해당됩니다.
  2. 정적 디스패치(Static Dispatch): 컴파일 시간에 메서드 호출 대상을 결정합니다.

부모 클래스로부터 상속된 메서드는 동적 디스패치를 통해 호출되므로 해당 메서드가 자식 클래스에 의해 재정의된 경우에도 부모 클래스의 메서드가 호출될 수 있습니다.

다음은 동적 디스패치를 통해 부모 클래스 메서드를 호출하는 예시 코드입니다.

class Parent {
    func sayHello() {
        print("Hello from Parent")
    }
}

class Child: Parent {
    override func sayHello() {
        print("Hello from Child")
    }
}

let obj = Child()
obj.sayHello() // "Hello from Child"
(obj as Parent).sayHello() // "Hello from Parent"

위 코드에서 objChild 클래스의 인스턴스이지만, (obj as Parent).sayHello()의 호출 결과는 부모 클래스인 Parent의 메서드를 출력합니다.

동적 디스패치를 이해하는 것은 객체지향 프로그래밍에서 상속과 메서드 재정의의 동작을 이해하는 데 중요합니다.

결론

상속된 메서드의 호출 우선순위는 동적 디스패치를 따르며, 부모 클래스 메서드를 호출할 수 있습니다. 이를 이해하고 이를 활용함으로써 객체지향 프로그래밍에서 기반 클래스와 파생 클래스 간의 관계를 보다 잘 이해할 수 있습니다.