다음을 통해 공유


Override 및 New 키워드를 사용해야 하는 경우(C# 프로그래밍 가이드)

업데이트: 2007년 11월

C#에서는 파생 클래스의 메서드 이름을 기본 클래스의 메서드와 동일하게 지정할 수 있으며, 이러한 경우 새 메서드를 취급하는 방식에 주의를 기울여야 합니다. 다음 예제에서는 newoverride 키워드를 사용하는 방법을 보여 줍니다.

우선 Car라는 기본 클래스 및 여기에서 파생된 ConvertibleCar 및 Minivan의 세 클래스를 선언합니다. 기본 클래스에는 자동차에 대한 설명을 콘솔에 보내는 DescribeCar라는 메서드 하나가 들어 있습니다. 파생 클래스 메서드에도 고유한 해당 속성을 표시하는 DescribeCar라는 메서드가 들어 있습니다. 또한 이들 메서드는 기본 클래스의 DescribeCar 메서드를 호출하여 Car 클래스의 속성이 상속되는 방식을 보여 줍니다.

차이점을 명확하게 설명하기 위해 ConvertibleCar 클래스는 new 키워드를 사용하여 정의하고 Minivan 클래스는 override를 사용하여 정의합니다.

// Define the base class
class Car
{
    public virtual void DescribeCar()
    {
        System.Console.WriteLine("Four wheels and an engine.");
    }
}

// Define the derived classes
class ConvertibleCar : Car
{
    public new virtual void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("A roof that opens up.");
    }
}

class Minivan : Car
{
    public override void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("Carries seven people.");
    }
}

이제 이러한 클래스의 인스턴스를 선언하는 코드를 작성한 다음 개체가 자신을 설명하도록 해당 메서드를 호출합니다.

public static void TestCars1()
{
    Car car1 = new Car();
    car1.DescribeCar();
    System.Console.WriteLine("----------");

    ConvertibleCar car2 = new ConvertibleCar();
    car2.DescribeCar();
    System.Console.WriteLine("----------");

    Minivan car3 = new Minivan();
    car3.DescribeCar();
    System.Console.WriteLine("----------");
}

짐작할 수 있듯이 출력은 다음과 같습니다.

Four wheels and an engine.

----------

Four wheels and an engine.

A roof that opens up.

----------

Four wheels and an engine.

Carries seven people.

----------

그러나 코드의 다음 섹션에서는 기본 클래스인 Car에서 파생된 개체의 배열을 선언합니다. 이 배열에는 Car, ConvertibleCar 및 Minivan 개체를 저장할 수 있습니다. 이 배열은 다음과 같이 선언됩니다.

public static void TestCars2()
{
    Car[] cars = new Car[3];
    cars[0] = new Car();
    cars[1] = new ConvertibleCar();
    cars[2] = new Minivan();
}

그런 다음 foreach 루프를 사용하여 배열에 포함된 각 Car 개체에 대해 다음과 같이 DescribeCar 메서드를 호출합니다.

foreach (Car vehicle in cars)
{
    System.Console.WriteLine("Car object: " + vehicle.GetType());
    vehicle.DescribeCar();
    System.Console.WriteLine("----------");
}

이 루프의 출력은 다음과 같습니다.

Car object: YourApplication.Car

Four wheels and an engine.

----------

Car object: YourApplication.ConvertibleCar

Four wheels and an engine.

----------

Car object: YourApplication.Minivan

Four wheels and an engine.

Carries seven people.

----------

이 경우 ConvertibleCar 설명이 예상과 다른 것을 알 수 있습니다. 이 메서드를 정의하는 데 new 키워드를 사용했으므로 파생 클래스 메서드가 호출되지 않고 기본 클래스 메서드가 대신 호출됩니다. Minivan 개체는 재정의된 메서드를 올바르게 호출하여 예상대로의 결과를 생성합니다.

Car에서 파생된 모든 클래스에서는 DescribeCar 메서드를 구현해야 한다는 규칙을 적용하려면 DescribeCar 메서드를 abstract로 정의하는 새 기본 클래스를 만들어야 합니다. 추상 메서드에는 어떠한 코드도 포함되지 않으며 메서드 시그니처만 포함됩니다. 이러한 기본 클래스에서 파생되는 모든 클래스는 DescribeCar의 구현을 제공해야 합니다. 자세한 내용은 abstract를 참조하십시오.

참고 항목

개념

C# 프로그래밍 가이드

참조

클래스 및 구조체(C# 프로그래밍 가이드)

Override 및 New 키워드를 사용하여 버전 관리(C# 프로그래밍 가이드)