1 코딩 스타일
고딩 스타일
코딩 스타일이라 함은 기본적으로 코드를 작성할 때의 불문율적인 편집 규약에 가깝다.
사실 기계가 이해하기엔 결과적으로 동일하지만, 코드를 작성하는 건 인간이기 때문에 (비단 코드를 짠 본인이 아니라도) 열람 및 유지보수를 용이하게 하기 위해 어느 정도 통일된 스타일의 필요성이 생겨난 것으로 추정된다.
이러한 코딩 스타일은 코드 유지보수에 큰 영향을 끼치며, 좋지 않은 코딩 스타일에 익숙해질 경우 능률이 저하되거나, 타인과의 공동작업에서 혼란이 가중될 수 있으니 참고하자.
2 여러가지 코딩 스타일 소개
이러한 코딩 스타일중 대표적으로 BSD, K&R, GNU 3개가 있다.
각 코딩 스타일은 서로 장단점이 있으며 당연한 이야기지만 자기가 익숙한 스타일이 다른 코딩스타일보다 더 좋아보인다 , 다수의 프로그래머가 모였을때 혼란의 원인이 되기도 한다.
코딩 스타일은 부먹찍먹 논쟁과 흡사하다. 서로간의 취향 차이일뿐 완벽한 코딩 스타일이란 존재하지 않음으로 , 자신이 사용하는 코딩 스타일이 다른 스타일보다 우월하다고 주장하는 우를 범하지 말도록 하자. 하지만 현실에선 심심하면 이걸 가지고 키배가 벌어진다
대부분의 언어는 대표 코딩 컨벤션을 가지고 있다. 일반적으로 그 언어의 표준을 따르게 되며, 프로젝트별로 코딩 스타일이 정해져 있는 경우도 있다. 따라서 개인 프로젝트가 아닌 이상, 자기가 좋아한다고 해서 마음대로 코딩 스타일을 변경하기는 힘들다.
GNU | if(...)<br /> {<br /> 처리();<br /> }<br /> |
블록을 if문 아래에 작성한다. 블록이 if에 속한 블럭임을 분명히 표시하여 구조가 잘보인다. 허나 들여쓰기를 많이 하여서 처리에 수평으로 많은 코드를 작성할수없다. | |
K&R | if(...) {<br /> 처리();<br />}<br /> |
흔히 C계열 창시자 들이 사용하던 스타일이다. 여는 블록을 if와 같은 행에 배치한다. 코드 줄수를 절약하여 한눈에 많은 코드를 볼수있고 수평으로 많은 코드를 작성할수 있다. Java계열 Eclipse / 구글 C++ [1] , 자바스크립트 [2] 등의 기본 포매팅이다. | |
BSD | if(...)<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++ 장래의 예약어 확장을 위해 지양되고 있다.