본문 바로가기

컴퓨터

3-4 멤버 함수의 외부 정의

클래스 내에 모든 멤버 함수의 정의를 집어넣는 다면 클래스의 부피가 너무 커진다. 

멤버 함수를 클래스 외부에 정의하기

#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