C# 메소드 한정자 중에는 new
라는 것이 있습니다.
class BaseClass {
public void SomeMethod() => Console.WriteLine("BaseClass");
}
class DerivedClass : BaseClass {
public new void SomeMethod() => Console.WriteLine("DerivedClass");
}
(new DerivedClass() as BaseClass).SomeMethod();
// 결과 : BaseClass
new DerivedClass().SomeMethod();
// 결과 : DerivedClass
new
한정자는 부모 클래스의 메소드를 "숨긴다" 고 합니다.
virtual
/override
는 메소드를 재정의하여 다형성을 가지지만, new
는 override
와는 다르게 다형성을 가지지 않습니다.
class BaseClass {
public virtual void SomeMethod() => Console.WriteLine("BaseClass");
}
class DerivedClass : BaseClass {
public override void SomeMethod() => Console.WriteLine("DerivedClass");
}
BaseClass a = new DerivedClass();
a.SomeMethod();
// 결과
// DerivedClass
virtual
/override
는 위와 같이 작동합니다.
잘 알다싶이, C++에서도 Java에서도(virtual
은 필요없지만) override
는 부모 클래스의 메소드를 재정의하여 다형성을 가지게 됩니다.
그런데 C#을 배우면서 다소 생소한 new
한정자를 접하게 되었습니다.
부모 클래스의 메소드를 숨긴다고? 근데 new
를 쓰지 않더라도 똑같지 않나?
...
결론을 먼저 말하자면 new
한정자를 사용하는 것으로 달라지는 점은 없습니다.
아래는 관련 StackOverflow 답변입니다.
https://stackoverflow.com/a/30990937
짧게 이야기하자면 -- 이것은 필요하지 않다, 어떠한 차이점도 없으며 그저 가독성을 위해 존재한다.
new
한정자는 메소드를 숨긴다는 것을 명시적으로 표시하기 위해 있으며 실상 new
를 쓰지 않더라도 결과는 달라지지 않습니다.
C#을 처음 배우면서 이 한정자의 존재는 정말 혼란스러웠지만 StackOverflow에서 관련 내용을 알아보니 왜 존재하는 것인지 알 수 있게 되었습니다.