메서드에 선언된 new modifier
- base class의 메서드를 숨김
- upcasting 하여 base class의 메서드를 사용할 수 있으나 이는 의도된 디자인에 반하는 행위이므로 위험
public class Base
{
public virtual void DoIt() {}
}
public class Derived : Base
{
public override void DoIt() {}
}
Base b = new Derived();
b.DoIt(); // Derived.DoIt 호출
- override는 virtual 메서드나 abstract에 사용
- 컴파일러가 마지막으로 정의한 구현을 사용하도록 하는 것
- 메서드가 base class를 참조한다고 하더라도, 오버라이딩된 구현을 사용
public class Base
{
public virtual void DoIt() {}
}
public class Derived : Base
{
public new void DoIt() {}
}
Base b = new Derived();
Derived d = new Derived();
b.DoIt(); // Base.DoIt 호출
d.DoIt(); // Derived.DoIt 호출
- new는 컴파일러가 부모 클래스의 구현 대신 자식 클래스의 구현을 사용하도록 하는 것
- 부모 클래스로 선언된 클래스는 부모 클래스의 구현을 사용할 것
객체의 타입을 정의하지 않는 new
// C# 할당 예제
void Example()
{
Foo foo = new Foo(); // Foo가 클래스라고 가정. 힙 영역에 할당 된다.
Bar bar = new Bar(); // Bar가 구조체라고 가정. 스택 영역에 할당 된다.
}
- new 키워드의 사용이 객체를 Heap에 저장하는지 stack에 저장하는지 결정하지 않는다
- 객체의 타입에 따라 결정된다
출처