본문 바로가기
정상을향해/Languages

C++에서의 파일분할

by 사이테일 2013. 11. 10.

대부분의 프로그램이 하나의 파일에 모든 것을 담진 않는다.

 

특히 C++과 같은 객체지향 언어는 클래스 별로 헤더파일과 소스파일을 생성해서,

 

클래스의 선언과 정의를 분리하는 경우가 많기 때문에 많은 수의 파일이 만들어진다.

 

 

클래스 Car를 대상으로 파일을 나눈다고 예를 들어보자.

 

Car.h        클래스의 선언을 담는다.

Car.cpp    클래스의 정의(멤버함수의 정의)를 담는다.

 

여기서 말하는 클래스의 선언(declaration)은 멤버변수의 선언과 멤버함수의 원형을 포함한다.

 

이는 클래스와 관련된 문장의 오류를 잡아내는데 필요한 최소한의 정보로써,

 

클래스를 구성하는 외형적인 틀을 보여준다.

 

 

클래스의 정의(definition)에 해당하는 함수의 정의는 다른 문장의 컴파일에 필요한 정보를 가지고 있지 않다.

 

따라서 함수의 정의는 컴파일 된 이후에, 링커에 의해 하나의 실행파일로 묶이기만 하면 된다.

 

다음 예를 살펴보자.

 

< Car.h > 소스코드 

 

 

헤더 파일에는 앞서 언급한 것처럼 클래스와 관련된 문장의 오류를 잡는데 필요한 최소한의 정보만 들어있다.

 

각종 상수와 멤버 변수, 멤버 함수 원형이 있는 것을 알 수 있다.

 

1행과 27행에 생소할 수도 있는 #ifndef#endif가 있다.

 

말 그대로 __CAR_H__#define으로 정의되어 있지 않다면 아래라인부터 #endif까지 포함시키라는 전처리 지시어이다.

 

(반대로 #ifdef도 존재한다.)

 

#ifndef 같은 경우에는 헤더파일의 중복포함 문제를 방지하기 위한 매크로 선언이다.

 

 

 < Car.cpp 소스코드 >

 

 

위의 코드는 클래스의 정의 부분이다.

 

그리고 다음은 이 클래스를 활용하는 메인 부분이다.

 

 

< RacingMain.cpp >

 

 

 

위처럼 파일을 분할해 놓으면, 클래스 Car를 구성하는 멤버의 파악이 한결 수월해진다.

 

파일분할에 익숙해지면 하나의 파일에 모든 것을 집어넣는 것이 오히려 더 이상하고 불편할 것이다.

 

 

 

파일분할시 주의해야 할 점이 하나 있는데,

 

인라인 함수는 헤더파일에 함께 넣어야 한다는 것이다.

 

만약 인라인으로 선언한 함수(함수 앞에 inline을 붙이면 된다.)를 위처럼 파일분할을 하면,

 

컴파일 에러가 발생한다.

 

그 이유는 컴파일 과정에서 함수의 호출문이 있는 곳에 함수의 몸체 부분이 삽입되야 하기 때문이다.

 

 

위 소스코드에서 Car.cpp에 정의된 함수 ShowCarState와 Break 앞에 inline을 붙이면 컴파일 에러가 발생한다.

 

main함수를 컴파일 한다고 했을 때,

 

ShowCarState함수와 Break함수의 호출문장은 컴파일러에 의해서 함수의 몸체로 대체되어야 한다.

 

때문에 인라인 함수는 클래스의 선언과 동일한 파일에 저장되어서 컴파일러가 동시에 참조할 수 있게 해야 한다.

 

(만약 인라인 함수가 아니라면, 두 함수가 Car클래스 멤버함수인지만 확인하고 컴파일은 완료가 된다.)

 

 

 

 

출처 : 열혈 C++ 프로그래밍 (윤성우 저)

 

'정상을향해 > Languages' 카테고리의 다른 글

상속 (Inheritance)  (0) 2013.11.11
얕은복사와 깊은복사  (0) 2013.11.11
멤버 이니셜라이저를 이용한 멤버 초기화  (0) 2013.11.11
참조자(Reference)와 함수  (0) 2013.11.10
[C] 포인터 : 배열명  (0) 2011.04.16
[C] 포인터 : *의 의미  (0) 2011.04.16