프로그래밍 언어/C++

[게임 프로그래머 입문 올인원] 동적할당과 캐스팅 : 전방 선언 (40강)

순정법사 2023.09.15

A. 전방 선언(Forward Declaration)

1. 전방 선언

a. 전방 선언이란?

🌟 컴파일러에게 식별자(함수, 클래스, 변수 등)가 미리 선언되어 있다고 알려주는 것

C++ 및 다른 프로그래밍 언어에서 사용되는 중요한 개념 중 하나
헤더 파일의 사용을 최소화하고 코드를 더 효율적으로 구성하는 데 도움

 

b. 전방 선언의 목적

  1. 순환 참조(Circular Dependency) 문제를 해결하고 헤더 파일의 의존성을 최소화하는 데 사용
  2. 컴파일 속도를 향상시키고 중복된 코드를 방지하는 데도 도움
  3. 특히 대규모 프로젝트에서 중요한 역할

 

👉 즉, 무거워지고 꼬이기때문에 사용하는 것

 

💥 순환 참조의 컴파일 오류

순환 참조는 서로에 대한 헤더 파일을 포함하거나 의존하는 경우 발생할 수 있으며,
이로 인해 컴파일 오류가 발생할 수 있음

 

 

2. 전방 선언의 종류

a. 함수의 전방선언

🌟 함수의 원형(Prototype)을 제공해 컴파일러가 함수가 어떤 매개변수를 받고 어떤 값을 반환하는지 알림

 

⏳ 예제 : 함수의 전방선언

// 전방선언
void myFunction(int param1, double param2);

int main() {
    // 함수 호출
    myFunction(42, 3.14);
    return 0;
}

// 함수 정의
void myFunction(int param1, double param2) {
    // 함수 내용
}

 

b. 클래스의 전방선언

🌟 클래스의 선언을 제공해 클래스의 멤버 함수 또는 멤버 변수를 정의하지 않고 클래스의 존재를 알림

 

1) 전방 선언을 해야할때

 

다른 클래스가 포인터로 관리되는 상황일 때

헤더에다가는 전방선언하고, cpp파일에 추가해주기!

 

2) 전방 선언이 안될때

 

  • 멤버 변수로 들고 있거나 (메모리 크기를 가늠해야하기 때문에 정확히 알아야 함)
  • 상속받고 있는 부모 클래스가 있을 때
  • 다른 클래스의 멤버 변수를 수정할 때

 

⏳ 예제 : 클래스의 전방선언

// 전방선언
class MyClass;

int main() {
    MyClass* myObject; // 포인터 선언 가능
    return 0;
}

// 클래스 정의
class MyClass {
public:
    void myMethod();
};

void MyClass::myMethod() {
    // 멤버 함수 내용
}

 

💙 단 한 코드만 전방선언이 필요할 때

아래 그림과 같이 바로 전방선언을 코드에 넣을 수 있음

귀엽다

 

 

3. 실습 문제 수정

a. 인벤토리 실습

1) 문제 발견 

 

아이템을 받을 인벤토리를 생성할 때 아이템을 배열로 받기 위해 Item.h를 포함시켰음

근데 이렇게 헤더파일에 헤더파일을 포함하는 것은 특히 순환참조가 발생할 수 있다

 

내가 작성한 코드를 캡쳐해봣다 ㅎ.ㅎ

 

2) 전방 선언으로 해결

 

Item 클래스를 선언해줌으로서 굳이 필요하지 않은 내용을 받아오지 않고도 오류 없이 코드를 실행시킬 수 있음

 

틀만 만들어주면 되니까 이렇게 사용

 

하지만 직접적인 값이 꼭 필요한 cpp파일에서는 틀만 있으면 안됨

정확안 클래스의 형태가 있어야 함수를 호출하고 하기 때문에

cpp파일에서 #include "item.h" 코드를 추가시켜준다

 

직접적으로 사용하는 곳에선 추가하기!

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com