C 프로그래밍 입문/프로그램을 이해하기 쉽게 만드는 법
프로그래밍을 하는 데 있어서 논리적인 코드를 만드는 것 보다 더 중요한 일은 누구나 쉽게 이해할 수 있는 코드를 만드는 것 이다. 쉽게 이해할 수 없도록 꼬여있고, 일반적으로 사용하지 않는 방법을 써서 효율을 높이는 트리키(tricky)한 코드가 멋져보일지 모르지만, 프로그램 코드로서는, 특히 여러사람이 함께 작업하는 프로젝트의 프로그램 코드로서는 낙제점이다.
작성된 코드는 내가 아닌 다른 누군가가 보고 수정해야 하는 상황이 온다. 내 코드의 일부를 재활용해서 다른 프로그램의 일부분으로 사용될 수 도 있을 것이다. 스스로 만든 프로그램을 오랜 시간이 지난 후에 새로운 기능을 추가하기 위해 수정해야 하는 경우도 있을 수 있다. 그 모든 경우에, 만들어진 프로그램의 코드가 이해하기 어렵다면 종종 원래의 코드를 버리고 완전히 새로 작성하는 편이 더 빠른 경우가 비일비재하다. 그 시점에서 부터 원래의 코드를 작성한 사람은 아무일도 안한 셈이 되어 버리는 것이다.
프로그램을 이해하기 쉽도록 돕기위한 도구는 기본적으로 두 가지가 있다. 하나는 '주석'이고 다른 하나는 '들여쓰기' 이다. 주석은 컴파일러가 프로그램 코드를 컴파일 할 때 무시하고 컴파일 하게 되어 있어, 프로그램 코드를 볼 사람에게 전할 메시지나, 프로그램 코드에 대한 설명들을 추가할 때 사용된다. 최근(?!!)에는 이 주석 영역을 이용하여 자동으로 문서작업을 해주는 프로그램들도 많이 사용된다. 대표적인 C/C++ 문서화 도구로는 Doxygen이 있다.
주석달기
+/-주석(Comment)은 스스로, 그리고 다른 사람이 프로그램 코드를 쉽게 이해하도록 돕기위해 사용되는 도구이다. 물론 주석을 달지 않고, 프로그램 코드를 보는 것 만으로 프로그램을 이해할 수 있도록 작성되어 있다면 최상의 프로그램 코드가 되겠지만, 그런 프로그램 코드를 작성하는 것은 현실적으로 불가능(computational impossible)하다. 그런 프로그램을 작성하기 위해 100%의 노력을 들여 1년만에 완성하는 것 보다. 50%의 노력만 하고 나머지 50%를 주석으로 채워 넣고 6개월 안에 완성하는 편이 현실적으로 더 나은 선택이라 믿는다.
원래 C에서 사용할 수 있는 주석의 형태는
/*
원래 C 표준에서 사용하는 주석의 형태는 이것 하나 뿐 입니다.
*/
위와 같이 '/*'와 '*/' 사이에 원하는 메시지를 집어 넣는 형태 뿐이다. 이 형태의 주석은 여러줄의 추가 설명을 달 수 있다는 장점을 갖고 있다. 주석으로 지정된 내용은 프로그램을 컴파일 할 때 무시하고 컴파일을 한다. 그렇기 때문에 어떤 내용을 기록해도 사회적으로 법적으로 문제를 일으킬 수 는 있을지 몰라도 컴파일되어 만들어지는 프로그램에는 아무런 영향을 미치지 못한다. :)
이런형태의 주석을 사용할 때 주의할 점은 중첩되어(nested) 사용할 수 없다는 것이다.
/*
유효한 주석의 영역
/*
유효한 주석의 영역 2
*/
유효하지 않은 주석의 영역
이 부분에 있는 문장들은 프로그램의 일부로 여기고 컴파일을 시도하게 됩니다.
당연히 에러가 발생하겠지요
*/
위의 예제 코드에서 볼 수 있는 것 처럼 두번째 '/*'는 주석의 일부로 인식 되기 때문에, 컴파일러는 이 내용을 볼 수 없다. 따라서 첫번째 '*/'가 두번째 '/*'의 짝이 아니라 첫번째 '/*'의 짝으로 인식 된다. 그렇기 때문에 첫번째 '*/'이후의 내용은 프로그램 코드의 일부로 인식되고, 두번째 '*/'는 짝이 없는 놈이 된다. 당연히 컴파일 할때 문법 에러가 잔뜩 나오게 된다.
C++ 에서 새로운 형태의 주석이 도입 되었는데, 특정위치 부터 줄의 끝까지를 주석으로 처리하도록 하는 것이다. 이 형태의 주석은 주로 간단한 주석을 기록하기 위한 용도로 많이 사용 된다.
return 0; // 이부분은 주석으로 처리됩니다.
이 형태의 주석은 한 줄만 주석으로 처리할 수 있기 때문에 조금 더 편리하기도 하거니와, 영역을 표시하는 주석과 섞어서 사용할 수 있다는 장점을 갖고 있기도 하다. 예를 들어 코드의 일부를 잠시 주석 처리 하여 동작하지 않도록 하려는 경우 원래 C 형태의 주석이 중첩되지 않는 다는 문제 때문에 사용하기가 아주 어렵지만, '//'를 이용하여 주석처리가 되어 있다면 큰 어려움 없이 적용 할 수 있다.
* 블럭 주석을 쓰는 경우 *
int main()
{
/*
printf("Hello World!\n"); /* 난 헬로 월드가 싫어요 */
여기에서 에러가 납니다. */
return 0;
}
* 한줄 주석을 쓰는 경우 *
int main()
{
/*
printf("Hello World!\n"); // 난 헬로 월드가 싫어요
에러없이 깔끔하게 컴파일 됩니다. */
return 0;
}
대부분의 C++ 컴파일러와 함께 파서를 공유하는 C 컴파일러들이 한줄 주석을 쓸 수 있도록 되어 있기는 하지만, 드물게 사용할 수 없는 경우도 있으니 '당연히 될 것 이다'라는 생각을 갖고 써서는 안된다.
들여쓰기
+/-작성된 프로그램 코드를 이해하기 쉽도록 해주는 두번째 툴로는 들여쓰기(indentation)이다. 들여쓰기는 포함관계를 명확하게 하기 위해 일정 문자만큼 안으로 들여 써 주는 것이다. 다음의 두 예를 보도록 하자
#include <stdio.h>
int main ()
{
for (i=0;i<12;i++)
{
if ((ch=getch())
{
}
else
{
}
}
return 0;
};
#include <stdio.h>
int main ()
{
for (i=0;i<12;i++)
{
if ((ch=getch())
{
}
else
{
}
}
return 0;
};
내용도 없고 몇 줄 되지도 않는 프로그램임에도 불구하고 두 프로그램 코드 간에 차이가 심한 것을 알 수 있을 것이다. 이와 같이 프로그램 작성하는데 있어서 들여쓰기를 하는 것은 프로그램을 이해하기 쉽게 하는데 많은 도움이 된다. 들여쓰기를 하는 정도에 있어서는 개인적인 취향이 많이 적용되는 것으로 스스로 코드 작성하기에 편하고, 쉽게 구조를 이해할 수 있는 정도로 해주면 된다. 들여쓰기에 많이 사용되는 정도는 스페이스 3개, 4개, 8개(혹은 탭 키)가 많이 사용된다. 탭 키를 사용하는 경우에는 여백이 많기 때문에 시원해 보이고 보기에는 가장 편하지만 문장 하나의 길이가 긴 경우나, 여러 단계에 걸쳐서 블록이 생성된 경우에는 오히려 보기 힘들다는 단점이 있다.
주석 및 참고자료
+/-