작성
·
680
1
요새 언리얼 작업을 하면서 전방선언에 대해 조금 깊이 공부하고 싶어서 다시 이전 수업을 찾아와 복습을 하고 있습니다.
제가 궁금했던점은, 어차피 .cpp 정의부에서 헤더파일을 추가할거라면 헤더에 추가하는것과 무슨 차이가 있는지, 즉 전방선언을 함으로써 이득이 될 수 있는 부분이 무엇인지가 궁금해서 다시 찾아왔는데, 아쉽게도 해당 강의에서는 구체적인 설명이 없었던것 같아서 질문을 남깁니다.
구글링을 찾아본바론, 결국 컴파일 시간에서 이득을 보려고 하는것이 가장 큰 이유라고 알게 되었습니다. 빌드시간이 워낙 길어진다는건 언리얼 프로젝트를 조금만 진행해봐도 커피 한잔 타고 와야 할만큼이나 답답함을 느낍니다. 만약 정말 이러한 길고 긴 컴파일 시간, 빌드 시간을 줄이고자 하기 위함이었다면,
제가 언리얼과 같은 프로젝트(가벼운 개인 프로젝트)를 진행할때 웬만하면 거의 전부다 전방선언을 할 수 있도록 설계하는게 프로젝트 관리에 있어서 효율적인가 궁금합니다.
그리고 말씀드린대로, 참조하려는 헤더파일에 변경이 생겨도 헤더파일의 재컴파일이 이루어지지 않는 이점 때문에 전방선언을 애용하는건지, 제가 개념을 제대로 이해했는지도 궁금합니다.
답변 1
6
그 부분은 좀 복잡한 내용이라 미래의 C++ 심화 시리즈 (컴파일/빌드 관련)에서 다루고자 미뤄뒀습니다.
요약하면 cpp 단위로 빌드가 되어 오브젝트 파일이 각기 만들어진 후,
다시 이를 링크 단계에서 합치고 최종 실행 파일이 만들어지는데요.
A.cpp에서 다른 헤더(B.h)를 include하면, 당장은 선언 형식만 알려주고
나중에 링크 단계에서 실제 구현부가 있는 주소랑 매핑해줍니다.
이 때 B.h에 변화가 생기더라도 A는 큰 영향을 받지 않고 단지 매핑된 주소만 바꿔치기 해주면 됩니다.
반면 A.h에서 다른 헤더(B.h)를 include하면, 둘 사이의 종속성이 생기게 되어
B.h에 변화가 생기면 A도 다시 빌드가 되어야 합니다.
이게 나비효과처럼 빠르게 불어날 수 있기 때문에
그냥 기본적으로
[항상 전방선언을 사용하되, 상속 구조와 같이 정말 어쩔 수 없는 상황에서만 헤더에서 헤더를 포함]
하는 규칙을 일상화 해야 합니다.
감사합니다! 궁금하던것이 해결됐습니다!