new 한정자(C# 참조)new modifier (C# Reference)

선언 한정자로 사용되는 new 키워드는 기본 클래스에서 상속된 멤버를 명시적으로 숨깁니다.When used as a declaration modifier, the new keyword explicitly hides a member that is inherited from a base class. 상속된 멤버를 숨기면 파생 버전의 멤버로 기본 클래스 버전의 멤버를 대신하게 됩니다.When you hide an inherited member, the derived version of the member replaces the base class version. new 한정자를 사용하지 않고 멤버를 숨길 수도 있지만 컴파일러 경고가 발생합니다.Although you can hide members without using the new modifier, you get a compiler warning. new를 사용하여 멤버를 명시적으로 숨기면 이 경고가 발생하지 않습니다.If you use new to explicitly hide a member, it suppresses this warning.

new 키워드를 사용하여 형식의 인스턴스를 만들거나 제네릭 형식 제약 조건으로 만들 수도 있습니다.You can also use the new keyword to create an instance of a type or as a generic type constraint.

상속된 멤버를 숨기려면 동일한 멤버 이름을 사용하여 파생된 클래스에 해당 멤버를 선언한 다음 new 키워드를 사용하여 이를 한정합니다.To hide an inherited member, declare it in the derived class by using the same member name, and modify it with the new keyword. 예:For example:

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

이 예제에서 BaseC.InvokeDerivedC.Invoke에 의해 숨겨집니다.In this example, BaseC.Invoke is hidden by DerivedC.Invoke. x 필드는 비슷한 이름으로 숨겨져 있지 않기 때문에 영향을 받지 않습니다.The field x is not affected because it is not hidden by a similar name.

상속을 사용한 이름 숨기기는 다음 중 한 가지 형식을 취합니다.Name hiding through inheritance takes one of the following forms:

  • 일반적으로 클래스 또는 구조체에 파생된 상수, 필드, 속성 또는 형식은 동일한 이름의 모든 기본 클래스 멤버를 숨깁니다.Generally, a constant, field, property, or type that is introduced in a class or struct hides all base class members that share its name. 이 사항이 적용되지 않는 경우가 있습니다.There are special cases. 예를 들어 호출할 수 없는 형식이 포함된 N이라는 이름의 새 필드를 선언하고 기본 형식에서 N을 메서드로 선언하면 새 필드가 호출 구문에서 기본 선언을 숨기지 않습니다.For example, if you declare a new field with name N to have a type that is not invocable, and a base type declares N to be a method, the new field does not hide the base declaration in invocation syntax. 자세한 내용은 C# 언어 사양멤버 조회 섹션을 참조하세요.For more information, see the Member lookup section of the C# language specification.

  • 클래스 또는 구조체에 파생된 메서드는 기본 클래스에서 동일한 이름의 속성, 필드 및 형식을 숨깁니다.A method introduced in a class or struct hides properties, fields, and types that share that name in the base class. 또한 시그니처가 동일한 기본 클래스 메서드도 모두 숨깁니다.It also hides all base class methods that have the same signature.

  • 클래스 또는 구조체에 파생된 인덱서는 시그니처가 동일한 기본 클래스 인덱서를 모두 숨깁니다.An indexer introduced in a class or struct hides all base class indexers that have the same signature.

동일한 멤버에 대해 newoverride를 모두 사용하면 오류가 발생합니다. 두 한정자는 함께 사용할 수 없는 의미를 지니고 있기 때문입니다.It is an error to use both new and override on the same member, because the two modifiers have mutually exclusive meanings. new 한정자는 동일한 이름의 새 멤버를 만들고 원래 멤버를 숨기도록 하는 반면,The new modifier creates a new member with the same name and causes the original member to become hidden. override 한정자는 상속된 멤버에 대한 구현을 확장합니다.The override modifier extends the implementation for an inherited member.

상속된 멤버를 숨기지 않는 선언에 new 한정자를 사용하면 경고가 발생합니다.Using the new modifier in a declaration that does not hide an inherited member generates a warning.

Example

이 예제에서 기본 클래스 BaseC 및 파생 클래스 DerivedC는 동일한 필드 이름 x를 사용하므로 상속된 필드의 값이 숨겨집니다.In this example, a base class, BaseC, and a derived class, DerivedC, use the same field name x, which hides the value of the inherited field. 이 예제에서는 new 한정자의 사용법을 보여 줍니다.The example demonstrates the use of the new modifier. 또한 정규화된 이름을 사용하여 기본 클래스의 숨겨진 멤버에 액세스하는 방법을 보여 줍니다.It also demonstrates how to access the hidden members of the base class by using their fully qualified names.

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
*/

Example

이 예제에서 중첩 클래스는 기본 클래스에서 이름이 동일한 클래스를 숨깁니다.In this example, a nested class hides a class that has the same name in the base class. 이 예제에서는 new 한정자를 사용하여 경고 메시지를 제거하는 방법과 정규화된 이름을 사용하여 숨겨진 클래스 멤버에 액세스하는 방법을 보여 줍니다.The example demonstrates how to use the new modifier to eliminate the warning message and how to access the hidden class members by using their fully qualified names.

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 한정자를 제거해도 프로그램은 컴파일되고 실행되지만 다음과 같은 경고가 발생합니다.If you remove the new modifier, the program will still compile and run, but you will get the following warning:

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

C# 언어 사양C# language specification

자세한 내용은 C# 언어 사양새 한정자 섹션을 참조하세요.For more information, see The new modifier section of the C# language specification.

참고 항목See also