Thinking Different




코딩을 하다보면 예측하지 못하는 경험을 수두룩하게 하게 되는데 그 중에 하나인 전방 선언에 대해서 아주 좋은 글이 있어서 퍼왔다.



전방선언이란 h에서 사용하려는 클래스를 먼저 선언하고 cpp에서 사용하려는 객체의 h를 include 하는 방식 입니다.

h

1
2
3
4
5
6
7
8
class UtilClass;
 
class Core
{
......
 
private UtilClass* util;
}

cpp

1
2
3
4
5
6
7
#include UtilClass.h;
...
 
init
{
    util = new UtilClass;
}

전방선언을 사용하면 h에는 객체의 포인터만을 사용해 합나다. 이런 제한은 문법적으로 만들어진 것이 아니라 프로그램이 실행되는 구조에 의한 것입니다.


모든 포인터는 4byte의 메모리를 필요로하므로 우선 메모리만 확보해 두면 runtime에 생성되는 개체의 주소값을 저장할 수 있게 됩니다.


포인터가 아닌 객체의 인스턴스가 사용된다면 컴파일러는 클래스의 구조를 알아야 되므로 include된 h파일이 필요하게 됩니다.


전방선언을 사용해서 얻게 되는 이점은 컴파일 시간이 단축된다는 것 입니다. 위 구조에서 전방선언이 아니라 h를 include했다면 UtilityClsss가 수정 될 때마다 컴파일로는 h를 다시 분석하게 되겠죠 만약 UtilityClass가 다른 h를 포함하고 Core클래스가 또 다르 곳에사 사용하게 된다면 의존성이 증가되어 컴파일 시간은 점점 늘어나게 됩니다.


또 전방선언은 A객체가 B를 사용하고 B객체가 A를 시용하는 상호참조에서도 유용하게 사용 됩니다.


그리고 API개발 등에서 불필요한 h를 포함하지 않을 수 있다는 장점이 있습니다.


단 인라인 함수는 사용할 수 없게 됩니다.



출처 : http://blog.goooood.net/192