david's daily developer note

[C,C++] 클래스 전방 선언(Forward declarations)와 상호 참조 헤더 파일 본문

[Develop] Native/C++ , C

[C,C++] 클래스 전방 선언(Forward declarations)와 상호 참조 헤더 파일

mouse-david 2012. 2. 21. 14:30
728x90

클래스 전방 선언 개념을 정리한다.

C++로 작성된 클래스 A와 클래스 B 가 있다. 그리고 A클래스는 B를 참조한다.
이를 위해서 우리는 A에서 B클래스 해더를 Include할 것이다.
 
그러나, #include 관계가 복잡하거나, 해비 참조 해더가 있다면(API 정의가 포함된 헤더와 같이..)
간단한 수정에도 참조하는 모든 파일이 다시 컴파일 될 것이다.
작은 프로그램이야 문제없지만 프로젝트가 몇 백개가 넘어가는 거대한 솔루션에서는.. 불편한 상황이다.
 
전방선언 (Forward declarations)을 사용하면 이러한 상황을 일부 회피할 수 있다. 
(전방선언의 좋은점은 참조하려는 해더파일에 변경이 생겨도 참조 하는 해더파일에서는
재컴파일이 이루어 지지 않는다는 점이다.)

#include "A.h"

class B
{
public:
    A* a;
};
전방선언의 간단한 예.
class A;
class B
{
public:
   A* a;
};
 

단, 주의해야 할 점이 있다. 전방선언자를 사용할 경우에는 그 클래스 관련 객체는 포인터형으로 정의해야 한다는 것이다. 만약 포인터형이 아닌 객체를 생성할 경우 전방선언자의 특징상 그 객체의 크기를 정확히 파악하여 할당을 못해주기 때문이다. (해당 클래스가 있다는 정보만 알고 사이즈를 모른다.)


+ 전방 선언은 클래스와 구조체가 가능하고, 함수 및 멤의 정의시에 포인터 형태가 아니라 참조 형태도 가능하다.

728x90