컴파일러에게 사용하고자 하는 객체 타입만 알려서 컴파일을 가능하게 하는 것을 전방 선언이라고 합니다.
코드로 보면 매우 단순합니다
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 의 멤버 구조를 모르기 때문에 이 경우 역시 컴파일이 실패합니다.
이 이외도 다양한 경우들이 있겠지만, 기본적으로 타입 정보 외에 다른 정보들을 필요로 하는 경우는 전방 선언으로 해결이 안된다고 생각하면 됩니다.
'C++' 카테고리의 다른 글
| 복사의 종류와 차이점 (0) | 2026.01.08 |
|---|---|
| 매크로란 무엇인가? (0) | 2026.01.05 |
| TCHAR 에 대한 이해 (0) | 2026.01.04 |
| const 는 어디에 위치하느냐에 따라 의미가 달라집니다 (0) | 2026.01.02 |
| 헤더(.h)와 소스(.cpp)를 분리하는 이유 (0) | 2025.12.27 |