이렇게 정의된 클래스가 있다.
//S.h
class S
{
public:
S();
private:
AModule a;
BModule b;
CModule c;
};

클래스 S의 인스턴스는 AModule과 BModule, CModule의 크기를 알고 있어야 생성될 수 있다.
모듈들의 크기를 알기 위해서는 당연히 각 모듈들에 대한 클래스 정의가 필요하다.

따라서 이렇게 되야 한다.
//S.h
#include "AModule.h" //모듈들의 정의를 끌어온다.
#include "BModule.h"
#include "CModule.h"
 
class S
{
public:
S();
private:
AModule a;
BModule b;
CModule c;
}; //이제는 컴파일이 가능하다.
하지만 AModule이나 BModule 혹은 CModule이 변경 될때에 S 클래스를 사용하는 다른 모든 파일들이 같이 컴파일 된다.
정도의 작은 코드라면 상관없지만, 커다란 프로젝트에서는 코드 몇 줄 고치고 컴파일 되는 동안 담배피우러 가는 일이 잦아질 것이다.

이제 이렇게 정의된 클래스를 보자.
class AModule;
class BModule;
class CModule;
 
class S
{
public:
S();
private:
AModule* a;
BModule* b;
CModule* c;
};
멤버 변수가 포인터나 레퍼런스일 경우에는 인스턴스를 담을 주소공간만이 필요하다.

따라서 클래스 정의를 끌어오지 않아도 괜찮다.
S가 알아볼 수는 있어야 하므로 각 모듈들에 대한 선언만은 필요하다.
그래서 전방선언이 되어 있다.


이렇게 되면 모듈들의 인스턴스를 만들기 위해 S의 구현 파일에서
각 모듈들의 정의를 끌어오면 된다.


구현 파일에서 include 했기 때문에 A, B, C 모듈의 정의가 바뀌더라도
S 클래스를 사용하는 클라이언트 코드들은 컴파일되지 않아도 된다.


포인터와 레퍼런스로 충분한 경우에는 굳이 객체를 직접 사용하지 않도록 하여
컴파일 의존성을 줄이고 모듈간의 독립성을 높일 수 있다.
  1. greenfrog 2009/02/13 23:16 답글수정삭제

    좋은 공부가 되었습니다. 감사합니다.
    트래픽 쏘고 갑니다. ^^

  2. 전방 선언에 대해서

    Tracked from Programmer greenfrog !! 2009/02/13 23:16

    전방 선언에 대해서 알아보았습니다. 웹에 게시 된 글들을 여러개 살펴 보았는데 아래의 이유에 의해서 사용된다는 결론을 내리게 되었습니다.불필요한 헤더 파일이 복잡하게 포함되는 것을 방지하며, Compile 속도를 향상 시켜줍니다.그럼, 위의 결론을 아래와 같은 클래스 구조를 가정하여 설명하도록 하겠습니다.위 클래스 구조를 보면 CUser클래스가 CManager 클래스를 사용하고 있고 CManager 클래스는 CModuleOne과 CModuleT...

  3. 포프의 생각

    Tracked from pope's me2DAY 2009/10/06 20:28

    전방선언(Foward declaration)과 컴파일 의존성 1,2,3

트랙백 주소 :: http://www.crazytazo.com/25/trackback/
옵션
댓글 달기