삽질의 현장/- C++

#003_시(c)시(c)해서 C++?!... C와 C++의 캡슐화차이

shovelman 2015. 7. 2. 21:12

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


오늘은 캡슐화에 대해서 배워보려고 합니다... 캡슐... 아파들 보셨죠?? 말이 이상한가요... 

혹시 약먹을 때 캡슐 까서 드셔보신 적 있으신가요?


그 캡슐 하나에는 수없이 셀수 없는 가루들이 들어있죠....


프로그래밍으로 넘어와서 그래서 캡슐화는.... (죄송합니다... 발 비유...)

아무튼... C++ 에서 캡슐화란 무엇인가를 캡슐로 만드는 과정이라고 볼 수 있습니다.


자... 예를 들어볼까요... 학생하면 떠오르거나 관련 있는 것들 다 말해볼께요!


이름, 번호, 체력, 혈액형, 공부하다, 알바하다, 잠자다, 졸다, 사랑에 빠지다(잉?) 등등....


이 학생에 관한 모든 것들을 형식으로 묶는 일련의 과정을 

바로, 캡슐화라고 하는 것입니다...


C에서는 구조체로 이런 캡슐화 과정을 진행했었죠...


그렇다면... C언어의 캡슐화와 C++의 구조체는 뭔 차이가 있을까요?


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
#include <iostream>
using namespace std;
#define MAX_HP    100
//클래스
class cStu
{
    int num;
    string name;
    int hp;
 
public:
    cStu(int num, string name);
    void Sleep(int scnt);
};
cStu::cStu(int num, string name)
{
    this->num = num;
    this->name = name;
    hp = 0;
}
void cStu::Sleep(int scnt)
{
    hp += scnt;
    if (hp > MAX_HP)
    {
        hp = MAX_HP;
    }
}
//구조체
struct sStu
{
    int num;
    string name;
    int hp;
 
    sStu(int num, string name);
    void Sleep(int scnt);
};
 
sStu::sStu(int num, string name)
{
    this->num = num;
    this->name = name;
    hp = 0;
}
 
void sStu::Sleep(int scnt)
{
    hp += scnt;
    if (hp > MAX_HP)
    {
        hp = MAX_HP;
    }
}
 
void main()
{
    //구조체
    sStu ss(3"삽잡이");
    ss.num = 9;
 
    //클래스
    cStu cs(3"삽잡이");
    cs.num = 9;    
}
cs

실행 해보시면 아시겠지만, 
구조체는 구조체안의 멤버를 외부에서 접근시킬 수 있고,
클래스 형식으로는 외부에서 접근을 할 수 없는 것을 확인하실 수 있습니다.


자.. 여기서 C언어의 캡슐화 와 C++의 캡슐화의 차이를 알아 볼 수 있을 것 같습니다.
표를 확인해보시죠...




구조체와 같은 경우 default 값이 public이기 때문에
직접 멤버가 접근하여 값이 변할 가능성이 있다 이겁니다.

여기서 간략하게 접근 지정자에 대해서 설명을 드리자면,
해당 형식에게만 보이는... 그러니 접근 가능한 private,
모든 곳에서 접근 할 수 있는 public,
해당 형식과 파생된 형식에서 접근 가능한 protected가 있습니다.
마지막 부분은 나중에 알아가도록 하죠...

아무튼...
사실 C++에서 구조체와 클래스는 default 가시성 정도에 차이가 있고
나머지는 별 차이가 없습니다. 그런데 그 정도가 큰거죠.....

왜냐, 위의 예시를 통해서 봤듯이 외부에 접근하는 것이 당연시 된다면, 
중요한 변수 값을 수정할 수 도 있게 되는거죠... 
요즘같이 협업하여 개발하는 이 때에 완벽한 팀웍으로 개발하는 사람들일지라도 
저런 경우 불협화음을 내며 구현한 프로그램이 오징어가 되는 놀라운 기적을
체험할 수도 있습니다...

하하...
물론 개발할 때에는 전부 open 된 상태에서 진행 하는 것이 참 편할 수도 있겠지만,
그건 개발할때겠죠.... 그렇다고 open 된 상태가 개발할 때 좋다는 것은 아닙니다...
어찌됬든, 클래스를 선호하는 이유는 아무래도
default 값이 private인 클래스이기 때문이 아닐가 생각합니다..

목에 칼이 들어와도 멤버 필드는 private로 해주라는 소리 들어보셨나요?
허허... 혹여나 값을 지정하거나 수정해야될 상황이 생긴다면 
그때는 메소드를 제공하는 편이 좋겠죠?

아무튼... 클래스를 통한 캡슐화를 통해서 우리는 정보은닉을 할 수 있게 된다는 것이죠...
'보여줄 것만 보여줄게... 나머지는 안알랴줌...'
C에서는 접근을 제한하고 허용하는 접근 지정 문법이 없습니다.
디폴트 가시성을 가지고 있다는 것은 매우 중요한 것이라는 사실!
클래스, 이를 통해 지난시간에 언급한 C++의 신뢰성에 대한 향상을 기대할 수 있게 되는것입니다.

자... 이제 클래스에 대해 조금 알아보기 시작했습니다...
클래스 안에는 멤버 필드와 멤버 메서드를 포함하고 있다고 언급했습니다.
메서드에 대한 시그니처를 클래스에서 언급을 하였다면, 
실제 메서드가 동작하는 코드 또한 어딘가 있어야겟죠...
이 위치는 클래서 정의문 내에, 혹은 클래스 정의문 외부에도 할 수 있다는 사실!


이렇게 외부에 선언할 수 있다 이거죠...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Stu
{
    int num;
    string name;
    int hp;
public:
    Stu(int num,string name);
    void Study(int scnt);
};
Stu::Stu(int num,string name)
{
    this->num = num;
    this->name = name;
    hp = 0;
}
cs


이 내용은 참 간단한 것이죠?


아무튼 이번 시간은 여기까지!

이상 삽잡이였습니다!