삽질의 현장/- C++

#027_시(c)시(c)해서 C++?!_dynamic_cast

shovelman 2015. 7. 24. 07:41

안녕하세요... 삽잡이 입니다...

비가 센치하게 내리군요... 오늘 이 축축한 거리에 나가야하다니...

빗소리의 나의 몸을 기대어... 물 흐르듯이 흘러 나가리... 

푸하하하;;;


아무튼... 오늘은 dynamic_cast에 대해서 알아보도록 하겠습니다...


OOP 즉 객체지향 프로그램의 특징 중 하나인

다형성에 의해서 기반클래스에다가 파생된 객체를 받을 수 있습니다.


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
 
 
 
#include <iostream>
#include <string>
using namespace std;
 
class Job
{
    int salary;
    string name;
public:
    Job(int _salary, string _name)
    {
        this->salary = _salary;
        this->name = _name;
    }
    void Work()
    {
        cout << "일주일은 월화수목금금금..." << endl;
    }
};
 
class Programmer
    :public Job
{
public:
    Programmer(int _salary, string _name) :Job(_salary, _name)
    {
 
    }
    void Coding()
    {
        cout << "불타는 코딩~!!" << endl;
    }
};
void main()
{
    Job *sap[2];
    sap[0= new Job(4000"sapzape");
    sap[1= new Programmer(5000"삽잡이");
    sap[0]->Work();
    //sap[1]->Work();
}
 
 
cs


자... 모든 직업을 가지신 분들은 일을 하면 이 노래를 부릅니다....

"일주일은 월화수목 금금금!" 맞나요? 하하...


아무튼... Job이라는 기반 클래스를 배열형식으로 만들어

기반 클래스 형식의 Job 객체와 파생클래스 Programmer 객체를 담았습니다...


이는 OOP의 장점인 바로, '다형성'에 의해 가능한 일이죠...

객체 관리가 참 편합니다... 하나의 종류로 여러 종류의 객체를 관리할 수 있으니 말입니다...


하지만 위 코드의 주석을 보시면 아시겠지만,

Coding 이라는 Programmer 클래스의 고유의 메서드를 사용할 수 없는 

다형성의 한계가 있습니다.


즉, 파생 형식만을 가지고 있는 특정 기능이 있는데, 

이 기능에 대해서는 기반 클래스가 접근하지 못한다는 한계가 있다는 것입니다.


다형성에 의해서 공통적인 기능만을 사용한다면 효과적이지만

위와 같은 경우라면... 하지만 C++에서는 dynamic_cast를 제공해줍니다...


자... 


1
2
3
4
5
 
 
Programmer *pro = dynamic_cast<Programmer *>(sap[1]);
 
 
cs


이렇게 Programmer 형식의 pro를 하나 만들어두고 dynamic_cast를 진행합니다.

Programmer 객체라면 

Programmer*에 해당되는 sap[1]의 값을 제공하여 pro에 저장하는 것입니다...

즉, sap[1]의 실제 값을 pro에 대입하는 것입니다.


아니 그렇게 따지면 그냥 강제형변환을 하면 되지 않느냐? 할 수 있는데 말입니다...

강제 형변환은 형식에 맞지 않는 형태도 무식하게(?) 무조건 변환을 해줍니다...

이에 반해, dynamic_cast 같은 경우에는 

식이 맞다면 형변환을 해주고 아니면 0을 반환해주기 때문에 훨씬 안전하죠...


다형성의 장점을 사용하여 기반클래스에 파생클래스들을 담아 사용하다보니 문제점들이 발생했습니다... 

그래서 이와 같은 문제를 해결하기 위해 해결책이 제시되었고

그중 하나가 바로 dynamic_cast 입니다...


어찌보면 위험한 문법일 수 있지만, 잘 사용하면 매우 유용한 문법이죠...

우리가 칼을 어떠한 측면에서 바라보냐에 따라 이로울 수도 혹은, 해로울 수 도 있듯이

프로그래밍 언어에서도 마찬가지입니다...


위험한 문법은 있어도 나쁜 문법은 없습니다.

나쁜 문법이 있으면 왜 만들었겠습니까 ㅎㅎ


그때 그때 상황에 잘 맞추어 아름다운 코딩을 우리 함께 해봅시다!


이상 삽잡이였습니다!