C++에서 정방향 선언(forward declaration)은 클래스의 실제 정의보다 앞서 클래스의 이름만 미리 알려주는 기법입니다. 정방향 선언을 사용하면 선언 이후에 오는 코드들은 'Person'이라는 이름의 클래스가 존재한다는 사실을 인지하게 되며, 컴파일러는 해당 이름이 사용되는 것을 보아도 오류 없이 통과시킵니다. 클래스의 실제 정의는 컴파일 이후 링커(linker)가 찾아 연결하게 됩니다.
정방향 선언 예제
class Person; // 정방향 선언
void myFunc(Person p1) {
// ...
}
class Person { // 실제 클래스 정의
// 클래스 멤버 정의
};위 예제에서 컴파일러가 myFunc 함수를 만나는 시점에는 아직 Person 클래스의 정의가 등장하지 않았습니다. 하지만 정방향 선언 덕분에 컴파일러는 이 클래스가 코드 어딘가 뒤쪽에 정의되어 있음을 알고 있으므로, 함수 시그니처에서 해당 타입을 사용하는 데 문제가 없습니다.
정방향 선언이 필요한 경우
정방향 선언은 클래스를 사용하는 코드가 클래스 정의보다 먼저 위치하거나, 헤더 파일 포함 순서상 정의부가 나중에 로드되는 상황에서 특히 유용합니다.
주요 활용 사례
- 순환 참조(circular dependency) 해결: 두 클래스가 서로를 참조할 때, 헤더 파일에 정방향 선언을 사용하면 무한 include 루프를 방지할 수 있습니다.
- 컴파일 시간 단축: 헤더 파일 전체를 include하는 대신 정방향 선언만 사용하면 불필요한 의존성이 줄어들어 빌드 속도가 향상됩니다.
- 포인터·참조 타입 사용: 클래스의 크기를 알 필요 없는 포인터나 참조 매개변수에는 정방향 선언만으로 충분합니다.
단, 객체의 멤버에 접근하거나 객체를 생성·복사하는 등 클래스의 내부 구조가 필요한 코드에서는 반드시 실제 정의가 포함된 헤더 파일을 include해야 합니다.