본문 바로가기
C++

전방 선언

by Oz Driver 2026. 1. 5.

컴파일러에게 사용하고자 하는 객체 타입만 알려서 컴파일을 가능하게 하는 것을 전방 선언이라고 합니다.

코드로 보면 매우 단순합니다

class Player;

 

이 한 줄 코드로

 • Player 라는 타입 이름이 존재한다.

 • 구현은 모른다.

 • 멤버도 모른다. 

 • 크기도 모른다

 

그래도 컴파일은 됩니다.

결국 전방 선언이라는 것은 헤더 포함 (#include) 을 회피하고, 컴파일에게는 최소한의 타입 정보만을 제공함으로써 결과적으로 컴파일 시간을 절약하기 위한 방법이라고 할 수 있습니다. 단, 여기에는 몇가지 조건이 있습니다.

 

1. 포인터 멤버나 참조 (가능)

class Player;

class Enemy
{
    Player* target;   // OK
};

 

이 경우 포인트의 크기는 주소값이므로 고정이고 Player 크기를 몰라도 되기 때문에 가능합니다.

참조도 내부적으로는 주소이기 때문에 가능합니다. 

 

2. 객체 타입으로 선언만 있는 경우 (가능)

class Player;

class Enemy
{
public:
    void SetTarget(Player* p); // OK (선언만)
};

 

3. 객체를 값으로 멤버로 가질 때 (불가능)

class Player;

class Enemy
{
    Player p;   // ❌ 컴파일 에러
};

 

이 경우, 객체를 값으로 들고 있으려면 크기를 알아야 하는데 전방 선언으로는 이 정보를 모르기 때문에 컴파일 오류입니다. 

 

4. 멤버 접근 (불가능)

class Player;

void Foo(Player* p)
{
    p->Move();   // ❌ 컴파일 에러
}

 

Player 의 멤버 구조를 모르기 때문에 이 경우 역시 컴파일이 실패합니다.

 

이 이외도 다양한 경우들이 있겠지만, 기본적으로 타입 정보 외에 다른 정보들을 필요로 하는 경우는 전방 선언으로 해결이 안된다고 생각하면 됩니다.