2011. 9. 14. 16:13

[ 011 ] - 공백문자를 사용하여 코드를 보기 좋게 만들자.

프로그래밍을 시작한 지 얼마 안 되는 사람들은 소스 코드를 작성하기에 급급해서 다음 코드와 같은 형태로

구성하는 습관이 있습니다.

위의 코드에서 공백문자만 추가하면 다음과 같습니다.

연산자와 변수 사이에 단순히 공백문자 하나만 더 추가했을 뿐인데도 위의 코드보다 훨씬 보기가 편할 것입니다.

사실 실행 결과는 위의 코드나 아래 코드나 똑같지만 소스 코드를 작성하는 사람들의 의무 가운데 다른 사람이

자신의 소스 코드를 보더라도 쉽게 이해할 수 있도록 해야 한다는 조항이 있다는 것을 명심하세요.

 

[ 012 ] - 변수를 사용할 때는 수직으로도 정렬하자.

이 방법도 신입 사원들에게 제가 권장하는 방법 중의 하나입니다.

위와 마찬가지로 이렇게 하지 않아도 사실 상관은 없지만 이것은 소스 코드를 한눈에 보기에 더 좋은 방법입니다.

소스 코드를 수직으로 줄을 맞춘다는 의미는 보통 변수들, 특히 구조체의 멤버나 구조체 포인터를 사용하여

멤버의 값을 초기화할 때 각각의 이름의 길이에 따라 소스 코드가 들쑥날쑥 하게 됩니다.

이런 경우가 한두 줄이면 그다지 상관없겠지만 그 수가 좀 많아지면 보기에 안 좋겠죠.

다음은 수직으로 정렬되지 않은 소스 코드입니다.

대략 위와 같은 코드가 있다고 가정하면 코드에는 큰 문제는 없어 보입니다.

그러나 위의 코드를 다음과 같이 수직으로 정렬하면 어떨까요?

물론 수직으로 정렬할 때도 <Spacebar> 가 아닌 <Tab> 으로 열을 맞춥니다.

위의 코드는 그다지 길지 않기 때문에 특별히 표가 나지는 않지만, 실무에서 이와 비슷한 작업을 하다 보면

초기화 변수만 수십 개를 쓰는 경우도 생깁니다. 이런 경우에는 위의 코드와 같이 수직으로 정렬을 해두면

나중에 코드를 보거나 디버깅할 때 도움이 됩니다.

 

[ 013 ] - 전역 변수의 사용을 최대한 피하자

전역 변수도 나름대로의 장점이 있기 때문에 필요한 경우에는 사용해야 하지만 되도록이면 매개변수나

구조체를 이용하여 전역 변수의 기능을 대신하는 것이 좋습니다. 지금보다 나은 실력의 프로그래머가 되려면

전역 변수의 사용을 최대한 피하는 것이 좋은 프로그래밍 습관입니다.

 

[ 014 ] - 정적 변수를 활용하자.

우리가 일반적으로 알고 있는 static의 기능 외에 다른 파일의 변수의 값을 변경하거나 아무 제약 없이

접근하는 것을 막을 수 있습니다. 이와 같은 기능을 C++나 자바와 같은 객체 지향 프로그래밍에서 private이라는

키워드로 제공합니다. 비록 C 언어에서 완벽하지는 않아도 정적 변수를 사용하면 다른 파일이 변수 값을 수정할

때 일어날 수 있는 버그나 오류를 막을 수 있습니다.

예를 들면 앞의 예제에서 SetAge()와 같은 함수는 사람의 나이를 설정하는 기능이므로 음수가 절대 있을 수 없습니다.

이때 다음과 같이 SetAge() 함수를 수정하면 무의식적으로 저지를 수 있는 실수를 막을 수 있습니다.

위의 코드처럼 매개변수 num의 값이 0보다 큰 경우에만 정적 변수 Age에 대입하고 그렇지 않은 경우에는

에러 코드를 출력하게 할 수 있습니다.

 

[ 015 ] - 정적 함수로 접근 권한을 주자.

정적 변수와 마찬가지로 정적 함수를 사용하면 함수가 정의된 파일 안에서만 함수를 사용할 수 있고

다른 파일에서 접근하는 것을 허용할 수 있습니다. 이와 같은 방법은 프로그래밍의 모듈화를 극대화할 수 있으며

디버깅에 들어가는 시간과 노력을 줄일 수 있습니다.

많은 사람들이 C++가 C 언어보다 우수하다고 말하는 이유 가운데 하나가 바로 접근 권한을 줄 수 있기 때문인데,

실제 C 언어에서도 완벽하지는 않지만 파일(모듈) 단위로 접근 권한을 줄 수 있습니다.

 

[ 016 ] - 변수, 함수 이름은 누구나 이해하기 쉽게 만들자.

여러 명이 공동으로 프로젝트를 진행하는 경우에는 함께 프로젝트에 참여하는 사람들이 미리 이름 규칙을 협의하는

