클래스 내에 모든 멤버 함수의 정의를 집어넣는 다면 클래스의 부피가 너무 커진다.
멤버 함수를 클래스 외부에 정의하기
#include <iostream>
using std::cout;
using std::endl;
const int OPEN=1;
const int CLOSE=2;
class Door {
private:
int state;
public:
void Open();
void Close();
void ShowState();
};
void Door::Open() {
state = OPEN;
}
void Door::Close() {
state = CLOSE;
}
void Door::ShowState() {
cout << "현재 문의 상태: ";
cout << ((state == OPEN) ? "OPEN" : "CLOSE") << endl;
}
int main(void) {
Door d;
//d.state=OPEN; //컴파일 오류 발생
d.Open();
d.ShowState();
return 0;
}
17,20,23: "Door::" 라는 선언이 존재하지 않는다면, 이 함수의 정의는 전역 함수의 정의가 된다. 그러나 "Door::"라는 선언이 존재함으로써, Door 클래스 내에 선언되어 있는 함수의 정의가 되는 것이다.
3~15: 클래스 멤버 함수의 정의 부분을 클래스 외부로 빼내는 경우, "Door 클래스의 선언"이라고 한다.
17~26: 함수 정의 부분을 가리켜 "Door 클래스의 정의(멤버 함수 정의)" 라 한다.
클래스 내부 정의의 의미와 inline
클래스의 멤버 함수를 내부에 정의한다는 것은 외부에 정의하는 것과 달리 in-line으로 처리할 것을 요구 한다는 의미를 지니고 있다. 하지만 모두 클래스 내부에 선언한다면 너무 길어질 것이다. 이럴 땐 다음과 같이 선언한다.
#include <iostream>
using std::cout;
using std::endl;
const int OPEN=1;
const int CLOSE=2;
class Door {
private:
int state;
public:
void Open();
void Close();
void ShowState();
};
inline void Door::Open() {
state = OPEN;
}
inline void Door::Close() {
state = CLOSE;
}
inline void Door::ShowState() {
cout << "현재 문의 상태: ";
cout << ((state == OPEN) ? "OPEN" : "CLOSE") << endl;
}
int main(void) {
Door d;
d.Open();
d.ShowState();
return 0;
}
헤더 파일을 이용한 파일의 분할
가장 세련된 방법은 다음과 같은 구조로 프로그램을 작성하는 방법이다.
/*Door.h*/
#include <iostream>
using std::cout;
using std::endl;
const int OPEN=1;
const int CLOSE=2;
class Door {
private:
int state;
public:
void Open();
void Close();
void ShowState();
};
/* Door.cpp */
#include "Door.h"
void Door::Open() {
state = OPEN;
}
void Door::Close() {
state = CLOSE;
}
void Door::ShowState() {
cout << "현재 문의 상태: ";
cout << ((state == OPEN) ? "OPEN" : "CLOSE") << endl;
}
/* main.cpp */
#include "Door.h"
int main(void) {
Door d;
d.Open();
d.ShowState();
return 0;
}
즉 클래스의 선언은 헤더 파일로 구현을 하고, 클래스 멤버 함수의 정의는 .cpp 파일로 구현을 한다. 이렇게 되면 이 클래스를 필요로 하는 모든 파일에서는 헤더 파일만 포함하면 되는 것이다.
'컴퓨터' 카테고리의 다른 글
4-2. 캡슐화(Encapsulation) (0) | 2019.04.09 |
---|---|
4-1. 정보 은닉(Information Hiding) (0) | 2019.04.08 |
3-3. 클래스 멤버의 접근 제어 (0) | 2019.04.07 |
3-2. 클래스와 객체 (0) | 2019.04.07 |
2-7. new & delete (0) | 2019.04.06 |