티스토리 뷰

코드리뷰 시리즈

코드 스타일은 코드의 전체적인 모양새라고 볼 수 있다. 이것은 우리가 문서 작성할 때 여백과 줄바꿈, 들여쓰기를 어떻게 잘 해서 예쁘게 인쇄하느냐에 따라 문서에 대한 평가가 얼마나 좌우되는가와 비슷한 것이다. 코드에서 적절한 줄바꿈, 들여쓰기, 빈칸 처리는 코드 전체의 모양새를 결정할 뿐 아니라 코드의 가독성에 절대적인 영향을 미치는 요소이다.

http://www.oracle.com/technetwork/java/codeconventions-150003.pdf 에서 발췌

1.  Indentation 들여쓰기와 줄바꿈

한 줄은 80글자를 넘지 않는 것이 좋다. 코멘트를 달아서 줄이 길어지면 메모장이나 편집기로 볼때 스크롤이 생겨 불편하다. 그러므로 코드는 가로 스크롤이 넘어가지 않을 정도로 폭을 맞춰주는 것이 좋다. 80글자가 넘어가면 적당한 곳에서 줄을 바꾸고 줄바꾼 다음에 적절히 들여쓰기를 해 주어야 한다. 

그럼 수식이나 문장이 한 줄 80칸을 넘어갈 때 줄을 바꾸는 규칙을 알아보자. 줄을 바꾸기에 적당한 곳은 다음과 같다.

  • 콤마 다음에, 또는 연산자 앞에서 줄을 바꾸어준다.
  • 수식이나 문장 중간에 줄을 바꿀 때는 높은 수준에서 끊어지도록 하는 것이 좋다. 
  • 줄바꾼 후에 다음 줄은 앞줄의 같은 수준의 수식에 맞추어 들여쓰기를 해준다.

다음은 메소드 호출에서 줄바꿈의 예제다.

function(longExpression1, longExpression2, longExpression3,
         longExpression4, longExpression5);

var = function1(longExpression1,
                function2(longExpression2,
                          longExpression3));

다음은 수식에서 줄을 분리한 예다. 앞의 것이 더 바람직하다. 왜냐하면 괄호 밖에서 줄을 넘긴 것이 더 높은 레벨에서 분리한 것이기 때문이다. 또한 줄을 넘길 때 연산자를 남기는 것이 읽는 사람에게 줄이 넘어갔음을 좀더 분명하게 보여줄 수 있다. (이것은 개인 취향임)

longName1 = longName2 * (longName3 + longName4 - longName5) +
            4 * longname6; // PREFER 
longName1 = longName2 * (longName3 + longName4 - 
                         longName5) + 4 * longname6; // AVOID

다음은 메소드 선언의 들여쓰기 예다. 다음 줄의 들여쓰기는 탭하나가 적당하다. 두 번째 예에서 괄호 뒤로 맞추려면 너무 오른쪽으로 가야 되므로 이런 경우는 탭하나만 들여쓰기한다.

// 일반적인 들여쓰기 - 같은 레벨인 것에 맞춘다
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
           Object andStillAnother) {
    ...
}
// 너무 많이 들어가야 하는 경우 기본 탭 하나로 들여쓰기 한다
private static synchronized horkingLongMethodName(int anArg,
 	Object anotherArg, String yetAnotherArg,
 	Object andStillAnother) {
 ...
}

if 문에서 조건식이 줄을 넘긴 경우 적당한 들여쓰기를 해서 조건식과 실행 코드 부분이 구분되어야 한다.

// 조건식 부분과 if 몸체부 코드를 구분해 주어야 함
if ((condition1 && condition2)
    || (condition3 && condition4)
    || !(condition5 && condition6)) {
	doSomethingAboutIt(); 
}

?: 연산을 사용하는 방법으로는 다음과 같은 형태가 있다.

alpha = (aLongBooleanExpression    ...) 
	? beta 
	: gamma;

6 선언

6.1 한 줄에 하나씩이 원칙

타입과 이름 사이에 빈칸 하나를 넣는다. 탭을 쓰는 것도 가능하다.

int level; // indentation level
int size; // size of table

위의 것이 아래와 같이 쓰는 것보다 낫다.

int level, size;

서로 다른 타입을 한 줄에 쓰지 않는다.

int foo, fooarray[]; // 다른 타입을 한 줄에 선언하면 안 됨

타입과 이름 사이에 탭을 사용한 경우는 다음과 같은 형태가 될 수 있다.

int        level; // 들여쓰기 레벨
int        size;  // 배열의 크기
Object     currentEntry; // 현재 선택된 표의 항목

6.2 선언의 위치

선언은 함수나 블럭의 시작부에 두는 것이 좋다. 즉 { ... }에서 시작 괄호 다음에 그 함수나 블록에서 쓸 변수를 선언하는 것이 일반적이다. 그러나 최근에는 코드가 길어지거나 일부에서 사용하는 변수는 해당하는 코드에 가까운 곳에서 선언하는 것이 선호되기도 한다.

8 - White Space (빈칸)

8.1 Blank Lines (빈줄)

빈줄은 코드 부분을 관계된 것끼리 묶어서 나누어주므로 바람직하다. 문단을 나누는 효과가 나고 코드를 어디서 끊어 읽어야 할지 알려주는 역할도 한다.

빈칸이 반드시 필요한 곳으로는 다음과 같은 것들이 있다.

  • - 클래스와 인터페이스 정의부 앞뒤
  • - 메소드와 메소드 사이
  • - 메소드의 선언부가 끝나고 코드가 시작되기 전

빈줄은 프로젝트마다 규칙이 다를 수 있고 코드의 복잡도와도 관련이 있으므로 유연하게 결정하되, 한 프로젝트 안에서는 일관된 방식을 적용하는 것이 중요하다.

8.2 Blank Spaces (빈칸)

빈칸은 다음 상황에서는 반드시 있어야 한다.

- 키워드 뒤에 괄호가 올 때

 while (true) {
      ...
}

주의할 점은 함수 이름과 뒤에 오는 매개변수 괄호 사이에는 괄호가 없어야 한다. 이것을 통해 키워드 문장과 함수 호출이 구분된다.

- 콤마 뒤

- 점(.) 이외의 모든 이진연산자 앞뒤

  단, 단일 연산자(++, --, 부호 등은 빈칸이 없어야 함)

a += c + d;
a = (a + b) / (c * d);
while (d++ = s++) {
    n++;
}
;prints("size is " + foo + "\n");

• for 루프의 ; 뒤

  for (expr1; expr2; expr3)

• 형변환 (int)나 (float) 뒤에는 빈칸이 있어야 함

 myMethod((byte) aNum, (Object) x);
 myFunc((int) (cp + 5), ((int) (i + 3)) + 1);

빈칸을 쓰지 않아야 하는 경우를 알아두는 것도 좋다. ( 다음과 ) 앞에는 빈칸이 없다. 함수 이름과 ( 사이에는 빈칸이 없다. 배열이름과 [ 사이에도 빈칸이 없다. 또한 변수 선언 초기화의 경우에도 빈칸을 넣지 않는 것이 일반적이다. 세미콜론(;)이나 콜론(:) 앞에도 빈칸을 넣지 낳는다.

빈칸도 빈줄과 마찬가지로 일관된 스타일을 가지는 것이 중요하다. 자신의 스타일이 있다면 그것을 한 프로젝트 안에서는 일관되게 적용하는 것이 중요하다. 또 잘 짜는 사람들의 코딩 스타일을 보고 배우면서 자신의 스타일을 만들어나가는 것도 중요하다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함