소스 코드 가독성 측면에서 C언어의 define 사용은 적절한가?

2013-03-17 12:31

대학교에서 프로그래밍 관련 수업을 들을 때 처음으로 C를 접했던 기억이 난다. 군대 가서 C가 뭐하는 놈인지 모두 잊어버리고 살다가 프로그래머의 길을 본격적으로 걷기 시작할 때 처음 시작한 언어가 C이다. 왜냐고? 자바 프로그래밍 과정을 듣는데 C로 시험을 봤기 때문이다. 그렇게 2,3주 빡세게 공부해서 합격했던 기억이 난다. 벌써 13년 전이다.

최근에 자료구조와 알고리즘 수업 들으면서 다시 C를 듣는데 처음 C를 배울 때와는 사뭇 다른 느낌이다. 그 당시에는 몰랐는데 나름 재미있고, 그 당시보다는 쉽게 이해할 수 있어 더 재미있는 듯하다. 지금까지 10년 이상 자바를 사용해왔지만 한 가지 언어를 사용할 수 있다는 것이 다른 언어를 학습하는데도 많은 도움이 된다는 생각이 든다.

근데 C를 사용하면서 궁금한 점이 생겼다. C 라이브러리를 보면 참 많은 define을 사용한다. 물론 라이브러리이기 때문에 공통 부분에 대해 define으로 정의하는 것은 의미가 있다고 생각한다. 그러면 라이브러리류가 아닌 우리가 직접 구현할 때도 define을 많이 사용하는지 궁금하다. 개인적으로 코드 가독성 측면에서 그리 좋지 않다는 생각이 들어 의문점을 가져봤다. 유용한 기능인 것은 맞지만 define보다는 그냥 function으로 구현하는 것도 그리 나쁜 선택은 아니지 않을까? 아직까지 C 언어에 대한 경험이 많지 않아 다양한 의문점이 드는 것도 나름 재미있다.

3개의 의견 from SLiPP

2013-03-18 07:44

그냥 드는 생각에 #define의 용처가 크게 세 가지인데요. 1) 상수: 꼭 써야죠. 2) 매크로: 나쁘지 않죠. 성능도 좋고 중복도 없애고... function call을 inline으로 대치하는 건 컴파일러 단계에서 많은 컴파일러가 알아서 해주기도 하고 자바도 JVM이 JIT 컴파일하면서 수행하는 행위이기도 합니다. 사람이 하느냐 기계가 알아서 해주느냐 차이일 뿐 흔히 사용되는 기법이죠. 3) 조건부 컴파일: 이건 꼭 필요할 때만 써야 합니다. 남용되는 편이죠. 하지만 여러 플랫폼을 지원하려면 안 쓸 수가 없는...

그리고 C가 한참 설계되고 사용되는 시절엔 함수 호출 비용조차 절약해야 했죠. call stack도 아껴야 했고... C뿐아니라 C++ 조차도 가상 함수를 쓰면 직접 함수 호출이 일어나지 않고 가상 함수 테이블을 한번 조회한 후 호출하기 때문에 성능이 늦어진다면서 가상 함수를 쓰지 말라고 할 정도였으니까요. 문제는 21세기인 요즘도 그런 관행이 남아 있다는 거...

의견 추가하기

연관태그

← 목록으로