나만의 작은 도서관
[C++] 전방 선언(Forward Declaration) 본문
전방 선언(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를 멤버 변수로 직접 선언 가능
};
'C++ > 문법 및 메소드(STL)' 카테고리의 다른 글
[C++][Callback] #2. 함수 포인터(Function Pointer) (0) | 2025.04.02 |
---|---|
[C++][Callback] #1. 콜백 함수와 Callable, 그리고 std::function (0) | 2025.04.02 |
[C++] 캐스팅(Casting) (0) | 2025.03.28 |
[C++][Class] 클래스 관련 기타 내용(explicit, mutable, friend 키워드 등...) (0) | 2025.03.26 |
[C++][Class] 오버라이딩과 가상 함수 (0) | 2025.03.26 |