Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Prometheus
- javascript
- browserslist
- 터치 스와이프
- webpack
- Docker
- HTML
- swiper
- Shadow DOM
- scroll-snap
- web component
- 우아한테크코스 레벨3
- fastify
- react-dom
- docker-compose
- Grafana
- live share
- 유한 상태 머신
- react
- RTL8852BE
- 우테코
- AX210
- custom element
- 데모데이
- typescript
- 무선랜카드 교체
- GitHub Pages
- github Actions
- 우아한테크코스
- CSS
Archives
- Today
- Total
IT일상
C# 메소드에서의 new 한정자는 꼭 필요한가? 본문
리뉴얼 된 블로그로 보기: 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 한정자는 메소드를 숨긴다는 것을 명시적으로 표시하기 위해 있으며 실상 new를 쓰지 않더라도 결과는 달라지지 않습니다.
C#을 처음 배우면서 이 한정자의 존재는 정말 혼란스러웠지만 StackOverflow에서 관련 내용을 알아보니 왜 존재하는 것인지 알 수 있게 되었습니다.
Comments