이제 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를 알아보기로 해요.