[C++] 상속과 다형성 이용해 보기

2017. 7. 11. 22:45공부 자료

[C++] 상속과 다형성 이용해 보기


이번에는 C++에서 객체 지향 프로그래밍의 꽃인 상속과 다형성을 이용 해 보기로 하겠습니다. 


객체 지향 프로그래밍의 특징에는 

1. 추상화( Abstraction ) : Class 라는 하나의 자료로 무엇이든 표현 가능하다.

2. 캡슐화( Encapsulation ) : 숨기고 싶은 내용을 숨길 수 있다.

3. 상속( Inheritance ) : Class의 특징을 이어받거나 이어줄 수 있다.

4. 다형성( Polymorphism ) : 하나의 Class 가 여러 역할을 할 수 있다.

의 4가지가 존재합니다. 이외에도 5원칙이라는 개념이 있지만 여기서는 다루지 않겠습니다.


저는 물론 모든 특징들이 객체 지향 프로그래밍에서 중요하겠지만, 상속과 다형성이 특히 중요하다고 생각됩니다.

추상화야 자료 구조를 하면서 이해 가능한 내용이며, 캡슐화는 들여다보면 쉽게 이해할 수 있는 내용이라고 생각되어지지만, 상속과 다형성의 존재 의의는 한눈에 익숙해지기 어려운 내용이기 때문입니다.


상속이란 부모 Class의 역할을 하면서 동시에 부모보다 더 세분화된 역할을 하는 개념입니다. 부모 Class가 Color라면 자식 Class는 그를 구현한 Red, Blue, Green 같은 느낌이겠죠?


다형성이란 하나의 Class가 여러 역할을 하는 것이라고 저는 생각합니다. 여러 가지 역할이라니 알아듣기 힘들겠지만, 잘 생각 해 봅시다.


예를들어 사람은 척추동물에 영장류, 사람과 라고 분류됩니다. [각주:1] 이를 언어로 구현 해 보면


class Vertebrate;                            // 척추 동물
class Primate : public Vertebrate;       // 영장류
class Person : public Primate;            // 사람


과 같이 쓰일 수 있습니다.


이 때, class Person 은 Vertebrate 가 할 수 있는 일 도, Primate 가 할 수 있는 일도 할 수 있는 것입니다.


이족 보행이라던가, 무엇인가를 먹는다거나, 숨을 쉰다거나, 허리를 핀다는 행동( Method ) 를 하는 것 입니다.


이런 상속과 다형성 덕분에 추상화 된 자료형을 통해 더 복잡한 자료형을 만들거나 할 수 있는 것입니다. 이렇기에 상속과 다형성을 제일 중요하다고 생각합니다. 물론 4가지 특징중에 덜 중요한 특징은 없습니다 ㅎㅎ..


서론이 길었는데, C++에서 이러한 상속과 다형성을 사용 해 봅시다. 지난 포스트에 이어 필자는 C++ 공부를 위해 오목을 구현 해 보고 있었습니다. 


게임 판을 만들기 위해 구현하던 도중, 게임 판을 그냥 int 형으로 구현하여 Switch-Case를 사용하기 보단, 다형성을 이용하여 더 간단하고 확장성 있는 코드를 만들 수 있을 것이라고 생각이 되어 이렇게 구현 하였습니다. ( 사실 대부분의 Switch-Case 구문은 다형성을 이용하여 중복되는 코드 없이 해결 가능합니다. )



[ 사진1 : Square 를 사용한 상속 ]


이러한 방식으로 구현하게 된다면, 판을 보여주는 함수를 만들 때에도 각 PrintSquare() Method 만 수정하면 되기 때문에, 그리고 모든 Black, White 등의 Square를 Class Square 라는 하나의 역할로 묶어 줄 수 있습니다.


이를 사용하는 코드는 다음과 같습니다.


그저 Square의 2차원 배열을 선언하고 각각에다 무작위로 집어 넣은 뒤, 결과를 보여주는 코드입니다. 한 부분씩 보자면 다음과 같습니다.


1. 생성 : Class 의 생성자를 만들지 않았지만, Default 생성자가 있어 아무런 일을 하지 않고, 공간을 만드는 생성자가 있습니다.

인자가 있는 생성자를 호출하기 위해서는 전의 Post인 Struct와 Class 차이 살펴보기 를 살펴 보시면 알 수 있습니다.

Location x(2,3) 과 같이 호출합니다.


new 라는 키워드는 malloc과 같은 역할, 즉, 동적 할당의 역할을 합니다. C와 동일하게 포인터 변수에 대해서 쓸 수 있겠습니다.


번 코드에서는 Square 2차원 포인터 변수를 사용하여 new 를 통해 하나씩 생성 해 주었습니다.


2. 출력 : 간단히 모든 Square에 대해서 PrintSquare()를 호출하기만 하면 각 색에 맞는 Square를 화면에 출력하게 됩니다.


3. 삭제 : C++에는 메모리 할당과 해제를 사용자가 할 수 있도록 해 두 었습니다. 그래서 JAVA에 존재하지 않는 소멸자라는 개념도 있지만, 여기선 다루지 않습니다. 그저 메모리를 해제하는 delete라는 키워드를 사용하여 해제합니다.


[ 사진 2 : 결과 사진 ]


결과가 보기 나쁘지만 예상한 대로 결과가 나오긴 해서 다행이군요. printf 를 통해서 출력 할 시 자동으로 2 Byte씩 나왔던 것 같은데, 어째서 1 Byte 씩 겹쳐서 출력되는지는 모르겠습니다 ㅎㅎ.. 다음 포스트는 이러한 오류를 해결하게 되겠군요.


이러한 코드들은 Github에 올라와 있습니다. 오목 AI를 구상중에 있기에 프로젝트 이름이 Omok AI 입니다.






참고자료

- 참고자료1

- 참고자료2

- 참고자료3

  1. https://ko.wikipedia.org/wiki/%EC%82%AC%EB%9E%8C [본문으로]