것이 좋습니다. 묵시적으로는 헝가리언 표기법을 따르겠지만 프로젝트의 성격에 따라 특별히 이름을 정하는 것에 대한

규칙을 정해 두는 것도 좋습니다.

예를 들면 플래그 기능으로 사용하는 변수는 f를 사용하며, 포인터는 p, char형의 경우는 변수 이름 앞에 c를 붙이고 문자열인 경우는 s를 붙인다고 미리 협의를 하면 각 파트에서 이름을 결정할 때 도움이 될 수 있습니다.

이와 같은 형식을 사용하면 변수 이름만 보고도 그 변수의 자료형을 예측할 수 있기 때문에 자료형이 달라서 생기는 오류나 버그를 미리 막을 수 있습니다.

 

[ 017 ] - 같은 자료형을 서로 다른 목적으로 사용하려면 typedef를 이용해서 새로운 자료형으로 정의해서 사용하자.

C 언어에서 제공하는 자료형은 한계가 있기 때문에 서로 다른 목적으로 사용하는 변수라고 해도 같은 자료형으로

데이터를 표현하기가 쉽습니다. 대표적인 것이 정수형인 int형과 문자형인 char형입니다.

소스 코드가 복잡하지 않고 길지 않으면 같은 자료형을 사용해도 크게 상관이 없지만, 소스 코드가 복잡하고

소스 코드 파일의 개수가 많을 때에는 같은 자료형을 사용하면 아무리 변수의 이름을 쉽게 표현해도 프로그램을

이해하기 어렵습니다.

이때 문제를 해결하기 위해서 사용할 수 있는 것이 typedef입니다.

다음과 같이 같은 정수형, 문자형이라도 필요한 목적에 맞게 정의해서 사용하면 소스 코드를 이해하기가 훨씬 쉽습니다.

 

 

[ 018 ] - const 포인터의 숨겨진 기능을 알아 두자.

C 언어에서 제공하는 const는 단지 상수 값을 사용하는 기능만 있는 것은 아닙니다.

특히 포인터와 함께 const를 사용할 때는 다음과 같은 숨겨진 기능이 있습니다.

 

① const 포인터가 가리키는 값을 변경할 수 없다. 단 const 포인터의 주소는 변경할 수 있다.

② const 포인터는 일반 포인터로 할당될 수 없다.

 

이 두 가지 특징은 포인터를 사용할 때 생길 수 있는 논리적인 버그를 어느 정도 예방할 수 있기 때문에 꼭 기억해 두세요.

 

[ 019 ] - 메모리 주소를 출력할 때에는 %#x 형식 지정자를 사용하자.

포인터의 주소를 출력할 때 다음과 같이 printf() 함수 안의 형식 지정자를 "%#x"로 사용하는 경우가 있습니다.

printf("NormalPtr[%#x] : %s\n", NormalPtr, NormalPtr);

보통 초보 프로그래머의 경우 포인터의 주소를 출력할 때 %p를 사용합니다.

%p의 경우는 16진수 형태로 포인터의 주소를 출력하라는 의미입니다.

따라서 %p를 사용하여 출력하면 다음과 같은 결과가 나타납니다.

NormalPtr[00424678] : RYAN

이때 %#x를 사용하면 다음과 같은 결과가 나타납니다.

NormalPtr[0x424678] : RYAN

%p를 사용하는 것보다 %#x를 사용하는 것이 포인터의 주소를 출력하는 데 훨씬 보기가 편하다는 사실을 알 수 있습니다. 또 어떤 경우에는 %#x 대신 %x를 사용하기도 하는데 %x를 사용하면 다음과 같은 결과가 나타납니다.

NormalPtr[424678] : RYAN

세 개의 형식 지정자 모두 포인터의 주소를 출력하는 형식으로 사용하지만 위의 세 가지 표현 가운데

실제 프로그래밍에서 사용하는 메모리 주소의 형식과 가장 맞는 표현이 0x424678의 형태이기 때문에

%#x를 사용하는 것이 좋습니다.

 

[ 020 ] - 함수를 사용할 때 좋은 습관 다섯 가지를 지키자.

함수가 얼마나 중요한 역할을 하는지 프로그래밍을 다루다 보면 뼈저리게 느낄 수 있습니다.

하지만 어떤 규칙도 없이 함수를 사용하면 소스 코드의 양이 많아지고 프로그램이 복잡해져서 상당한 곤란을 겪습니다.

따라서 다음 다섯 가지 습관을 지키어 함수를 사용하세요.

 

① 프로토타입을 명시하자.

② 반환 타입을 정확하게 기입하자.

③ 함수의 이름은 기능을 알기 쉽게 작성하자.

④ 함수의 매개변수를 잘 활용하자.

⑤ 하나의 함수는 한 가지 기능만 구현하자.

 

Posted by devanix