C++ 언어는 C 언어에 객체지향적 개념을 추가한 프로그래밍 언어이다. C/C++ 언어는 호출 시점보다 아래에서 작성한 객체나 함수를 호출할 수 없다. 그렇기 때문에 우리는 간단하게 알고리즘을 작성할 때에도 main 함수 앞에 우리가 만든 사용자 정의 함수를 만들거나 함수 시그니쳐를 선언한다. 이것이 가장 많이 볼 수 있는 전방 선언의 한 예이다.
하지만 위와 같이 일반적인 상황에서 우리는 전방 선언에 크게 신경쓰지 않는다. 하지만 객체에서 다른 객체를 참조해야할 때에는 다르다. 예를 들어 A라는 객체와 B라는 객체가 있다고 가정해보자. A 객체가 B 객체를 참조하고 싶다고 한다면 보통 CODE_1 처럼 작성한다.
1
2
3
4
5
6
7
|
// CODE_1
#include "B.h"
class A
{
B b;
};
|
cs |
물론 정상 작동한다. 하지만 이 경우 B 객체의 헤더 파일이 가지고 있는 모든 사양을 A 객체와 동시 컴파일 하기 때문에 속도나 의존성면에서 권장되지 않는다. 내부 사양까지 알고 싶은 경우라면 크게 신경쓰지 않겠지만 그저 선언만 하고 그 객체가 존재한다는 것만 알고 싶은 경우에는 전방 선언을 이용해 CODE_2 처럼 작성할 수 있다.
1
2
3
4
5
6
7
8
|
// CODE_2
class B; // 전방 선언(Forward Declaration)
class A
{
B* b;
};
|
cs |
ㅇ이 경우에는 모든 것이 정상적으로 작동한다. 올바르게 전방 선언 하였으며 B 객체를 포인터 타입으로 선언하기 까지 했다. 여기서 포인터 타입으로 선언한 이유는 B 객체의 크기가 어느 정도인지 모르기 때문이다. 전방 선언으로는 내부 사양을 정확히 알 수 없기 때문에 CODE_3 처럼 작성한 경우에는 컴파일 에러를 일으키게 된다.
1
2
3
4
5
6
7
8
|
// CODE_3
class B; // 전방 선언(Forward Declaration)
class A
{
B b; // 컴파일 에러
};
|
cs |
CODE_2 처럼 포인터 타입으로 선언하게 되면 주소로 접근하기 때문에 상관이 없지만 CODE_3 처럼 객체 자체를 선언하게 될 경우에는 앞서 말했듯이 객체의 크기를 알 수없기 때문에 꼭 주의해서 선언해야한다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++/STL] vector의 주요 특징 (0) | 2022.03.21 |
---|