[디딤돌 C++] 14. 캡슐화 개요

이제 C++언어에서 캡슐화에 관한 사항을 알아보기로 해요.

캡슐화는 여러 개의 멤버를 하나의 형식으로 묶는 과정을 말합니다.

C언어에서는 구조체를 이용하여 캡슐화를 했었죠. C++언어에서도 구조체를 이용하여 캡슐화를 할 수 있습니다. 하지만 일반적으로 클래스를 이용하여 캡슐화를 할 때가 대부분입니다.

먼저 C언어에서의 캡슐화와 C++언어에서의 캡슐화의 차이를 간단하게 알아볼게요.

C언어에서 구조체에는 데이터만 멤버 필드(멤버 변수)로 캡슐화할 수 있었죠. 하지만 C++에서는 기능도 멤버 메서드로 캡슐화를 할 수 있습니다. 그리고 C언어에서는 캡슐화한 멤버를 모든 곳에서 접근할 수 있지만 C++언어에서는 구조체에 접근 지정자를 사용하여 가시성을 설정할 수 있습니다. 그리고 앞에서 얘기했듯이 C++에서는 클래스 문법을 제공하고 있어 신뢰성 높은 캡슐화를 할 수 있습니다.

다음은 C언어와 C++의 캡슐화를 비교하는 간단한 예제 코드예요. 앞으로 캡슐화에 관한 사항은 하나 하나 살펴볼 거예요. 여기에서는 한 번 비교해 보시고 코드를 작성해 보세요.

//C언어에서 캡슐화
#include <stdio.h>

#define MAX_NAME_LEN 20
typedef struct Unit Unit;

struct Unit//구조체를 이용하여 캡슐화
{
    //멤버 필드(멤버 변수)만 캡슐화 가능
    //접근 지정자를 제공하고 있지 않음
    int num;
    char name[MAX_NAME_LEN];
    int hp;
};


//형식과 별개로 함수를 작성
void Train(Unit *unit,int hour)
{ 
    printf("%d번 유닛(%s) 훈련하다.\n",unit->num,unit->name);
    unit->hp += hour; //접근 지정자가 없어 어디서나 멤버에 접근이 가능
}

int main()
{
    Unit unit={3,"홍길동",100};
    Train(&unit,5);
    printf("%d번, 유닛 이름:%s, 체력:%d\n",unit.num,unit.name,unit.hp);
    unit.hp += 1000;//접근 지정자가 없어 어디서나 멤버에 접근이 가능
    printf("%d번, 유닛 이름:%s, 체력:%d\n",unit.num,unit.name,unit.hp);
    return 0;
}

▷ 실행 결과

3번 유닛(홍길동) 훈련하다.
3번, 유닛 이름:홍길동, 체력:105
3번, 유닛 이름:홍길동, 체력:1105

다음은 C++언어로 작성한 캡슐화 예제 코드예요.

//C++언어에서 캡슐화
#include <iostream>
#include <string>
using namespace std;

class Unit//클래스를 이용하여 캡슐화
{    
    //디폴트 가시성은 클래스 내부에서만 접근 가능
    int num;
    string name;
    int hp;

public: //클래스 외부에서도 접근 가능할 수 있게 접근 지정자 설정
    Unit(int _num,string _name)//생성자 메서드
    {
        num = _num;
        name = _name;
        hp = 100;
    }
    void Train(int hour) //멤버 메서드
    {
        cout<<num<<"번 유닛("<<name<<") 훈련하다."<<endl;
        hp += hour;
    }
    void View()
    {
        cout<<num<<"번, 유닛 이름:"<<name<<", 체력:"<<hp<<endl;
    }
};


int main()
{
    Unit unit(3,"홍길동");
    unit.Train(5);
    unit.View();
    //unit.hp += 1000; //가시성을 차단하여 접근할 수 없음
    unit.View();
    return 0;
}

▷ 실행 결과

3번 유닛(홍길동) 훈련하다.
3번, 유닛 이름:홍길동, 체력:105
3번, 유닛 이름:홍길동, 체력:105

이 책에서는 먼저 접근 지정자를 통해 가시성을 설정하는 방법과 이를 통한 장점이 무엇인지 살펴볼게요. 그리고 캡슐화할 수 있는 멤버들에 대해 하나 하나 살펴봅시다.

이 외에도 캡슐화에서는 형식 내에 고유한 정적 멤버를 제공하는데 개체의 멤버와 어떠한 차이가 있는지 살펴볼게요. 또한 const 키워드를 사용하여 상수화 멤버 필드나 상수화 멤버 메서드를 정의할 수 있는데 이들에 관한 사항도 살펴볼 거예요.

마지막으로 개체의 메서드 내부에서만 사용할 수 있는 특수한 키워드 this를 알아보기로 해요.