new 키워드

메서드에 선언된 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에 저장하는지 결정하지 않는다
  • 객체의 타입에 따라 결정된다

출처

Categories: ,

Updated: