C언어 프로그래밍 스타일에 관하여...
프로그래머에 따라 코딩 스타일은 다양하며, 보통 2~4가지의 코딩 스타일이 있습니다.
현재 본인의 코딩 스타일은 무엇이며, 어떤 스타일이 좋을 지 생각해 보기 바랍니다.
[A 스타일 - 공백 주기]
if( i == 5 )
{
}
- if문의 소괄호 '('와 i 사이에 공백이 있다.
- i와 == 사이에 공백이 있다.
- 5와 소괄호 ')' 사이에 공백이 있다.
- 중괄호 {}가 같은 열에 위치한다.
- 코드가 한 눈에 들어오며, 단축키 Ctrl+']'에 의해 중괄호의 쌍을 쉽게 찾을 수 있다.
[B 스타일]
if(i==5){
}
- 전혀 공백이 존재하지 않는다.
- 중괄호가 하나는 뒤에 있고, 다른 하나는 앞에 있다.
- 문장의 구분이 없으므로 직관적인 해석이 어려우며, 중괄호가 위치한 열이 맞지 않는다. 중괄호가
위치한 열이 맞지 않을 때, 중괄호 내에 많은 문장이 존재할 경우 단축키 Ctrl+']'에 의해 중괄호의 쌍을 찾기가 어렵다.
[A 스타일 - 문장간 공백 주기]
int i = 5;
int j = 7;
printf( "%d", i , j );
- 변수의 정의와 printf() 함수 사용 시에 공백 줄이 존재한다.
- 변수의 정의 부분과 함수 호출 부분이 공백줄로 구분되어 있으므로, 문장 구분이 쉽고 유지 보수가 용이하다.
[B 스타일]
int i = 5;
int j = 7;
printf( "%d", i , j );
- 변수의 정의와 printf() 함수 사용 시에 공백 줄이 존재하지 않는다.
- 코딩이 길어질 경우, 문장의 구분이 어려워지며, 유지보수 시간이 오래 걸린다.
[A 스타일 - if문]
if( i == 5 )
{
break;
}
- 중괄호 블록이 존재한다.
- if문의 범위가 확실해 진다.
- 디버깅 시 중괄호 사이에 추가 문장 삽입이 쉽다.
[B 스타일]
if( i == 5 )
break;
- 중괄호 블록이 존재하지 않는다.
- if문의 범위가 한 줄로 한정되며, 잘못하면 오류를 발생시킬 수 있다.
- 디버깅 시 중괄호를 사용한 후, 디버깅 문장을 추가해야 한다.
- 단, B 스타일을 사용하는 것이 그리 나쁘지는 않다.
[A 스타일 - 대입문]
i = 5;
value = 9;
cnt = 8;
- 대입 연산자를 정렬시킨다.
- 코드가 한 눈에 들어온다.
[B 스타일]
i=5;
value=9;
cnt=8;
- 대입 연산자를 정렬시키지 않는다.
- 코드의 가독성이 떨어진다.
- 변수와 상수의 구분이 어렵다.
[A 스타일 - 함수 호출]
printf( "%d", a, b, c );
- 함수와 매개 변수 사이에 공백이 존재한다.
- 매개 변수 사이에 공백이 존재한다.
- 코드의 가독성이 좋다.
[B 스타일]
printf("%d",a,b,c);
- 함수와 매개 변수 사이에 공백이 존재하지 않는다.
- 매개 변수 사이에 공백이 존재하지 않는다.
- 코드의 가독성이 좋지 않다.
[A 스타일 - 변수 정의]
int i, j, k;
- 변수 사이에 공백이 존재한다.
- 변수의 구분이 쉽다.
[B 스타일]
int i,j,k;
- 변수 사이에 공백이 존재하지 않는다.
- 변수의 구분이 어렵다.
[A 스타일 - if, else if에서의 중괄호 사용]
if( a )
{
call1();
}
else if( b )
{
call2();
call3();
}
- if문과 else if문이 모두 중괄호를 사용하는 공통된 형태를 갖는다.
- 문장 이해 속도가 빠르다.
[B 스타일]
if( a )
call1();
else if( b )
{
call2();
call3();
}
- if문은 중괄호가 없고, else if문은 중괄호가 있다.
- if문과 else if문이 연관된 문장처럼 보이지 않음으로 인해, 해석 속도가 느려진다.
[A 스타일 - for문에서 중괄호 사용]
for( i=0; i<5; i++ )
{
call1();
}
call2();
- for문의 순환 범위를 한 눈에 알 수 있다.
- 프로그램의 흐름 파악이 용이하다.
[B 스타일]
for( i=0; i<5; i++ )
call1();
call2();
- for문이 얼마큼 순환하는지 직관적이지 않다.
- call2() 함수까지 호출되는 것으로 착각하기 쉽다.
[A 스타일 - 주석 달기]
bool bStart; // 시작되었으면 true, 그렇지 않으면 false
int nValue; // 값을 저장
- 주석을 달 때 문장과 적당히 공백을 띄운다.
- 주석 표시 "//" 다음에 공백을 한 칸 준다.
- 위와 아래 주석의 열을 정렬한다.
- 코드가 아름답다.
[B 스타일]
bool bStart; //시작되었으면 true, 그렇지 않으면 false
int nValue; //값을 저장
- 주석을 달 때 문장과 너무 붙어 있다.
- 주석을 문장 바로 옆에 붙여서 달었다.
- 주석을 정렬하지 않았다.
- 코드가 아름답지 못하다.
[A 스타일 - 수비적인 코딩]
char * pBuff; // 쓰레기 값으로 초기화
pBuff = NULL; // NULL로 초기화
if( !pBuff )
{
pBuff = new char[100];
}
- pBuff를 NULL로 초기화한다.
- 포인터는 항상 NULL로 초기화하여 쓰레기 값으로 초기화되는 것을 방지해야 한다.
[B 스타일]
char * pBuff; // 쓰레기 값으로 초기화
if( !pBuff ) // pBuff가 쓰레기 값이므로, 조건이 거짓이되어 엉뚱한 실행 결과 발생
{
pBuff = new char[100];
}
- pBuff를 NULL로 초기화한다.
- 포인터를 NULL로 초기화하는 습관을 갖지 않으면, 항상 이와 같은 버그에 시달리게 된다.
앞으로 생각나는데로 조금씩 추가해 보겠습니다.
즐 ~ 프 ~