오픈 소스 라이브러리를 사용하여 개발을 하거나, CMake를 이용해서 프로젝트를 빌드하거나 할 때면 다음과 같은 소스코드 파일 확장자들을 볼 수 있다.
• .c / .h /.cc / .cpp / .c++ / .cxx / .hpp / .hxx / .h++
.h / .hpp / hxx / h++
- 헤더파일, 선언 파일(.cpp, .cxx등)에 대한 최소한의 정보를 가지는 파일.
- hpp 등은 template, inline 함수 등 정의부분까지 일부 헤더에 포함된 파일.
.c / .cpp / .cc / c++ / cxx
- 정의문, C에서는 .c 파일, C++에서는 .cpp 파일.
그럼 위 파일들중 나머지 확장자들에 대해선 비슷하게 생겼는데 무슨용도로 사용되는건지 궁금증을 가지게 된다.
비슷하게 생긴되는 이유가 있다. 위 파일들은 모두 우리가 알고있는 그 C++ 에서 사용되는 확장자이다.
확장자라는게 단지 파일의 용도를 구별하기 위한 용도로 쓰이는 것이지, 전혀 다른 목적으로 사용되지 않는다.
그럼 위처럼 다른 확장자로 사용되는 이유는 무엇일까?
본래 처음 C++가 만들어졌을 때, 파일 확장자는 .c++를 사용하도록 되어있었다. 그런데 특정 OS(운영체제)에서는
확장자이름에 '+'를 사용할 수 없었기 때문에 '+' 대신에 'x'를 넣어 .cxx라고 쓴 것이다. 눈치 챈 사람도 있겠지만 'x'를 사용한 이유는 '+'를 옆으로 살짝 돌려 놓은 것처럼 생겼기 때문이다. MS-DOS와 MS-Windows에서는 .cpp를 사용하였는데 현재는 이것이 거의 표준처럼 되어있다. 관례적으로 파일 확장자 이름이 .c나 .h가 변형된 것 처럼 생긴 확장자라면 C++ 문법이 적용됬음을 의미한다고 보면 된다. 또한 iostream, vector 처럼 확장자를 표시하지 않는 스타일도 있다.
그런데 .hpp 또는 .hxx 확장자는 왜 굳이 사용했을까? 일반적으로는 C++에서도 헤더파일의 확장자 이름은 C에서처럼 .h를 사용한다. 다만 C++ 문법중에는 정의와 선언을 분리하기 어려운 상황이 몇 가지 있다. 그 중 한가지가 바로 템플릿(template)을 구현할 때이다. 템플릿의 타입이 컴파일시간에 지정되므로 헤더파일에 정의가 구현되어야 한다. 그래서 이런 경우에는 특별히 C++ 문법을 썼음을 확실히 명시하기 위해 .hpp, h++, .hxx 등을 사용하는 것이다. 템플릿 정의의 경우 .txx, .tpp, .tpl이라고 표시하기도 한다. 인라인 함수 정의에는 .ii, .ixx, .ipp, .inl을 쓰기도 한다.
그럼, 하나의 파일에서 모든 걸 처리할 수 있는데, 이처럼 파일을 분할하여 사용하는 이유는 무엇일까??
객체지향 프로그래밍 때문 아닐까 생각한다.
기본적으로 SW 개발 방법론의 기본이 선언과 정의, 인터페이스와 구현을 분리 하는 것이다.
이는 코드관리가 용이하고 유지보수가 쉽고, 가독성 또한 높아진다.
그럼, 어떻게 해야 선언과 정의를 잘 나눌 수 있을까? 에 대한 궁금중도 생긴다.
많은 개발 방법론과 디자인 패턴등을 통해서 다양한 방법을 제시할 것이다.
근데 사실 100% 맞는 정답이 있다고 말할 수 있는지 모르겠다.
개발자마다 지식수준과 개발 방법이 다르다. 그래도 앱이나 제품들은 개발이 되고 있다.
적용된 기술은 무엇인지, 어떤 논리와 근거로 개발이 되었는지는 잘 모른다.
하지만, 해당 제품/App에는 맞는 디자인과 기술들이 적용되어 있을 것이다.
어떻게 해야 더 좋은 방법 더 낳은 방법을 찾을 수 있을까?!
이러한 궁금증에 대한 자신만의 답을 얻기 위해서 표준이라고 불리우는 기술들, 디자인 패턴등의 적용을 통해서 과정을 거치고,
내가 어떠한 목적으로 파일을 분할하고, 이런 장점이 있을 것 같고 이렇게 해야만 하는 타당성이 있다면 그게 가장 좋은 정답이 아닐까 생각한다.
많은것을 보고, 따라해보며 더 많은것을 이해하려고 노력해야 한다.
무슨 일이든 아는만큼 보이기 마련이다. 모르는것이 아니라 안해봐서 모르는 것이다.
물론, 이런 걸 왜 해야 하는지에 대해서 의구심을 가지는 사람들, MVC/MVP 만이 정답이라고 생각하는 사람들 새로운 것에 대해 적용하는 것에 대해 자기가 해보지 않았다는 이유로 기피하는 사람들과 함께 한다면, 본인 스스로 노력을 많이 해야 한다.
참고
http://forums.codeguru.com/showthread.php?397010-What-s-with-*.cxx-files-instead-of-*.cpp
http://kugistory.net/104
http://scytalezz.tistory.com/37
http://zappygo.com/w_cpp/entry/document_srl/9922/page/1/sort_index/regdate/order_type/asc
출처: <https://www.blogger.com/blogger.g?blogID=7742867749829835092#editor/target=post;postID=6748049381216941021;onPublishedMenu=allposts;onClosedMenu=allposts;postNum=0;src=postname>