new 한정자(C# 참조)
업데이트: 2007년 11월
한정자로 사용되는 new 키워드는 기본 클래스에서 상속된 멤버를 명시적으로 숨깁니다. 상속된 멤버를 숨기면 파생 버전의 멤버로 기본 클래스 버전의 멤버를 대신하게 됩니다. new 한정자를 사용하지 않고 멤버를 숨길 수도 있지만 이렇게 하면 경고가 발생합니다. new를 사용하여 멤버를 명시적으로 숨기면 이 경고가 나타나지 않으며 파생 버전이 대신 사용된다는 사실이 메시지로 표시됩니다.
상속된 멤버를 숨기려면 동일한 이름을 사용하여 파생된 클래스에 해당 멤버를 선언한 다음 new 한정자를 사용하여 이를 한정합니다. 예를 들면 다음과 같습니다.
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
이 예제에서 BaseC.Invoke는 DerivedC.Invoke에 의해 숨겨집니다. x 필드는 비슷한 이름으로 숨겨져 있지 않기 때문에 영향을 받지 않습니다.
상속을 사용한 이름 숨기기는 다음 중 한 가지 형식을 취합니다.
클래스 또는 구조체에서 파생된 상수, 필드, 속성 또는 형식은 동일한 이름의 기본 클래스 멤버를 모두 숨깁니다.
클래스 또는 구조체에 파생된 메서드는 기본 클래스에서 동일한 이름의 속성, 필드 및 형식을 숨깁니다. 또한 시그니처가 동일한 기본 클래스 메서드도 모두 숨깁니다.
클래스 또는 구조체에 파생된 인덱서는 시그니처가 동일한 기본 클래스 인덱서를 모두 숨깁니다.
동일한 멤버에 대해 new와 override를 모두 사용하면 오류가 발생합니다. 두 한정자는 함께 사용할 수 없는 의미를 지니고 있기 때문입니다. 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'.
다음 예제에서처럼 중첩 형식이 다른 형식을 숨기고 있을 경우 new 한정자를 사용하여 중첩 형식을 수정할 수도 있습니다.
C# 언어 사양
자세한 내용은 C# 언어 사양에서 다음 단원을 참조하십시오.
- 10.3.4 new 한정자