코딩 스타일

1 코딩 스타일

고딩 스타일
코딩 스타일이라 함은 기본적으로 코드를 작성할 때의 불문율적인 편집 규약에 가깝다.
사실 기계가 이해하기엔 결과적으로 동일하지만, 코드를 작성하는 건 인간이기 때문에 (비단 코드를 짠 본인이 아니라도) 열람 및 유지보수를 용이하게 하기 위해 어느 정도 통일된 스타일의 필요성이 생겨난 것으로 추정된다.
이러한 코딩 스타일은 코드 유지보수에 큰 영향을 끼치며, 좋지 않은 코딩 스타일에 익숙해질 경우 능률이 저하되거나, 타인과의 공동작업에서 혼란이 가중될 수 있으니 참고하자.

2 여러가지 코딩 스타일 소개

이러한 코딩 스타일중 대표적으로 BSD, K&R, GNU 3개가 있다.
각 코딩 스타일은 서로 장단점이 있으며 당연한 이야기지만 자기가 익숙한 스타일이 다른 코딩스타일보다 더 좋아보인다 , 다수의 프로그래머가 모였을때 혼란의 원인이 되기도 한다.
코딩 스타일은 부먹찍먹 논쟁과 흡사하다. 서로간의 취향 차이일뿐 완벽한 코딩 스타일이란 존재하지 않음으로 , 자신이 사용하는 코딩 스타일이 다른 스타일보다 우월하다고 주장하는 우를 범하지 말도록 하자. 하지만 현실에선 심심하면 이걸 가지고 키배가 벌어진다
대부분의 언어는 대표 코딩 컨벤션을 가지고 있다. 일반적으로 그 언어의 표준을 따르게 되며, 프로젝트별로 코딩 스타일이 정해져 있는 경우도 있다. 따라서 개인 프로젝트가 아닌 이상, 자기가 좋아한다고 해서 마음대로 코딩 스타일을 변경하기는 힘들다.

GNUif(...)<br /> {<br /> 처리();<br /> }<br />
블록을 if문 아래에 작성한다. 블록이 if에 속한 블럭임을 분명히 표시하여 구조가 잘보인다. 허나 들여쓰기를 많이 하여서 처리에 수평으로 많은 코드를 작성할수없다.
K&Rif(...) {<br /> 처리();<br />}<br />
흔히 C계열 창시자 들이 사용하던 스타일이다. 여는 블록을 if와 같은 행에 배치한다. 코드 줄수를 절약하여 한눈에 많은 코드를 볼수있고 수평으로 많은 코드를 작성할수 있다. Java계열 Eclipse / 구글 C++ [1] , 자바스크립트 [2] 등의 기본 포매팅이다.
BSDif(...)<br />{<br /> 처리();<br />}<br />
GNU의 블럭의 소속을 분명히 한다는 장점과 K&R의 수평으로 많은 코드를 작성할수 있다는 장점을 가져와 결합한 스타일이다. 줄 수는 GNU 스타일만큼 늘어나지만 수평으로는 K&R만큼 빽빽하게 쓸 수 있다. 비주얼 스튜디오에서의 기본 포매팅이다.

위 설명에서는 조건문과 반복문, 함수 등의 차이는 대충 뭉뚱그렸는데, 실제로는 조건문과 반복문, 함수 등에서 들여쓰기의 차이를 두는 경우도 있다.

2.1 K&R과 BSD

같은 코드를 K&R과 BSD로 작성하고 비교해 보자.

K&R
<br /> if(a == 1) {<br /> for (i = 0;i < 1000;i++) {<br /> if (b == 10) {<br /> 처리();<br /> } else if(c == 10) {<br /> 처리();<br /> }<br /> }<br /> }<br />
BSD
<br />if (a == 1)<br />{<br /> for (i = 0;i < 1000;i++)<br /> {<br /> if (b == 10)<br /> {<br /> 처리();<br /> }<br /> else if(c == 10)<br /> {<br /> 처리();<br /> }<br /> }<br />}<br />

