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

C# 메서드 재정의(Overriding)와 숨기기(Hiding)의 차이점 완벽 정리

C#에서 자식 클래스가 부모 클래스의 메서드를 다시 정의하는 방식은 크게 두 가지가 있습니다. 바로 재정의(Overriding)숨기기(Hiding, 섀도잉)입니다. 두 방법 모두 부모 클래스에 이미 존재하는 메서드를 자식 클래스에서 새롭게 구현한다는 점에서 비슷해 보이지만, 동작 방식과 사용 목적에는 중요한 차이가 있습니다.

메서드 숨기기(Method Hiding)란?

메서드 숨기기는 C#에서 '섀도잉(shadowing)'이라고도 불립니다. 숨기기를 사용하면 override 키워드 없이도 부모 클래스의 메서드를 자식 클래스에서 사용할 수 있으며, 자식 클래스는 같은 이름의 함수에 대해 자신만의 버전을 갖게 됩니다. 실무에서는 보통 new 키워드를 사용해 부모 클래스의 메서드를 의도적으로 가리는 방식으로 구현합니다.

메서드 재정의(Overriding)란?

재정의는 자식 클래스 타입에 특화된 동작을 정의하는 기법입니다. 즉, 자식 클래스는 부모 클래스로부터 상속받은 메서드를 자신의 요구 사항에 맞게 다시 구현할 수 있습니다. 재정의를 사용하려면 부모 클래스의 메서드가 virtual, abstract 또는 override로 선언되어 있어야 하며, 자식 클래스에서는 override 키워드를 붙여 새로운 구현을 제공합니다.

재정의와 숨기기의 핵심 차이점

숨기기는 메서드 전체를 다시 정의하는 반면, 재정의는 메서드의 구현(implementation)만 다시 정의합니다. 또한 재정의에서는 자식 클래스 객체를 통해 부모 클래스의 재정의된 메서드에 접근할 수 있어 다형성(polymorphism)이 자연스럽게 동작합니다. 반면 숨기기에서는 부모 클래스 참조를 통해 자식 클래스의 메서드에 접근할 수 없습니다.

코드 예제로 이해하기

using System;

class Parent
{
    public virtual void Show()
    {
        Console.WriteLine("부모 클래스의 Show() 호출");
    }
}

class Child : Parent
{
    // 재정의(Overriding)
    public override void Show()
    {
        Console.WriteLine("자식 클래스의 Show() 호출");
    }

    // 숨기기(Hiding)
    public new void Greet()
    {
        Console.WriteLine("자식 클래스의 Greet() 호출");
    }
}

class Program
{
    static void Main()
    {
        Parent obj = new Child();
        obj.Show();    // "자식 클래스의 Show() 호출" 출력 → 다형성 동작

        Child child = new Child();
        child.Greet(); // "자식 클래스의 Greet() 호출" 출력
    }
}

정리

재정의는 상속 관계에서 다형성을 활용해 자식 클래스만의 동작을 구현할 때 적합하고, 숨기기는 부모 클래스의 기존 멤버를 완전히 대체하는 새로운 버전을 제공할 때 유용합니다. 두 기법의 차이를 정확히 이해하면 상속 구조를 설계할 때 더 안전하고 유지보수하기 좋은 코드를 작성할 수 있습니다.