본문 바로가기

Dev::DotNet/C#

new 한정자(new Modifier)

class 를 상속받으면 당연히 상속받은 class 의 속성과 기능을 사용할 수 있다.


하지만 흔히 기본 클래스의 기능을 변경하여 사용하며

그럴 때는 virtual 을 사용하던 abstract 를 사용하던 다양하게 재정의가 가능하다.


하지만 new 한정자를 사용해서도 가능하다.


MSDN 에는 

"한정자로 사용되는 new 키워드는 기본 클래스에서 상속된 멤버를 명시적으로 숨깁니다." 

라고 적혀있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
class Class1
{
    public void TestMethod()
    {
    }
}
 
class Class2 : Class1
{
    public void TestMethod()
    {
    }
}
cs

하나의 클래스를 상속을 받아서 부모 클래스가 가지고 있는 메소드와 동일한 이름의 메소드를 자식에 선언하면

Visual Studio 에서는 다음과 같은 경고를 표시해준다.


'Class2.TestMethod()'은(는) 상속된 'Class1.TestMethod()' 멤버를 숨깁니다. 숨기려면 new 키워드를 사용하십시오.


에러가 아니라 경고다.


동일한 이름이 있어서 메소드가 숨겨지는데 너가 숨길려고 일부러 그렇게 한거냐? 그런 거면 new 키워드로 명시적으로 표시해 달라는 소리다.


1
2
3
4
5
6
class Class2 : Class1
{
    public new void TestMethod()
    {
    }
}
cs

그래서 이렇게 new 키워드를 넣어주면 Visual Studio 는 안심을 하고 경고를 표시하지 않게 된다.


이렇게 하면 Class2 는 상속받은 Class1 의 TestMethod 을 숨기고 나의 TestMethod 를 만들었기 때문에 

나의 TestMethod 를 사용할 수 있다.


그렇다면 override 를 하면 되지 왜 굳이 메소드를 숨기는가? 무슨 차이가 있는가?

간단한 테스트를 해보면 바로 알 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Class1
{
    public virtual void TestMethod()
    {
        System.Windows.MessageBox.Show("Class1");
    }
}
 
class Class2 : Class1
{
    public override void TestMethod()
    {
        System.Windows.MessageBox.Show("Class2");
    }
}
cs

이렇게 override 하고


1
2
3
4
5
Class1 cls1 = new Class2();
cls1.TestMethod();
 
Class2 cls2 = new Class2();
cls2.TestMethod();
cs

생성해서 TestMethod 를 호출하면 

당연히 2개다 Class2 로 만들었으니 "Class2" 라는 메시지 박스가 2번 표시될 것이다.


그럼 이제 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Class1
{
    public void TestMethod()
    {
        System.Windows.MessageBox.Show("Class1");
    }
}
 
class Class2 : Class1
{
    public new void TestMethod()
    {
        System.Windows.MessageBox.Show("Class2");
    }
}
cs

메소드를 new 로 숨기고 동일하게 해보면 

첫 번째로 "Class1" 이 표시되고, 두 번째로 "Class2" 가 표시되는 것을 볼 수 있을 것이다.


분명히 Class2 로 2개의 객체를 만들었는데 다르게 나왔다.


숨김은 override 처럼 덮어 쓴 것이 아니라 그냥 숨겨놓은 것이기 때문에 

부모 클래스로 형변환이 되어있다면 그대로 따라가게 된다.



MSDN : http://msdn.microsoft.com/ko-kr/library/435f1dw2.aspx