방프리

20.04.17 Chapter1. C# 언어 요소 (Item 10) 본문

C#/Effective C#

20.04.17 Chapter1. C# 언어 요소 (Item 10)

방프리 2020. 4. 17. 22:45

Item 10: 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라

 

부모클래스에서 정의한 함수를 자식 클래스 객체를 통해서 사용된다면 똑같이 동작한다는 것을 

상속 관계에 대해 공부할 때 배운다. 하지만 항상 예외가 존재하듯 부모클래스에 있는 함수라고 해서

상속 받는 모든 자식클래스들이 부모클래스에 있는 함수를 모두 사용하는 것은 아니다.

상황에 따라서는 사용할 수도, 사용하지 않을 수도 있고 전혀 다른 동작임에도 불구하고 함수명이

일치하는 경우도 존재한다.

다음과 같이 코드를 작성하면 둘 다 똑같은 동작을 할 것이라 개발자들은 생각한다.

하지만 다음과 같이 정의된다면 말이 달라진다. new 연산자를 통해 부모클래스에 있는 함수를 재정의 했기 때문이다.

new 연산자는 내부적으로 비가상 메서드처럼 동작하며 비가상 메서드는 가상 메서드와 달리 정적으로 바인딩된다.

컴파일 타임때 어떤 클래스로 정의가 될 지 정해진다는 뜻이다.

가상 메서드로 선언해버리면 정말 쉽겠지만, 그럴 경우엔 파생 클래스에게 모든걸 위임하는 꼴이 되버리므로

애초에 그렇게 계획하지 않았다면 그다지 좋은 선택지는 아니다.

만약 부모클래스와 같은 이름의 함수를 가져야하지만 (유지보수 단계에서 너무 많은 곳에서 사용되었을 때)

내용이 많이 달라진 경우 new 한정자를 사용해 새롭게 만들어주는 것도 하나의 방법이다.

하지만 저자는 이 또한 일종의 임시방편이며 내용이 달라진 경우에는 함수명을 바꾸는 것을 강조하였다.

Comments