베이스 클래스에서 virtual로 선언하지 않은 멤버를 재정의하려는 경우 new 한정자를 사용할 수 있

다. 하지만 사용할 수 있다는 것과 잘 사용한다는 것은 전혀 다른 이야기다. 왜냐하면 virtual로

선언되지 않은 메서드를 재정의하려면 메서드의 동작 방식을 모호하게 만들 우려가 있기 때문이다.

베이스 클래스의 메서드와 하위 클래스에서 재정의한 메서드가 완전히 다른 내용을 구현했다

하더라도 이를 사용하는 대부분의 개발자는 두 메서드가 완전히 동일한 작업을 수행할 것으로 기대

할 것이다.

object c = MakeObject();

// MyClass 타입의 참조를 이용하여 메서드를 호출한다.
MyClass c1 = c as MyClass;
c1.MagicMethod();

// MyOtherClass 타입의 참조를 이용ㅇ하여 메서드를 호출한다.
MyOtherClass cl2 = c as MyOtherClass;
cl2.Magicmethod();

다음과 같이 MyOtherClass에서 new 한정자를 이용하여 MagicMethod()를 재정의했다면 두 메서드

의 호출 결과가 달라진다.

public class MyClass 
{
		public void MagicMethod()
		{
				Console.WriteLine("MyClass");
				// 세부 내용 생략
		}
}

public class MyOtherClass : MyClass
{
		// MagicMethod를 재정의
		public new void MagicMethod()
		{
				Console.WriteLine("MyOTherClass");
		// 세부 내용 생략
		}
}

이와 같이 코드를 작성하면 개발자들은 혼돈스러울 수밖에 없다. 동일한 객체를 이용하여 동일한

메서드를 호출했다면 동일한 작업이 실행되기를 기대하는 것은 당연하다. 메서드를 호출할때 사용한

참조나 레이블을 변경한다고 해서 동작 방식이 바뀔 것이라고 생각하지는 않을 것이기 때문이다.

이는 일관성이 없다고 봐야 한다. 앞의 예제에서 MyOtherClass 타입의 객체는 이 객체를 어떻게 참조

하느냐에 따라 다르게 동작한다. 사실 new 한정자는 비가상 메서드를 가상 메서드로 만드는 것이

아니라 클래스의 명명범위(naming scope)내에 새로운 메서드를 추가하는 역할을 수행한다.

비가상 메서드는 정적으로 바인딩되므로 MyClass.MagicMethod()를 호출하는 코드는 정확히 이

메서드를 호출한다. 런타임에 파생 클래스에서 새롭게 정의하고 있는 메서드가 있는지 찾지 않는다