본문 바로가기

else if (개발)

c++로 라이브러리를 개발할 때 전방선언(forward declaration) 사용하기

c++로 라이브러리를 개발하다가 다음과 같은 소스가 나오게 되었다.
//apis.h
#include "A.h"
#include "B.h"

class Apis {
public:
    void publicMethod1();
    void publicMethod2();

private:
    void privateMethod1(A a);
    void privateMethod2(B b);
};
//apis.h 끝

//라이브러리 사용하는 코드
#include "apis.h"

Apis apis;
apis.publicMethod1();
apis.publicMethod2();

라이브러리는 개발이 다 끝나고 사용자에게는 컴파일된 라이브러리 파일 하나와 API 정의를 담고 있는 헤더파일만 전달되는 것이 정상이다. 위 소스에서 말하고 있듯이 라이브러리 내부적으로 무슨 로직을 지지고 볶든지 간에 라이브러리를 사용자가 선언하는 클래스는 Apis라는 클래스 한개이고, 호출하는 메소드는 publicMethod1, publicMethod2 딱 두개 뿐이다.

그런데, apis.h를 include하기 위해서는 반갑지 않은 떨거지들이 따라오게 되는데, A.h와 B.h가 그것들이다.

결국 헤더 파일 두개가 추가로 라이브러리에 포함되어야만 하는 사태다. 근데, 어디 그뿐인가. 만약 A.h와 B.h가 다른 헤더파일을 include하고 있다면? 그것도 같이 들어가야 하네? 그러다가 결국 모든 헤더파일을 다같이 실어 올려야 하는 볼썽 사나운 일이 생기게 된다.


이럴 때는 전방선언(forward declaration)을 사용해야 한다.
//apis.h
//이제 A.h와 B.h를 include할 필요없다.

//전방 선언(forward declaration)
class A;
class B;

class Apis {
public:
    void publicMethod1();
    void publicMethod2();

private:
    void privateMethod1(A a);
    void privateMethod2(B b);
};
//apis.h 끝

//apis.cpp
//대신 cpp에서 include해야 한다.
#include "A.h"
#include "B.h"
...

A.h와 B.h를 apis.h가 아닌 apis.cpp에 include함으로써, 공개되는 라이브러리에는 빠져도 상관이 없게 된다.