전방 선언(forward declarations) 과 정의(definitions)

실제로 식별자를 정의하기 전에 식별자의 존재를 컴파일러에게 미리 알리는 것이다

 

함수의 경우 전방선언을 하려면 함수 원형으로 사용해야 한다

전방선언을 할 경우 클래스의 존재만 인지시키는 것이기 때문에 포인터로밖에 선언하지 못한다

 

전방 선언을 사용하는 이유?

  • 참조하려는 헤더파일에 변경이 생겨도 헤더파일의 재컴파일이 이루어지지 않기 때문에 효율성과 속도가 증진된다!
  • 역참조가 되는 구조를 막기도 한다

코드

Closet.h 에 아래와 같이 선언되어있다고 보자.

class Button;
class Jumper {
    Button *pB;
    
};

전방 선언을 사용하지 않는다면 Closet.cpp는 이렇게 사용해야한다.

#include "Closet.h"
class Jumper {
    Button *pB;
    
};

하지만 전방선언을 쓴다면 요렇게 쓸수 있지롱

#include "Closet.h"
void Jumper::createButton() {
    this.pB = new Button;
}

 

또다른 예를 들자면..

 

아래 코드의 동작결과는 1+2=3이 아니다! 

void main()
{
	std::cout<< " 1+2 = :" <<add(1,2)<<std::endl;
}

int add(int x, int y)
{
	return x+y;
}

컴파일 에러가 난다... 

멍청이 컴파일러는 소스코드를 순서대로 읽기때문에, add함수가 무엇을 뜻하는지 알 수 없다.

이럴때에는 main문 앞에 전방선언으로 한줄만 추가해주면된다.

 

int add(int x, int y);

void main()
{ ... }

int add(int x , int y)
{ ... }

 

또는 매개변수의 이름을 지정하지 않고 int add(int,int)꼴로도 선언할 수 있는데

보는사람이 이해하기 힘드니까 그냥 동일하게 쓰는게 좋다 이말씀~

복사했습니다!