박하의 나날

전방선언

프로그래밍/언어들

 

전방선언

어떤 함수나 클래스를 사용하기 전에 앞에 적어둬서 이런 클래스/함수 가 있다- 하고 알려주는 것.

함수의 원형만 가능하고,

클래스의 경우는 이런클래스가 있다- 밖에 모르기 때문에 포인터로 밖에 선언하지 못한다.

1
2
3
4
5
class A; //전방선언
class B{
    public:
        A* ptr;
}
cs

전방선언 왜 사용할까?

1. 예를 들어 Hello.cpp랑 Hello.h가 있다 하자. Hello.cpp에서는 Hello.h를 포함해야 하는데 참조하려는 헤더파일에

변경이 생겨도 참조하는 헤더파일에서는 재컴파일이 이루어지지 않는다.

2. 헤더파일을 포함하지 않고 포인터로 변수를 선언할수 있는데- 이게 중복된 include를 피할수 있게 해준다.

 

1
2
3
4
5
#include"b.h"
class A
/*************/
#include"a.h"
class B
cs

이렇게 있다면 보통은 중복을 안하려고 #pragma once를 붙이는데 그러면

 

1
2
3
4
5
6
7
#pragma once
#include"b.h"
class A
/************/
#pragma once
#include"a.h"
class B
cs
 

 

이렇게 된다. 이게 왜 문제일까? 과정을 보면,

1)b.cpp를 컴파일한다. b.cpp 상단에는 b.h가 include되어있으니까 컴파일러는 b.h를 포함시킨다.

2)b.h를 가보았다. a.h가 include 되어있다. a.h도 포함해야겠네.

3)a.h를 가보았다. b.h가 include 되어있다. 아까 b.cpp에서 include 했는데.. 또해야겠네?

4)근데 a.h 에 #pragma once가 있잖아. 그럼 헤더파일은 한번만 불러야지.

: 그럼 a.h에 #include "b.h"는 왜있는거지? ==> 불필요

 

1~4번 컴파일 과정을 보니까 a.h에 있는 #include "b.h"가 불필요한거 같아서 지우려고 했다.

그런데 class A에 멤버변수로 B b 클래스가 있으면?

#include "b.h"를 지워버리면 B가 있는지 알수가 없어서 에러가 뜰텐데.

#pragma once를 없애면? 두번 중복되어서 에러가 더뜬다.

 

그래서 나온게 전방선언.

 

1
2
3
4
5
6
7
8
9
10
11
#pragma once
class B
class A{
    B* ptr;
}
/************/
#pragma once
class A
class B{
    A* ptr;
}
cs

 

이렇게.

컴파일 속도면에서나 헤더를 엉키지 않게 하는면에서 효율이 있다.

물론 헤더는 각각의 소스파일에 포함해야하고.

 

https://www.slideshare.net/Ruvendix1/google-coding-guide

 

근데 또 구글코딩 가이드를 보면

전방선언보다 #include를 활용하라고 한다.

전방선언을 이용하면 불필요한 #include를 줄일 수 있지만 실질적인 성능개선 효과는 없고

컴파일 타임을 줄이는 효과만 있다고.

 

그냥 적당히 써야징:>

책보다가 한국어인데 못알아들어서 정리하는 전방선언 ㅎㅎ..

 

 

 

 

'프로그래밍 > 언어들' 카테고리의 다른 글

Dictionary<TKey, TValue>  (0) 2017.03.23
JavaScript)기초  (0) 2017.03.22