new 한정자(C# 참조)

선언 한정자로 사용되는 new 키워드는 기본 클래스에서 상속된 멤버를 명시적으로 숨깁니다. 상속된 멤버를 숨기면 파생 버전의 멤버로 기본 클래스 버전의 멤버를 대신하게 됩니다. 여기서는 멤버의 기본 클래스 버전이 표시된다고 가정합니다. private으로 표시되거나 일부 경우 internal로 표시된 경우 이미 숨겨져 있기 때문입니다. new 한정자를 사용하지 않고 public 또는 protected 멤버를 숨길 수도 있지만, 컴파일러 경고가 발생합니다. new를 사용하여 멤버를 명시적으로 숨기면 이 경고가 발생하지 않습니다.

new 키워드를 사용하여 형식의 인스턴스를 만들거나 제네릭 형식 제약 조건으로 만들 수도 있습니다.

상속된 멤버를 숨기려면 동일한 멤버 이름을 사용하여 파생된 클래스에 해당 멤버를 선언한 다음 new 키워드를 사용하여 이를 한정합니다. 예시:

public class BaseC
{
    public int x;
    public void Invoke() { }
}
public class DerivedC : BaseC
{
    new public void Invoke() { }
}

이 예제에서 BaseC.InvokeDerivedC.Invoke에 의해 숨겨집니다. x 필드는 비슷한 이름으로 숨겨져 있지 않기 때문에 영향을 받지 않습니다.

상속을 사용한 이름 숨기기는 다음 중 한 가지 형식을 취합니다.

  • 일반적으로 클래스 또는 구조체에 파생된 상수, 필드, 속성 또는 형식은 동일한 이름의 모든 기본 클래스 멤버를 숨깁니다. 이 사항이 적용되지 않는 경우가 있습니다. 예를 들어 호출할 수 없는 형식이 포함된 N이라는 이름의 새 필드를 선언하고 기본 형식에서 N을 메서드로 선언하면 새 필드가 호출 구문에서 기본 선언을 숨기지 않습니다. 자세한 내용은 C# 언어 사양멤버 조회 섹션을 참조하세요.

  • 클래스 또는 구조체에 파생된 메서드는 기본 클래스에서 동일한 이름의 속성, 필드 및 형식을 숨깁니다. 또한 시그니처가 동일한 기본 클래스 메서드도 모두 숨깁니다.

  • 클래스 또는 구조체에 파생된 인덱서는 시그니처가 동일한 기본 클래스 인덱서를 모두 숨깁니다.

동일한 멤버에 대해 newoverride를 모두 사용하면 오류가 발생합니다. 두 한정자는 함께 사용할 수 없는 의미를 지니고 있기 때문입니다. new 한정자는 동일한 이름의 새 멤버를 만들고 원래 멤버를 숨기도록 하는 반면, override 한정자는 상속된 멤버에 대한 구현을 확장합니다.

상속된 멤버를 숨기지 않는 선언에 new 한정자를 사용하면 경고가 발생합니다.

예제

이 예제에서 기본 클래스 BaseC 및 파생 클래스 DerivedC는 동일한 필드 이름 x를 사용하므로 상속된 필드의 값이 숨겨집니다. 이 예제에서는 new 한정자의 사용법을 보여 줍니다. 또한 정규화된 이름을 사용하여 기본 클래스의 숨겨진 멤버에 액세스하는 방법을 보여 줍니다.

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'.
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

이 예제에서 중첩 클래스는 기본 클래스에서 이름이 동일한 클래스를 숨깁니다. 이 예제에서는 new 한정자를 사용하여 경고 메시지를 제거하는 방법과 정규화된 이름을 사용하여 숨겨진 클래스 멤버에 액세스하는 방법을 보여 줍니다.

public class BaseC
{
    public class NestedC
    {
        public int x = 200;
        public int y;
    }
}

public class DerivedC : BaseC
{
    // Nested type hiding the base type members.
    new public class NestedC
    {
        public int x = 100;
        public int y;
        public int z;
    }

    static void Main()
    {
        // Creating an object from the overlapping class:
        NestedC c1  = new NestedC();

        // Creating an object from the hidden class:
        BaseC.NestedC c2 = new BaseC.NestedC();

        Console.WriteLine(c1.x);
        Console.WriteLine(c2.x);
    }
}
/*
Output:
100
200
*/

new 한정자를 제거해도 프로그램은 컴파일되고 실행되지만 다음과 같은 경고가 발생합니다.

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

C# 언어 사양

자세한 내용은 C# 언어 사양새 한정자 섹션을 참조하세요.

참고 항목