나만의 작은 도서관

[C++] 전방 선언(Forward Declaration) 본문

C++/문법 및 메소드(STL)

[C++] 전방 선언(Forward Declaration)

pledge24 2025. 3. 28. 22:07

전방 선언(Forward Declaration)이란?

class MyClass;
  • "전방 선언(Forward Declaration)"은 식별자를 정의하기 전에 식별자의 존재를 컴파일러에게 미리 알리는 것이다.
  • 전방 선언의 주 사용목적은 헤더 포함 의존성을 최소화하여 컴파일 속도를 향상하기 위함이다. (앞으로의 설명은 클래스 전방 선언을 기준으로 설명)

 

전방 선언 예시

// Game.h

class Player; // 나중에 정의하겠다고 전방선언

class Game
{
public:
	Game() {}
	~Game() {}

private:
	Player* _player;
  // 최상단 줄을 지우고 class Player* _player;와 같은 형태도 가능하다.
};

 


전방 선언이 가능한 경우와 불가능한 경우

  • 전방 선언은 컴파일러가 클래스의 존재만 알 수 있기 때문에 아래 2가지 질문의 대답을 몰라도 되는 경우에만 전방 선언이 가능하다.
    • “해당 클래스의 멤버(변수 또는 함수)가 무엇인가?”
    • “해당 클래스의 크기는 몇 바이트인가?”

 

전방 선언이 가능한 경우

  • 포인터 또는 참조로 사용하는 경우
class MyClass;  // 전방 선언

class AnotherClass {
    MyClass* ptr;  // 포인터 사용 가능
    MyClass& ref;  // 참조 사용 가능
  • 함수의 매개변수나 리턴 타입으로 사용하는 경우
class MyClass;  // 전방 선언

void myFunction(MyClass* obj);  // 매개변수로 사용 가능
MyClass* createObject();  // 리턴 타입으로 사용 가능

 

전방 선언이 불가능한 경우

  • 멤버 변수로 사용하는 경우
class MyClass;

class AnotherClass {
    MyClass member;  // ❌ 오류! MyClass의 크기를 알 수 없음
};

  • 멤버 함수를 호출하는 경우
class MyClass;

class AnotherClass {
		// ❌ 오류! MyClass의 멤버 함수를 알 수 없음
    void Func(MyClass* myclass) { myClass->func(); }
};

 


또 다른 전방 선언의 필요성 : 상호 참조 문제

  • 두 개 이상의 클래스가 서로를 참조(사용)하는 경우를 "상호 참조(Mutual Reference)"라고 한다.
  • 상호 참조를 하기 위해 아래 코드처럼 서로의 파일을 #include로 포함한다면, 헤더 파일 간의 의존성이 꼬여서 무한 포함(Include Loop)이 발생하는, 즉, 헤더 꼬임(include loop)이 발생한다.
// A.h
#include "B.h"  

class A {
public:
    B b;  // B를 멤버 변수로 선언
};

// B.h
#include "A.h"  

class B {
public:
    A a;  // A를 멤버 변수로 선언
};

  • 이러한 상황에서 전방 선언을 활용하면 문제를 효과적으로 해결할 수 있다.
// A.h
#pragma once

class B;  // B 클래스 전방 선언

class A {
public:
    B* b;  // 포인터 사용 가능 (객체 선언 X)
};

// B.h
#pragma once

#include "A.h"  // A의 정의가 필요하므로 포함

class B {
public:
    A a;  // A를 멤버 변수로 직접 선언 가능
};