바람직한 C++ 프로그램 작성법
C++ 프로그램은 여러 클래스들의 전역 함수들로 구성됩니다. 이들을 하나의 C++ 소스 파일로 작성할 수도 있고 여러 소스 파일로 나눌 수도 있습니다.
헤더 파일과 cpp 파일 분리
C++ 프로그램의 소스 코드는 다음과 같은 원칙으로 분리하여 작성하는 것이 바람직합니다.
- 클래스마다 선언부는 헤더 파일에, 구현부는 cpp 파일에 분리하여 작성합니다.
- main() 등 함수나 전역 변수는 한 개 이상의 cpp 파일에 나누어 작성합니다.
클래스마다 클래스의 선언부와 구현부를 헤더 파일과 cpp 소스 파일로 분리하면 전체 프로그램을 관리하기 쉽고 클래스를 재사용하기 쉽습니다. 클래스를 활용하는 코드들은 클래스에 대한 선언이 필요하므로, 클래스의 선언부가 들어 있는 헤더 파일만 include 하여 사용하면 됩니다. 만일 헤더 파일에 클래스와 구현부가 들어 있다면, 이 파일을 include 하는 여러 소스 파일에 구현부가 중복하여 들어가게 되므로, 링크 오류가 발생합니다.
#include "Circle.h"
C++ 컴파일러는 컴파일하여 .obj을 각각 생성하고, 이들은 링크하여 main.exe 파일을 만듭니다. 참고로 C++ 컴파일러는 cpp 파일들만 컴파일러하지는 않습니다.
헤더 파일을 중복 include 할 때 생기는 문제점 해결
클래스 선언부를 해더 파일로 작성할 때 한 가지 주의할 것이 있습니다. cpp 파일에서 클래스가 선언된 헤더 파일을 여러 번 include 하면, 중복 선언으로 인해 컴파일 오류가 생길 수 있습니다.
컴파일 오류 메시지는 다음과 같이 Circle 클래스가 중복 선언되었음을 경고합니다.
"Circle.h(4): error C2011: 'Circle' : 'class' 형식 재정의"
헤더 파일을 중복 include 해도 컴파일 오류가 발생하지 않도록 해 봅시다. 헤더 파일에 조건 컴파일 문을 삽입하면 됩니다.
조건 컴파일 문의 어떻게 해결하는지 알아봅시다.
1. main() 함수의 첫 번째 #include "Circle.h"이 처리될 때, 다음 문에 의해 CIRCLE_H 상수가 정의됩니다.
#define CIRCLE_H
그리고 클래스 Circle의 선언부가 main.cpp에 확장됩니다.
2. main() 함수의 두 번째 #include "Circle.h"가 처리될 때, CIRLE_H 상수가 이미 정의되어 있기 때문에, 다음 조건 컴파일 문의 값이 false가 되어 #endif 문 밖으로 빠져나오게 됩니다. 그러므로 Circle 클래스의 선언부는 main.cpp에 확장되지 않습니다.
#ifndef CIRCLE_H
3. main() 함수의 세 번째 #include "Circle.h"문은 두 번째 include 문과 동일한 방식으로 처리됩니더.
결국 처음 #include "Circle.h"문만 처리되고 나머지 include 문은 처리되지 않게 되어, Circle 클래스의 선언부가 한 번만 main.cpp에 확장됩니다. 중복의 문제가 해결되었습니다.
ex3-11 헤더 파일과 cpp 파일로 분리하기
Adder.h
#ifndef ADDER_H
#define ADDER_H
class Adder { // 덧셈 모듈 클래스
int op1, op2;
public:
Adder(int a, int b);
int process();
};
#endif
Adder.cpp
#include "Adder.h"
Adder::Adder(int a, int b) {
op1 = a; op2 = b;
}
int Adder::process() {
return op1 + op2;
}
Calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator { // 계산기 클래스
public:
void run();
};
#endif
Calculator.cpp
#include <iostream>
using namespace std;
#include "Calculator.h"
#include "Adder.h"
void Calculator::run() {
cout << "두 개의 수를 입력하세요>>";
int a, b;
cin >> a >> b; // 정수 두 개 입력
Adder adder(a, b); // 덧셈기 생성
cout << adder.process(); // 덧셈 계산
}
main.cpp
#include "Calculator.h"
int main() {
Calculator calc; // calc 객체 생성
calc.run(); // 계산기 시작
}
실행 결과
두 개의 수를 입력하세요>>5 -20
-15