ITEM 10 :: EFFECTIVE C#


안녕하세요, 10번째 시간입니다. 자축합니다, 두자리 수!


이번 챕터는 그리 긴 내용은 아닙니다만, 어찌보면 굉장히 당연하면서도, 특정한 상황에서의 대처방법에 대해 확실하게 알 수 있었던 챕터입니다. new 한정자에 대한 기능은 이러한 곳에서도 쓰인다 정도로 알고 있으면 좋을 것 같습니다. 자, 시작해볼까요.

설명

  1. 먼저 new 한정자에 대한, 이번 챕터의 기능을 설명해야 한다.

  2. Virtual(가상)함수로 선언되지 않은 멤버메소드를 재정의 하려는 경우에는 new 한정자를 사용할 수 있다.

  3. 하지만, 그것이 좋은 것은 아니다란 점을 이 책에서는 분명히 말하고 있다.

  4. 왜냐면, 베이스 클래스(이하 부모클래스)에 A라는 기능을 가진 A-1 메서드를 자식 클래스에서 B라는 기능을 가진 A-1메서드로 new 한정자를 이용해 선언했다고 생각하면 된다. 즉, 부모 클래스의 A라는 기능을 이용하고 싶었는데, B라는 기능이 호출되는 것이다. 이 사실을 알고있는 개발자는 알고 있으니, 부모 클래스의 A 기능만을 호출하여 사용하면 되나, 이것이 여러군데에 배포되었고, 이 사실을 개발자만이 아는 상황이라면, 같은 함수를 호출했는데도 달라진 기능에 대해 알지못하는 다른 개발자들의 고충이 생긴다는 것이다.

  5. 이러한 모호함이 있으므로, 부모클래스의 메서드가 그 기능에서 업그레이드 되는 경우가 아니라면 new 한정자의 사용을 자제해야 한다는 것이다.

그러면 언제 사용해?

  • 물론, 특정상황에서는 new 한정자를 쓰는 것이 좋을 경우도 있다.

  • 예를들어, 부모 클래스가 널리 배포된 상태에서 A라는 멤버메소드의 기능이 존재하는데, 이번에 새로 배포하기로 한 자식 클래스에서 A멤버메소드의 기능을 변경된 것으로 사용하게 해야하는 경우, 심지어 부모 클래스의 A멤버 메소드는 가상 함수가 아니어서, 오버라이딩에 안전하지 않다. 이러한 경우가 바로 new 한정자를 사용할 법한 상황이다.

  • 방법이 new 한정자를 사용하는 방법만 있는 것은 아니다. 부모 클래스 자체의 A 메소드를 변경하는 방법도 있는데, 이 방법의 경우, 베이스 클래스가 이미 많이 배포되었거나, 이 기능을 이용하는 개발자가 많을 경우, 자식 클래스의 기능을 위해 부모클래스의 기능을 바꿔버린다는 것은 본말전도가 되어버린다.

  • 이러한 경우, new 한정자를 통해 자식 클래스의 A메서드를 재정의하는 것이다.

  • 그렇게 되면, 부모 클래스의 객체를 사용할 때, A메서드는 A의 기능을 가지고 있는 A메서드를 불러올 것이고, 자식 클래스의 객체를 사용할 때에는 A메서드라는 이름의 재정의된 B의 기능을 가지고 있는 새로운 A 메서드를 불러올 것이기 때문이다.

  • 하지만, 이러한 경우가 아니라면 사용을 지양해야 한다. 그것은 코드의 모호성을 높이기 때문이다.

정리

정리하자면, 가장 좋은 것은 부모 클래스의 A메서드를 Virtual로 정의하는 방법이지만, 그렇지 않다라고 한다면, new 한정자를 이용하여 부모와 자식 클래스간의 구분을 명확하게 해야한다는 것이다. 그럼에도 최대한 사용을 지양해야한다는 것은 틀림이 없다!