[C++] 누구나 쉽게, 리팩토링(클린코드)-① 순수가상함수/추상클래스

 

리팩토링이란 

 

 

리팩토링은 내부의 코드를 개선하는 하나의 방법론이자 솔루션을 뜻합니다. 

 

리팩토링을 한마디로 말하자면, 나쁜 냄새가 나는 코드를 최적화하는 것입니다. 여기서 주의할 점은 런타임 시의 최적화가 아니라 프로그래밍을 할 때 버그 없는 프로그램을 만드는 것입니다외부 인터페이스는 그대로 두고 내부의 코드만을 개선하여 재사용과 가독성을 높이는 데 목적이 있습니다.

 

참고로 리팩토링은 전체적인 아키텍처에서부터 개선해나가는 디자인패턴과 떼어놓을 수 없는 관계입니다. 개념은 동일한데 바라보는 관점이 다른 것입니다.

 

 

 

이제 본격적으로 리팩토링을 시작합니다.

 


1. 순수가상함수와 추상클래스

 

문제 발생

먼저 접하기 쉬운 Animal 클래스를 구현해볼까요! Dog개, Cat고양이 클래스도 함께 구현합니다.

 

개발자들이 분업하여 코딩을 합니다.

모든 동물들은 울 수 있으니 Animal 클래스의 자식 클래스들은 cry() 함수를 꼭 구현해야만 한다고 합시다.

 

그런데 Cat 클래스를 코딩한 개발자가 술먹다가 cry() 구현을 잊었다면 프로그램에 문제가 생기겠지요.

 

int main()

{

     Dog dog;

     dog.cry();

 

     Cat cat;

     cat.cry();  // 이곳에서 에러가 나겠지요!

}

 

 

함수가 있어야할 클래스에 함수가 없기 때문입니다.

 

Error : Class "Cat"에 "Cry"멤버가 없습니다.

 

 

 

 

문제 해결

 

그렇다면 cry함수처럼 어떠한 기능을 필수로 구현해야할 때, 강제할 방법이 없을까요? 모든 개발자들이 볼 수 있도록 “cry 함수를 구현해주세요”라고 주석을 달아줄까요? 문서를 전달할까요? 

 

 

반드시 기능을 구현하도록 강제화하기 위해 순수가상함수를 사용하면 됩니다.

 

 

 

♥ 순수 가상함수는 구현이 없는 가상함수를 말합니다.

virtual 키워드를 사용하여  구현대신 가상함수에 Null값을 대입하면 순수 가상함수가 됩니다.

virtual void cry() = 0; 과 같은 형태로 나타납니다.

  * 가상함수 : virtual 키워드를 사용하여 몸체를 구현

 

 

♥ 추상 클래스 : 순수 가상 함수를 하나 이상 가지고 있는 클래스

(Java에서는 abstract라 불립니다.)

 

 

 추상 클래스는 객체를 생성할 수 없 습니다. 온전한 정보를 가지고 있지 않기(몸체가 음슴) 때문이죠.

순수 가상함수가 있는 부모 클래스를 상속받는 자식 클래스는 무조건 그 함수를 구현해주어야 합니다.

 

 

 

순수 가상함수를 이용하여 기능 구현을 강제화합니다.

 

 

이렇게 Animal 클래스를 추상 클래스로 구현한다면, Animal을 상속받는 클래스는 모두 virtual void cry()를 자동적으로 물려받게 되고 이를 재정의 하지 않는다면 역시 순수 가상함수를 가진 추상클래스가 되어 객체가 만들어지지 않습니다.

 

예를 들어 Cat의 cry 함수를 구현하지 않는다면  위에서의 "cry 멤버가 없습니다" 에러와 달리 Cat의 객체를 만드는 부분에서부터 에러가 나게 됩니다.

 

Error : 추상 클래스 형식 "Cat"의 개체를 사용할 수 없습니다.

 

 

 

 

정리

  o 순수 가상함수를 사용하여 구현해야할 기능을 강제할 수 있습니다. 

  o 이때 순수 가상함수를 하나이상 포함한 클래스를 추상클래스라고 합니다.

 

  

*  순수 가상함수 vs 가상함수

virtual 키워드를 사용하여 몸체를 구현한 가상함수는 자식 클래스에서 구현을 하지 않아도 객체가 될 수 있습니다. 즉 강제화 없이 단지 재정의를 위한 것입니다.

종류 키워드 기능
순수 가상함수 virtual void 함수명() = 구현 강제화, 재정의
가상함수 virtual void 함수명() { 몸체 구현 } 재정의

 

 

 

다음엔 시간엔 리팩토링 2탄, 인터페이스로 만나요

 

 

 

 

 

 

 


[ 리팩토링 시리즈 ]


https://mk28.tistory.com/entry/Refactoring누구나-쉽게-리팩토링-①-추상클래스" target="_blank" rel="noopener">[C++] 누구나 쉽게, 리팩토링(클린코드)-① 순수가상함수/추상클래스


https://mk28.tistory.com/entry/C-누구나-쉽게-리팩토링-②-순수가상함수추상클래스">[C++] 누구나 쉽게, 리팩토링(클린코드)-② 인터페이스


https://mk28.tistory.com/entry/C-누구나-쉽게-리팩토링클린코드-③-캐스팅">[C++] 누구나 쉽게, 리팩토링(클린코드)-③ 캐스팅(이번글)


 

 

 

 

 

 

 

 

 

 

반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️