Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 메서드 오버라이딩(Method Overriding)과 메서드 숨김(Method Hiding)의 차이점 완벽 정리

C#에서 자식 클래스가 부모 클래스의 메서드를 새롭게 재정의하는 방법은 크게 두 가지가 있습니다. 하나는 메서드 오버라이딩(Method Overriding)이고, 다른 하나는 메서드 숨김(Method Hiding)입니다. 두 메커니즘 모두 부모 클래스의 메서드 구현을 자식 클래스에서 다시 제공한다는 공통점이 있지만, 재구현이 이루어지는 방식과 호출 시 동작 결과에서 중요한 차이를 보입니다.

메서드 오버라이딩 vs 메서드 숨김 주요 차이점

번호구분 기준메서드 오버라이딩 (Method Overriding)메서드 숨김 (Method Hiding)
1정의다형성(polymorphism)을 실현하기 위한 메커니즘으로, 부모 클래스와 자식 클래스가 매개변수와 시그니처까지 완전히 동일한 메서드를 가질 때, 자식 클래스 객체를 통해 호출하면 자식 클래스의 구현이 실행됩니다.new 키워드를 사용하여 부모 클래스의 메서드를 자식 클래스에서 재정의하는 기법으로, 해당 메서드에 대해 부모 클래스가 제공하던 기본 구현을 감추는(숨기는) 효과를 냅니다.
2부모 클래스 구현 접근 여부자식 클래스에서 base 키워드를 통해 부모 클래스의 원래 구현에 접근할 수 있습니다.자식 클래스의 참조를 통해서는 부모 클래스의 원래 구현에 접근할 수 없습니다.
3사용되는 키워드override 키워드를 사용합니다. (부모 메서드는 virtual, abstract 또는 override로 선언되어야 합니다.)new 키워드를 사용하여 자식 클래스에 새로운 구현을 정의합니다.
4바인딩 방식런타임에 객체의 실제 타입을 기준으로 메서드가 결정되는 동적 바인딩(객체 타입 기반)이 적용됩니다.컴파일 타임에 참조 변수의 타입을 기준으로 메서드가 결정되는 정적 바인딩(참조 타입 기반)이 적용됩니다.
5부모 참조 변수가 자식 객체를 가리킬 때부모 클래스 타입의 참조 변수가 자식 클래스 객체를 가리키고 있어도, 호출되는 것은 자식 클래스에서 오버라이딩된 메서드입니다.부모 클래스 타입의 참조 변수가 자식 클래스 객체를 가리키고 있으면, 호출되는 것은 부모 클래스의 숨겨진(원본) 메서드입니다.
6용도기존 메서드의 구현 내용만 재정의하며, 메서드의 계약(시그니처)은 그대로 유지됩니다.부모 클래스의 메서드와는 별개로 메서드를 완전히 새롭게 재정의할 수 있습니다.

예제 코드로 이해하기

다음 예제는 오버라이딩과 숨김이 실제로 어떻게 다르게 동작하는지 보여줍니다.

using System;

class Parent
{
    public virtual void Show()
    {
        Console.WriteLine("Parent.Show()");
    }

    public void Display()
    {
        Console.WriteLine("Parent.Display()");
    }
}

class Child : Parent
{
    // 메서드 오버라이딩: override 키워드 사용
    public override void Show()
    {
        Console.WriteLine("Child.Show() - 오버라이딩");
    }

    // 메서드 숨김: new 키워드 사용
    public new void Display()
    {
        Console.WriteLine("Child.Display() - 숨김");
    }
}

class Program
{
    static void Main()
    {
        Parent obj = new Child();

        obj.Show();    // 출력: Child.Show() - 오버라이딩 (자식 클래스 메서드 호출)
        obj.Display(); // 출력: Parent.Display()   (부모 클래스 메서드 호출)
    }
}

위 코드에서 Show()override로 재정의되었기 때문에 참조 변수가 Parent 타입이더라도 자식 클래스의 구현이 실행됩니다. 반면 Display()new로 숨겨졌기 때문에 참조 변수의 타입(Parent)을 따라 부모 클래스의 구현이 실행됩니다.

정리

메서드 오버라이딩은 다형성을 활용해 런타임에 적절한 구현이 선택되도록 하는 객체 지향 프로그래밍의 핵심 기법이며, 일반적인 상속 시나리오에서 권장되는 방식입니다. 반면 메서드 숨김은 부모 클래스의 구현을 의도적으로 가리고 새로운 버전을 제공하고 싶을 때 사용하지만, 참조 타입에 따라 동작이 달라질 수 있어 코드의 예측 가능성이 떨어질 수 있으므로 신중하게 사용해야 합니다.