전방선언

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

헤더 추가 ver.   vs.   전방선언

 

Ver1. 헤더를 추가하여 클래스 정보를 불러오는 방법

-  #include로 헤더를 추가한다.

-  클래스 사이즈만큼 불러온다.

-  클래스 사이즈만큼 불러오기 때문에 클래스의 크기가 크면 메모리 소모가 크다.

 

 

Ver2. 전방선언을 하고 참조 형태로 가지고 오는 방법

-  class 클래스명 형식으로 전방선언한다.

-  클래스를 참조해서 데이터를 사용한다.

-  포인터 사이즈만큼만 메모리가 필요하다. (32bit 운영체제는 4byte, 64bit 운영체제는 8byte 사용). 고정 사이즈다!

 

 

Monster.h

#pragma once

class Monster{
public:
    void KillMe();
    
public:
    int _monsterId;  // +0
    int _hp;         // +4
    int _defence;    // +8
};

Monster.cpp

#include "Monster.h"

void Monster::KillMe()
{
    _hp = 0;
}

 

 

Player.h

#pragma once
#include "Monster.h"

class Player{
public:
    void KillMonster();
    void KillMonster2();

public:
    int _hp;
    int _attack

    Monster _target;        // ver.1 : Monster를 직접적으로 포함하고 있는 상태. Monster사이즈만큼 불러옴.
                            // Monster의 설계도를 가져와야하는 상황. "Monster.h" 필요
    class Monster* _target2;// ver.2 : Monster를 참조. 포인터 사이즈만큼만 필요함(고정 사이즈). 
                            // Monster 설계도 필요x. "Monster.h" 필요x. 전방선언 필요.

    Player* _target3;  // 클래스 내에 자신과 똑같은 형태로 등장하는 경우 되도록 포인터 형태로 작업하자.
};

Player.cpp

#include "Player.h"
#include "Monster.h"

void Player::KillMonster()
{
    // [ 주소 ] => [ [_monsterId][_hp][_defence] ] ->>  [ [_monsterId][_hp=0][_defence] ]
    _target2->_hp = 0;	  // _target2주소로 이동한 다음 _hp에 0을 넣어주세요
    (*_target2)._hp = 0;  // 위와 같은 표기

    _target2->KillMe();
}

void Player::KillMonster2()
{
    _target2->_hp = 0;
}

메인.cpp

#include <iostream>  
using namespace std;
#include "Player.h"  // 우리가 만든 헤더""

int main()
{
    // Player는 몇 바이트?
    // int 2개 + sizeof(Player*) 32비트 기준 = 2 * 4 + 4 = 12 byte
    // sizeof(Monster*) = 4 or 8바이트 (32비트 or 64비트 운영체제 프로그램)

    Player p1;  // 지역변수 (Stack)
    Player* p2 = new Player();  // 동적할당 (Heap)

    p1._target3 = p2;

    return 0;
}