IT일상

C# 메소드에서의 new 한정자는 꼭 필요한가? 본문

카테고리 없음

C# 메소드에서의 new 한정자는 꼭 필요한가?

solo5star 2020. 10. 9. 18:56
리뉴얼 된 블로그로 보기: https://solo5star.dev/posts/8/

 

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 답변입니다.

 

"짧게 이야기하자면 -- 이것은 필요하지 않다, 어떠한 차이점도 없으며 그저 가독성을 위해 존재한다."

 

new keyword in method signature

While performing a refactoring, I ended up creating a method like the example below. The datatype has been changed for simplicity's sake. I previous had an assignment statement like this: MyObject

stackoverflow.com

 

new 한정자는 메소드를 숨긴다는 것을 명시적으로 표시하기 위해 있으며 실상 new를 쓰지 않더라도 결과는 달라지지 않습니다.

 

C#을 처음 배우면서 이 한정자의 존재는 정말 혼란스러웠지만 StackOverflow에서 관련 내용을 알아보니 왜 존재하는 것인지 알 수 있게 되었습니다.

Comments