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

C# 오버라이딩(Overriding)과 섀도잉(Shadowing)의 차이점 완벽 정리

C#에서는 상속 관계에 있는 클래스 간에 메서드를 다르게 동작시키는 방법으로 오버라이딩(Overriding)섀도잉(Shadowing)을 제공합니다. 두 기능은 비슷해 보이지만 동작 방식과 사용 목적이 분명히 다르므로, 그 차이를 정확히 이해하는 것이 중요합니다.

오버라이딩(Overriding)이란?

오버라이딩은 부모 클래스에 정의된 메서드를 자식 클래스가 자신의 필요에 맞게 재정의하는 것을 의미합니다. 이를 통해 서브클래스 타입에 특화된 동작을 구현할 수 있으며, 다형성(Polymorphism)을 실현하는 핵심 문법입니다.

오버라이딩을 사용하려면 부모 클래스의 메서드는 virtual, abstract, 또는 override 키워드로 선언되어야 하고, 자식 클래스에서는 override 키워드를 사용하여 해당 메서드를 재정의합니다.

추상 클래스를 활용한 오버라이딩 예제

using System;

namespace PolymorphismApplication {
    abstract class Shape {
        public abstract int area();
    }

    class Rectangle : Shape {
        private int length;
        private int width;

        public Rectangle(int a = 0, int b = 0) {
            length = a;
            width = b;
        }

        public override int area() {
            Console.WriteLine("Rectangle class area :");
            return (width * length);
        }
    }

    class RectangleTester {
        static void Main(string[] args) {
            Rectangle r = new Rectangle(10, 7);
            double a = r.area();
            Console.WriteLine("Area: {0}", a);
            Console.ReadKey();
        }
    }
}

위 예제에서 추상 클래스 Shapearea() 메서드의 시그니처만 선언하고 있습니다. 이를 상속받은 Rectangle 클래스는 override 키워드를 사용해 가로와 세로를 곱해 넓이를 계산하는 자신만의 구현을 제공합니다.

섀도잉(Shadowing)이란?

섀도잉은 메서드 하이딩(Method Hiding)이라고도 불립니다. 자식 클래스가 부모 클래스와 동일한 이름의 메서드를 new 키워드를 사용하여 새롭게 정의하는 것으로, 이때 부모 클래스의 메서드는 숨겨지게 됩니다.

섀도잉의 가장 큰 특징은 override 키워드 없이도 부모 클래스의 메서드를 대체할 수 있다는 점입니다. 즉, 자식 클래스는 같은 이름의 함수에 대해 자신만의 버전을 독립적으로 가지게 됩니다.

new 키워드를 사용한 섀도잉 예제

using System;
using System.Collections.Generic;

class Demo {
    public class Parent {
        public string Display() {
            return "Parent Class!";
        }
    }

    public class Child : Parent {
        public new string Display() {
            return "Child Class!";
        }
    }

    static void Main(String[] args) {
        Child child = new Child();
        Console.WriteLine(child.Display());
    }
}

위 예제에서 Child 클래스는 new 키워드를 통해 부모의 Display() 메서드를 숨기고 자신만의 버전을 정의했습니다. 따라서 Child 타입의 객체에서 Display()를 호출하면 "Child Class!"가 출력됩니다.

오버라이딩과 섀도잉의 주요 차이점

  • 키워드: 오버라이딩은 override 키워드를, 섀도잉은 new 키워드를 사용합니다.
  • 다형성: 오버라이딩된 메서드는 부모 타입 변수로 호출해도 자식의 구현이 실행되지만, 섀도잉된 메서드는 참조 타입에 따라 호출 결과가 달라집니다.
  • 선언 조건: 오버라이딩하려면 부모 메서드가 virtual 또는 abstract여야 하지만, 섀도잉에는 그러한 제약이 없습니다.
  • 용도: 다형적 동작이 필요하면 오버라이딩을, 단순히 부모의 구현을 감추고 새로운 구현을 제공하고 싶다면 섀도잉을 사용하는 것이 적합합니다.

두 개념을 올바르게 구분하여 사용하면 상속 구조 설계 시 더 유연하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.