BSD 쪽이 좀 더 아래로 길어지는 것을 볼 수 있다. 코드를 종이에 뽑을 일이 있으면 이 문제는 좀 더 중요해진다. 그래서 출판물에서는 K&R을 선호하는 경향이 있다. 그리하여 대부분의 프로그래밍 언어 교재가 K&R스타일로 작성되기 때문에 코딩을 갓 접한 학생들이 K&R 스타일에 자연스럽게 익숙해져 있기도 하다. 물론 개인 취향에 따라 나중에 BSD 스타일을 접하고선 갈아타버리기도 한다.

한편, 무슨 일이 생겨서 저 반복문을 반복문이 아니게 해야 한다고 하자. BSD는 for문이 있는 줄만 통째로 지워도 된다.

BSD
<br />if (a == 1)<br />{<br /> //for (i = 0;i < 1000;i++)<br /> {<br /> if (b == 10)<br /> {<br /> 처리();<br /> }<br /> else if(c == 10)<br /> {<br /> 처리();<br /> }<br /> }<br />}<br />

그런데 K&R 스타일에서는 그렇게 하면 여는 괄호만 지워지고 닫는 괄호는 안 지워진다. 그래서 리팩토링이 좀 귀찮아진다.

K&R
<br /> if(a == 1) {<br /> //for (i = 0;i < 1000;i++) {<br /> if (b == 10) {<br /> 처리();<br /> } else if(c == 10) {<br /> 처리();<br /> }<br /> }<br /> }<br />

간혹가다 탭 키 안누르고 스페이스바로 들여쓰기하는 자가 있다 카더라.
둘 다 쓰면 얻어맞는다 카더라 어차피 Python에서는 한가지만 써야한다

3 변수/함수 명칭의 작성 스타일

변수함수명같은 명칭을 작성할 때 이름을 정의하는 것도 코딩 스타일 중 일부이다.

대표적인 표기법은 다음 네 가지가 있다.

  • 카멜 표기법
두 단어를 연달아 사용할 때 두번째 단어의 첫 글자를 대문자로 사용하는 것이다. 낙타의 등에 있는 혹과 같다고 하여 카멜(Camel) 표기법이라고 부른다. 예로는 iPhone이 있다.
  • 파스칼 표기법
이 역시 단어의 첫 글자를 대문자로 사용하는 것은 카멜 표기법과 같지만 연달아 오는 두 단어의 모든 앞글자를 대문자로 사용함에 있어, 카멜 표기법이 단봉낙타라면 파스칼은 쌍봉낙타라고 할 수 있다. 예로는 PowerPoint가 있다. 카멜 표기법과 파스칼 표기법을 적절하게 조합하여 변수명이나 함수명은 카멜 표기법을, 클래스명은 파스칼 표기법을 따르는 작성 스타일이 대세.
접두어에 자료형을 붙이는 것으로 strName, bBusy, szName 등이 있다. 요새는 잘 사용하지 않는 (지양하는) 스타일인데 언어의 종류가 다양한 만큼 자료형도, 문서 데이터도 다양해졌기 때문에 접두어가 의미가 없어졌다.
  • 스네이크 표기법
단어 사이에 언더바를 넣어서 표기하는 것이다. 허나 한 단어에 언더바를 붙여 _apple 등의 명칭은 C++ 장래의 예약어 확장을 위해 지양되고 있다.

4 들여쓰기

들여쓰기를 탭으로 하느냐 스페이스로 하느냐도 주요한 논쟁거리 중 하나이다. 탭으로 들여쓰기를 하면 탭키 한번에 끝이므로 정말 간단하겠지만 탭키로 들여쓰기를 하면 OSIDE,에디터가 다를 경우 각 시스템의 설정값에 따라 다르게 보일 수 있기에 스페이스로 들여쓰기를 해야 한다고 주장하는 사람도 있다. 그리고 스페이스로 들여쓰기를 하는 사람 중에서도 스페이스를 두번 누르냐 네번 누르냐로 갈린다고 한다. 한편 탭과 스페이스의 들여쓰기법을 같은 소스코드에 여기저기 썼다가는 소스코드에 혼돈의 카오스가 펼쳐지고 팀 프로젝트일 경우 팀원들로 부터 욕이란 욕은 다 먹게 될 가능성이 높으므로 제발 그러지 말자.
  1. https://google-styleguide.googlecode.com/svn/trunk/cppguide.html
  2. https://google.github.io/styleguide/javascriptguide.xml