삽질의 현장/- C++

#006_시(c)시(c)해서 C++?!_클래스간의 관계

shovelman 2015. 7. 6. 20:11

안녕하세요 

삽잡이입니다~!


이번 시간에는 클래스간의 관계에 대해서 알아보고자 합니다!

클래스간의 관계에 대해서 UML을 사용할 것이구요...


음... 우선 UML 모델링 툴에는 대표적으로...

Rose, Together, Visual, Visual Paradigm 등등 있습니다.

그리고 제가 오늘 사용할 StarUML 또한 있고요....


자... 이들을 모두 Case 도구라고 부릅니다.

Case 도구는 Computer Aided Software Engineering의 약자를 가지고 있고요

소프트웨어 개발과정을 자동화하기 위해서 사용하는 소프트웨어 도구라고 합니다...


웩.. 뭔말이야...

쉽게, 프로그램 개발 방법론에 의해 진행되는 프로세스에서 이 툴들이 사용된다는 것인데요 ...


자.. 우리가 제품을 만드는 현장에 있습니다... 회의가 진행중이에요...

프로그램을 만들기 위한 제안서가 나왔습니다...

이제 요구분석을 정의하고 분석한 뒤에

아키텍쳐링을 하고  설계를 하고 구현을 하고 배포를 해야하는데요....

이 개발과정들의 사이에 껴서 원할하고 효율적으로 처리하도록 도와주는 친구들이 

바로, Case tool 이라는 것입니다.


아무튼... 

프로그램을 개발하다보면 해당되는 구현 파일들마다 다양한 관계가 존재할 수 있는데요,

그 관계들의 표현을 한번 Case Tool 인 Star UML을 사용하여 살펴보고자 합니다.

추가적으로 코드들 또한 살펴본다면 더욱 좋겠군요!


자~ 주절주절 길었죠... 지금부터 시작합니다...




Star UML을 시작한 다음에 [Model]에서 마우스 오른쪽 클릭! (다른 곳 찍어도 되는...)


우선 일반화 관계에 대해서 알아보도록 하겠습니다.

일반화... 상속(Generation), 파생(Derivation)과 비슷한 말이죠...

상황에 달리 쓰일 수는 있겠으나... 

일반화 관계는 쉽게 '~이다' 혹은 약간 글로벌 하시다면 ' is a' 관계라고 말씀드릴 수 있습니다.


'운동선수'로 예시들 들어보도록 하죠...

'축구선수는 운동선수이다.', '농구선수는 운동선수이다.' '야구선수는 운동선수이다.'


공통적인 부분들이 있죠... 

축구, 농구, 야구선수들은 모두 운동선수라는 공통점에서 파생된 것입니다.

즉, 운동선수라는 기반형식에 파생된 클래스들이 축구선수, 농구선수, 야구선수가 된다는 것이죠...


이와같이 공통적인 것이 있다면 하나로 묶고(?), 

파생된 곳에서는 그 차이에 대해서만 정의하면 된다 이거죠...


다이어그램을 통해 확인해보도록 하겠습니다.

우측 하단의 Toolbox 를 통해 만들어보도록 하죠...


 

자... Class를 만들어보겠습니다.

일반화는 영어로 Generalization 입니다... 다이어그램을 이쁘게 만들었습니다. 짜잔~!




이와같이 그림이 그려지군요... 어떻습니까? 한눈에 보여지는지요?

이렇게 아름답게 클래스간의 관계를 확인해 볼 수 있군요 ㅎㅎ


실제 코드로 구현해볼까요?


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
#include <iostream>
#include <string>
using namespace std;
 
class Sports
{
public:
    void Play();
};
void Sports::Play()
{
    cout << "땀흘리며 달리자" << endl;
}
 
class Football :public Sports
{
public:
    void Messi();
};
void Football::Messi()
{
    cout << "아르헨 또 준우승ㅠㅠ" << endl;
}
 
void main()
{
    Football* fb = new Football();
    fb->Play();
    fb->Messi();
    delete fb;
}
cs


요번 일요일에 있던 메시의 가슴아픔을 코딩에 담았습니다....

참고로 Sports에서 파생된 클래스인 Football에는 콜론(' : ') 연산자를 붙여

상속받음을 명시했습니다~!

아무튼... Sports라는 기반형식에서 파생된 Football... 일반화 였습니다~!



다음으로는 '집합과 구성' 에 대해 알아보고자 합니다.

이들은 '가지다', 'has a' 의 관계를 가지고 있습니다... 

집합 ( Compostion ) ... 구성 ( Aggregation )... ?

어떤 차이가 있을까요? 비슷해보이는데... 흠... 어렵지 않습니다!


우선 구성은 만들어질 때 같이 만들어 진다고 생각해보세요...

우리가 부모님에 의해 잉태되었을 때 눈먼저 태어나고 그다음 코 태어나고 입태어나고

그래서 태양이 '눈, 코, 입'을 불렀을까요?

헐... 죄송합니다...


아무튼... 사람이 만들어질 때 모두 같이 나오져? 또한 죽을 때도 마찬가지겠죠....

이와같이 클래스의 생성과 소멸을 함께할 때 Composition 즉, 집합이라고 합니다.


그렇다면 반대로 따로 따로 만들어지는 것... 즉, 생성과 소멸이 다른... 같이 하지 않는

친구를 Aggregation 즉, 집합이라고 할 수 있습니다.







영어 못써서 안쓴거 아닙니다 ㅎㅎ.... 아무튼... 이와같이 표시할 수 있겠군요... 

코드로 구현해보도록 하겠습니다.


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
#include <iostream>
using namespace std;
 
class Eye
{
public:
    Eye();
};
Eye::Eye()
{
    cout << "똘망똘망한 눈" << endl;
}
 
class Sapzape
{
    Eye eyes[2];
public:
    Sapzape();
};
Sapzape::Sapzape()
{
    cout << "삽잡이 탄생~" << endl;
}
 
void main()
{
    Sapzape* sap = new Sapzape();
    delete sap;
}
cs


우선, 집합입니다... 삽잡이의 탄생과 함께 똘망똘망한 눈이 생성되고

삽잡이가... 소멸... 괜히 했군... 아무튼... 예시는 예시니...

똘망똘망한 눈도..... 이런...


다음.. 구성입니다...


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
#include <iostream>
using namespace std;
 
class Pen
{
    int num;
public:
    Pen(int num);
    void View();
};
Pen::Pen(int num)
{
    this->num = num;
}
void Pen::View()
{
    cout << "펜 번호:" << num << endl;
}
 
class PenCase
{
    Pen** base;
    int max;
    int cnt;
public:
    PenCase(int max);
    bool AddPen(Pen* pen);
    void List();
};
PenCase::PenCase(int max)
{
    base = new Pen*[max];
    this->max = max;
    cnt = 0;
}
bool PenCase::AddPen(Pen* pen)
{
    if (cnt < max)
    {
        base[cnt] = pen;
        cnt++;
        return true;
    }
    return false;
}
void PenCase::List()
{
    cout << "보관 개수: " << cnt << endl;
    for (int i = 0; i < cnt; ++i)
    {
        base[i]->View();
    }
}
 
void main()
{
    PenCase* pc = new PenCase(2);
    pc->AddPen(new Pen(4));
    pc->List();
    delete pc;
}
cs


실제로,

일반화 관계, 구성관계, 집합 관계가 프로그래밍에서 가장 자주 쓰이는 

클래스 관계라고 합니다.


재미있군요... 다음에 뵙죠 ㅎㅎ

이상 삽잡이였습니다!