심플하게 말해서 객체지향 프로그래밍은 프로그래밍을 전체의 흐름으로 보지 않고 객체를 기반으로 해서 구현하는 것입니다.

객체지향 프로그래밍에는 4개의 특징과 5가지 원칙이 있습니다 그것에 대해서 예제 코드와함께 설명하겠습니다.


예제코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// TEST.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
class 존재
{
private:
    int 세상속의X축위치;
    int 세상속의Y축위치;
    int 세상속의Z축위치;
 
public:
    virtual void 그려지다() { cout << "나 그려진다!" << endl; }
    virtual void 타입을말해봐() { cout << "객체다!" << endl; }
};
 
class 생물 : public 존재
{
private:
    TCHAR* 생물의이름;
    int 공격력;
    int 방어력;
    int 수명;
 
public:
    virtual void 이동() = 0;
    virtual void 사망() = 0;
    void 넌뭐니?() { cout << "난 생물이다!!!!!!" << endl; }
};
 
class 괴물 : public 생물
{
private:
    int 생명력;
 
public:
    virtual void 이동() { cout << "괴물 이동한다." << endl; }
    virtual void 사망() { cout << "괴물 죽는다." << endl; }
    void 포효하다(void);
    void 공격하다(const int 데미지);
};
 
class 사람 : public 생물
{
private:
    int 공격력;
    int 방어력;
 
public:
    virtual void 이동() { cout << "사람 이동한다." << endl; }
    virtual void 사망() { cout << "사람 죽는다." << endl; }
    virtual void 그려지다() { cout << "사람은 다르게 그려진다" << endl; }
    void 말하다(void);
    void 먹다(void);
    void 공격하다(void) { cout << "사람 이동한다." << endl; }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    사람 철수;
 
    철수.타입을말해봐();
    철수.그려지다();
    철수.넌뭐니();
    철수.이동();
    철수.사망();
 
    cout << endl;
 
    생물* 고질라 = new 괴물;
    고질라->이동();
    생물* 울트라맨 = new 사람;
    울트라맨->이동();
 
    return 0;
}


4가지 특징


1. 추상화 

프로그램의 구조를 구조와 단계로 생각하기 전에 추상화 시켜서 생각 할 수가 있다. 이는 상속과도 밀접한 개념으로 객체들이 가진 공통적인 데이터등을 뽑아내는 작업입니다.

당연히 예를 들면 더욱더 편할 것입니다.

먼저 존재라는 클래스를 정의하고 그 존재의 상속을 받는 생물이라는 클래스를 만들고 또 그를 상속받는 괴물이라는 클래스를 만들었습니다.

즉 말그대로 클래스를 정의함에 있어서 공통되는 데이터를 뽑아내며 기능으로서의 클래스가 아니라 현실과 대비하여 추상적으로 프로그래밍을 할 수 있게 되는 특징이 됩니다.


1. 캐릭터를 만든다? 

2. 고민하지 않고 캐릭터 클래스를 만든다. 

3. 어 근데 몬스터와 플레이어가 모두 같은 걸 쓰네? 

4. 공통적인 변수를 빼내어 그 상위 클래스인 생물 클래스를 만든다.


2. 캡슐화

괴물 클래스를 보겠습니다. 생명력과 공격력은 private: 키워드로 묶여있습니다. 저 키워드는 클래스를 만들어도 외부에서 내부의 맴버를 사용할 수 없게 만드는 것입니다.

즉 괴물의 private 맴버인 생명력과 공격력을 직접 바꿀 수는 없습니다.

하지만 바깥으로 들어나야 몬스터를 죽이던가 살리던가 혹은 몬스터가 공격하거나 방어하는 상호작용이 이루어 질 것입니다.

그것을 내부의 함수를 통해서 외부에서 이용하게 합니다. 공격한다! 라는 기능자체를 만들어 내는 것이지요. 

즉 내부의 데이터 값을 기반으로해서 클래스 내부에 있는 기능만을 바깥으로 내보이는 것입니다.


1. 몬스터는 생명력이 있어. 

2. 외부에서 맘대로 수정하지 못해!

3. 외부에 공개된 실행할수 있는 맞는다는 기능 공격한다는 기능만을 외부에 공개할께 너희들은 내가 공개한 것만 사용해.

 

* 보너스 부록

여기에 +하여 정보은닉이라는 특징이 있는데이는 캡슐화와 거의 비슷한 의미를 가진다.

API를 사용하려는 사용자에서 필요 이상의 데이터나 잘못된 사용을 금지하고 사용자에게 필요한 정보만을 공개하며 나머지를 은닉하는 것을 의미한다. 어찌 보면 캡슐화와 거의 같은 개념이며이 녀석을 분리 시킬경우 5대 특징으로 표시한다.


3. 상속성

존재 -> 생물 -> 괴물로 이어지는 상속라인을 보면 알겠지만 괴물은 존재와 생물이 가지고 있는 클래스 구조는 계층적으로 아래로 내려오며 상위의 함수나 맴버변수들을 모두 사용할 수 있습니다. 즉 새로운 기능을 재정의할 필요가 없어지는 것이죠.

예를 들기 위해서 실행 결과를 한번 보겠습니다.




철수는 자신의 상위 클래스의 기능들을 구현해서 사용하고 있습니다.

하지만 무리 없이 사용할 수 있죠. 더 나아가서 자신이 다르게 사용하고 싶은 함수는 자신이 다시 재정의 해서 사용합니다.

상속을 하게 되면 상속을 통해서 괴물이나 사람은 그려지다라는 기능에 대해서 굳이 자신에게 구현을 하지 않아도 부모 클래스의 기능으로 사용이 가능해집니다. 

코드의 재사용성을 높여주게 되며 상속을 통해서 클래스를 추상화시키는데에도 도움이 됩니다.


4. 다형성

마지막으로 울트라맨과 고질라는 같은 생물* 형입니다. 하지만 실행은 고질라는 괴물 이동한다. 울트라맨은 사람 이동한다. 라는 글을 출력합니다.

virtual키워드를 이용해서 구현한 함수는 동적 바인딩이라는 작업을 거칩니다. 

동적 바인딩을 먼저 이해하기 전에 동적할당을 먼저 이해하면 편합니다. 

tmain() 함수를 보면 마지막즈음 포인터를 이용해서 사람을 동적할당 하고 있습니다.

이때 포인터의 타입은 생물* 이지만 할당은 괴물* 사람*입니다. 즉 동적할당을 위해서 받아들인 타입과 상관없이 실제 할당받은 객체타입의 함수를 실행합니다. 

이 모든 과정은 프로그램의 런타임중에 일어나게 됩니다. 이것이 동적 바인딩 입니다. 

즉 하나의 타입으로 보이는 객체가 실제 기능의 실행에서는 각자 다르게 동작하게 되는 것입니다.


virtual 키워드를 설명하기 가장 좋은 특징입니다.


알게된점 1)

C++은 디폴트가 비가상함수이고,
자바는 디폴트가 가상함수이다!!! (Oh ho)

'게임개발공부 > C++' 카테고리의 다른 글

const_cast의 난점.  (0) 2014.07.08
OOP객체지향 프로그래밍 1) 5대 원칙  (1) 2014.06.27
C++ 과 C의 차이점  (2) 2014.06.25
Posted by JJOREG