본문 바로가기
책/Effective C#

Effective C# - Item10 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라

by 코딩하는 돼징 2023. 11. 22.
반응형

베이스 클래스에서 virtual로 선언하지 않은 멤버를 재정의하려는 경우 new 한정자를 사용할 수 있다. 하지만 사용할 수 있다는 것은 전혀 다른 이야기이다. 왜냐하면 virutal로 선언되지 않은 메서드를 재정의하면 메서드의 동작 방식을 모호하게 만들 우려가 있기 때문이다.

 

new한정자를 활용해도 좋은 경우는 베이스 클래스에서 이미 사용하고 있는 메서드를 재정의하여 완전히 새로운 베이스 클래스를 만들어야하는 정도이다. 이미 널리 사용되고있는 메서드가 있어서 이를 사용하는 코드를 일일이 찾아서 수정하기 어렵거나 혹은 외부 어셈블리에서 이 메서드를 사용하고 있어서 코드를 수정할 수 없는 경우라면 new한정자를 사용해볼 만하다.


코드 예시

public class BasePiggy
{
    public void Weight()
    {
    }
}

01 이름 수정

이름 수정을 통해 기본 클래스의 Weight메서드와 구분

public class MyPiggy : BasePiggy
{
    public void Weight2()
    {
        base.Weight();
    }
}

02 new한정자 사용

new한정자를 사용하여 base클래스의 Weight메서드를 재정의 하였다. 이경우에는 base.Weight()를 사용하여 기본 클래스의 Weight메서드를 호출 할 수 있다.

public class MyPiggy : BasePiggy
{
    public new void Weight()
    {
        base.Weight();
    }
}

 

 

 

 

결론

new한정자를 사용할 때는 각별한 주의가 필요하다. 베이스 클래스가 업그레이드되어 메서드의 이름이 충돌하는 경우는 매우 특별한 경우라서 new 한정자를 검토해볼 수 있지만 그외의 경우라면 절대로 사용해서는 안된다.

 

 

 

본 게시글은 Effective C#을 읽고 정리하였습니다.

 

반응형

댓글