이 말이 무엇을 의미 하는가?
쉽게 말한다면 #include 관계를 뜻하고, 이 #include 관계를 줄이자는 뜻이다.


왜 파일 간 의존성을 줄어야 할까?
컴파일에 소모되는 시간을 줄여주기 때문이다. #include 관계가 많을수록 코드 수정 후 재컴파일에 들어가는 시간이 비례한다. 이게 프로젝트 중이라면, 정말 많은 시간을 컴파일하는데만 써야 할 것 이다.


어떻게하면 파일간의 의존성을 줄일수 있는가?
"구현 세부사항이 필요한 경우와 필요 없는것 경우를 나누면 된다" 이것이 원리이다.


구현 세부 사항이 필요한 경우가 어떤 경우인가?
풀면 이해가 쉽다. 구현 하는데 그 세부사항이 필요하다는것을 뜻하는데, 그 예로 A라는 클래스가 B라는 클래스의 객체를 가질 때, 객체 구현시 그 세부사항이 필요한 경우이다.


그렇다면 어쩔수 없이 #include를 해야 하지 않는가?
C++이 사랑 받는 이유는 이런 문제가 해결 된다는 점이다.(물론..사용자가 해야 한다는 점은 불편하다...... 대신 코드 짜 달라면 해주고 돈을 받을수 있단 것이 장점 일수도 있다고 위안을 삼자.)


해결 방법은 무엇인가?
1. 구현 세부 사항이 필요한 경우와 아닌 경우를 헤더 파일로 나눈다. 필요 없는 경우에 "전방선언" 사용한다.
2. 구현 세부 사항이 필요한 경우만 #include 사용해 의존 한다.


구현 세부사항이 필요 없는 경우을 어떻게 구분짓는가?
" 타 클래스 객체의포인터만 있어도 되는 경우를 필요 없는 경우"라고 나는 보고 있다. 포인터는 32bit에선 4Byte이고 64bit에선 8Byte인것을 컴파일러는 알기 때문에, 포인터 자체만 쓴다면, "전방선언" 으로 해결이 된다. 사실 전방 선언은 포인터로 선언 될때만 사용 할수 있다.

전방선언 하는 방법은 링크를 통해 알릴려고 했으나 .. 코드로 직접 표현 한다. (.. 왜냐하면 간만에 쓸만한 툴을 Tistory에 적용 시켰기 때문이다. .. 이런것을 보면 Tistory가 정말 "킹왕짱"님이다. 코드 보기 불편에서 코드를 않넣었는데, 이제부터 줄기차게 넣어야 할 판이다.)

//  CTest.h 파일 내부
class CTest
{
private:
    int a;
};

// CTest2.h 파일 내부
class CTest;        // <-- 전방 선언 구역
class CTest2
{
    private:
        CTest *pCTest;    // <-- 포인터 형태(.. auto_ptr등등등)만 전방선언 기법이 사용될수 있다.
};


이것이 바로 "전방선언" 방법이다. 하지만 전방선으로 해결이 안되는것들이 있는데, 진짜 구현 세부사항이 있어야 되는 경우이다. 이럴때는 한 클래스를 두 부분으로 나누는데, 한쪽은 인터페이스만 제공하고, 한쪽은 인터페이스의 구현을 만드는것이다.

정리하자면
1. 객체 참조자 및 포인터로 충분한 경우에는 객체를 직접 쓰지 않는다.,
2. 할 수 있으면, 클래스 정의 대신 클래스 선언에 최대한 의존하도록 만든다.
3. 선언부와 정의부에 대해 별도의 헤더 파일을 제공한다.
- 이 말은 즉 클래스 선언부만 #include 하고, "전방선언"을 쓰지 않는다는것이다. (이게 더 자연스러우면서 템플릿에 대해서도 유용하기 때문이라고 필자는 설명한다)

비용에 대해서는 More Effective C++ 를 읽으면 자세히 알수 있을것이라 생각되 생략하고, .. 개인적인 생각으로 어차피 구현부분을 수정한다면, 재컴파일을 필요 할수 밖에 없다. 전방선언과 클래스 선언부만를 실용적으로 쓸수 있을 만큼 쓰고, 안된다면 그냥 #include 해야 하는건 어쩔수 없다. 뭐.. 이것 때문에 개선시켜주는 컴파일도 그런쪽의 도움을 받는것도 한가지 방법이라 생각한다.


이것만은 잊지 말자
1. 가장 기본적인 아이디어 "정의" 대신, "선언"에 의존하게 만들자.
2. 라이브러리 헤더는 그 자체로 모든 것을 갖추어야 하며, 선언부형태여야 하고, 이 규칙은 .. 템프릿이건 아니건 동일하게 적용하자.

관련 링크
http://ikpil.tistory.com/332
http://kldp.org/node/85252
http://rookiecj.tistory.com/tag/%EC%A0%84%EB%B0%A9%EC%84%A0%EC%96%B8
http://eve8110.egloos.com/3137553
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요