전방 선언에 대해 알아보자.
먼저 전방 선언이란?
불필요한 헤더 파일이 복잡하게 포함되는 것을 방지하며, 컴파일 속도를 향상시켜준다.
전방 선언은 헤더 포함 의존성을 줄이기 위해 사용된다.
![]()
특정 클래스를 정의할 때, 멤버 변수나 리턴 값, 파라미터 등으로
또 다른 클래스를 사용한다면 해당 클래스의 정의도 포함시켜야 한다.
즉, AAA 라는 클래스를 정의할 때
BBB 를 사용한다는 것이다.
일반적으로는
#include "BBB.h"
class AAA{
...
...
}
별 문제없는 방법으로 보일 수 있으나,
임포트한 헤더 파일에는 현재 클래스에서 필요로 하는
정보 외에도 많은 정보를 포함하고 있다.
또한 BBB.h에 다른 h들도 포함되어 있다면..?
필요이상의 시간을 소비하는 결과를 낳게 된다.
![]()
이러한 문제의 해결을 위해 우리는 전방선언과 친하게 지내야 한다.
문제가 되었던 상호 참조 문제라던가
컴파일 부하문제를 깔끔하게 해결해준다.
예제를 보자.
AAA 클래스.
BBB 클래스.
BBB 클래스 --> AAA를 include하지 않고 전방선언을 해주고 있다.
주의 할 점은 BBB클래스는 AAA라는 클래스의 존재 유무만 알고있다.
때문에 AAA의 구체적인 크기에 대해선 알지 못한다.
따라서 포인터로만 선언될 수 있다.
이를 동적 생성하거나 함수를 호출하면 에러!!
AAA a; 로 선언 되어도 에러!!
다시 한번 말하지만 전방 선언은 단순히 선언이기 때문에
생성, 호출은 실제 데이터 구조를 모르는 상태에서 진행될 수 없다.
![]()
전방 선언된 AAA를 BBB.cpp에서 구현
전방 선언을 하는 것은 선언된 클래스의 이름을 간단히 컴파일러에게
심볼 테이블에 추가하라고만 하는 것이 아니라, 실제로 이 클래스가
필요할 때 그 정의를 함께 제공하겠노라고 약속하는 것이다.
따라서 전방선언한 클래스에 접근하는 cpp 파일에는
반드시 #include "AAA.h" 를 선언하고 사용해야 한다.
![]()
예제를 보았지만 예제가 매우 허접하여 감이 안잡힌다.
전방선언이 요긴하게 쓰이는 부분에 대해 더 짚어보자.
1. 포인터/ 참조 형식으로 이름만 참조할 경우
class AAA;
class BBB{
public:
BBB doSomething1 (const AAA* a);
BBB doSomething2 (const AAA& a);
};
2. 매개변수나 리턴 타입을 위한 이름만 참조할 경우
class AAA;
class BBB{
public:
void SetData(AAA a);
AAA GetData() const;
};
이 경우 컴파일러가 AAA의 크기를 알아야 한다고 생각할 수 있지만,
함수를 구현하는 코드와 호출하는 코드에서만 클래스의 크기를 요구한다.
![]()
간단하게나마 전방선언에 대해 알아보았다.
그 필요성에 대해서는 알겠으나,
아직 많이 낯선것도 사실. 분발하자.
'C++' 카테고리의 다른 글
| [C++ STL] 간단한 콜백 메커니즘 (0) | 2016.12.20 |
|---|---|
| [C++ STL] 연산자 오버로딩 (0) | 2016.12.19 |
| [C++] 팩토리 함수 (0) | 2016.12.19 |
| [C++] API란? (0) | 2016.12.15 |
| [C++] 예외처리 // 열혈강의 (0) | 2016.12.14 |