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

Refactoring은 내부의 코드를 개선하는 하나의 방법론이자 솔루션입니다.

대부분 리팩토링은 OS에 독립적인 Java에서 이루어지는데요.

그러나 객체 지향의 내부 구조를 이해를 돕기 위해 C++로 진행하겠습니다.


리팩토링을 한마디로 말하자면, 나쁜 냄새가 나는 코드를 최적화하는 것입니다.

여기서 주의할 점은 런타임에서의 최적화가 아니라!

코드를 짤 때, 버그 없는 프로그램을 만드는 것입니다.

외부 인터페이스는 그대로 두고 내부의 코드만을 개선하여 재사용과 가독성을 높이는 데 목적이 있습니다.


특히 전체적인 아키텍처에서 개선해나가는 디자인패턴과 떼어놓을 수 없는 관계입니다.

리팩토링과 디자인패턴의 개념은 동일한데, 바라보는 관점이 다를 뿐 입니다!


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




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


먼저, 가장 접하기 쉬운 Animal 클래스를 구현해볼까요!

Dog, Cat 클래스도 함께 구현합니다.



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

동물들은 우니, 우므로? 울기 때문에?? 우니까?

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


그런데 Cat 클래스를 코딩한 개발자가 술먹다가

cry()를 구현하지 않았다고 하면, 프로그램을 돌릴 때 문제가 생기겠지 요.


int main()

{

  Dog dog;

  dog.cry();


  Cat cat;

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

}



그렇다면 cry함수처럼 어떠한 기능 을 강제해야할 때, 어떻게 할 수 있을까요?

모든 개발자들이 볼 수 있도록 “cry 함수를 구현해주세요”라고 주석을 달아줄까요? 문서를 전달할까요? 아니 져!!!



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


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

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

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


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

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


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

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





이렇게 Animal 클래스를 추상 클 래스로 구현한다면,

Animal을 상속받는 클래스는 모두 virtual void cry()를 자동적으로 물 려받게 되고

순수 가상함수를 가지므로 이를 재정의 하지 않는다면 역시 추상클래스가 되어, 객체가 만들어지지 않습니다.


Cat의 cry 함수를 만들지 않는다면 위에서의 "cry 멤버가 없습니다" 에러와 달리

Cat의 객체를 만드는 부분에서부터 에러가 납니다.




<정리>
순수 가상함수를 사용하여 구현해야할 기능을 강제화할 수 있습니다. 
이 때 순수 가상함수를 하나 이상 포함 한 클래스를 추상 클래스라고 합니다.



*

참고로 

virtual 키워드를 사용하여 몸체를 구현한 가상함수는 자식 클래스에서 구현을 하지 않아도 객체가 될 수 있습니다.

즉, 강제화가 안 되어있지요! 단지 재정의를 위한 것입니다.



순수 가상함수 virtual void cry() = 0 

기능 강제화(o)

가상함수

virtual void cry() { 몸체구현 } 기능 강제화(x)



끝-

다음엔 인터페이스로 만나요

반응형
그리드형

'컴퓨터공학과 > 그외' 카테고리의 다른 글

[Refactoring] 3. 캐스팅  (0) 2015.11.18
[Refactoring] 2. 인터페이스  (0) 2015.10.29
Top 10 IT Trends for 2015  (0) 2015.06.29
[ML] Linear Classification  (0) 2015.06.12
[WEKA] WEKA사용하기 - Experimenter모드  (0) 2015.04.29

댓글

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