Home 자바 코딩 규칙 (Java Code Conventions)
Post
Cancel

자바 코딩 규칙 (Java Code Conventions)

코딩 규칙의 필요성

  • 소프트웨어를 개발하는 일련의 모든 과정에 들어가는 비용 중 80%는 유지보수에 쓰인다.
  • 소프트웨어를 직접 개발한 개발자가 그 소프트웨어의 유지보수를 담당하는 경우는 생각보다 적다.
  • 코딩 규칙을 지키면 다른 개발자가 그 소스 코드를 처음 보았을 때, 더 빠른 시간안에 완벽하게 이해할 수 있도록 도와준다. 즉 가독성이 높아진다.
  • 개발자가 자신의 소스코드를 제품으로 팔려고 한다면, 자신이 작성한 다른 소스 코드들과 잘 어울리도록 패키지를 적절하게 구성할 필요가 있다.

줄 나누기

하나의 식이 한 줄에 들어가지 않을 때에는 아래와 같은 일반적인 원칙을 따라 두 줄로 나눈다.

  • 콤마 후 두 줄로 나눈다.
  • 연산자 앞에서 두 줄로 나눈다.
  • 레벨이 낮은 원칙보다는 레벨이 높은 원칙에 따라 두 줄로 나눈다.
  • 앞줄과 같은 레벨의 식이 시작되는 새로운 줄은 앞줄과 들여쓰기를 일치시킨다.
  • 만약 위의 원칙들이 코드를 더 복잡하게 하거나 오른쪽 끝을 넘어간다면, 대신 8개의 빈칸을 사용해 들여쓴다.
1
2
someMethod(longExpression1, longExpression2, longExpression3,
		longExpression4, longExpression5);
1
2
3
4
5
6
7
8
9
10
11
12
// 일반적인 들여쓰기
    someMethod(int anArg, Object anotherArg, String yetAnotherArg,
               Object andStillAnother) {
        ...
    }
      
    // 너무 멀리 들여쓰는 것을 피하기 위해 8개의 빈 칸으로 들여쓰기
    private static synchronized horkingLongMethodName(int anArg,
            Object anotherArg, String yetAnotherArg,
            Object andStillAnother) {
        ...
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 아래와 같은 들여쓰기는 사용하지 말자.
    if ((condition1 && condition2)
        || (condition3 && condition4)
        ||!(condition5 && condition6)) { // 좋지 않은 들여쓰기
        doSomethingAboutIt();            // 메서드 본문 시작이 명확하지가 않다.
    } 
      
    // 대신에 아래와 같은 들여쓰기를 사용한다.
    if ((condition1 && condition2)
            || (condition3 && condition4)
            ||!(condition5 && condition6)) {
        doSomethingAboutIt();
    } 
      
    // 또는 아래와 같은 들여쓰기를 사용한다.
    if ((condition1 && condition2) || (condition3 && condition4)
            ||!(condition5 && condition6)) {
        doSomethingAboutIt();
    }

문(Statement)

각각의 줄에는 최대한 하나의 문(statement)만 사용하도록 한다.

1
2
3
    argv++;       // 올바른 사용법
    argc--;       // 올바른 사용법  
    argv++; argc--;       // 이렇게 작성하는 것은 피해라

복합문은 중괄호로 둘러싸여진 문들의 리스트를 포함하는 문이다. 아래의 원칙을 따른다.

  • 둘러싸여진 문들은 복합문보다 한단계 더 들여쓰기를 한다.
  • 여는 중괄호는 복합문을 시작하는 줄의 마지막에 위치해야 한다.
  • 닫는 중괄호는 새로운 줄에 써야하고 복합문의 시작과 같은 들여쓰기를 한다.
  • 중괄호들이 if-else문이나 for문 같은 제어 구조의 일부분으로 사용되어질 때는 중괄호들이 모든 문들을 둘러싸는데 사용되어져야 한다.
    • 중괄호를 닫는 것을 잊어버리는 것 때문에 발생하는 버그의 방지
    • 문 추가에 도움
  • 값을 반환하는 return문은 특별한 방법으로 더 확실한 return 값을 표현하는 경우를 제외하고는 괄호를 사용하지 않는 것이 좋다.
1
2
3
4
5
return;

return myDisk.size();

return (size ? size : defaultSize);

if-else 문은 아래와 같이 사용한다.

1
2
3
4
5
6
7
    if (condition) {
        statements;
    } else if (condition) {
        statements;
    } else {
        statements;
    }

이 때 중괄호를 생략할 수 있어도 생략하지 말아야한다. 에러가 발생할 수 있는 상황은 피해야한다.

공백

괄호와 함께 나타나는 키워드는 공백으로.

1
2
3
while (true) {
        ...
    }

.을 제외한 모든 이항 연산자는 연산수들과는 공백으로 분리되어져야 한다. 단 ++, – 같은 단항 연산자들의 경우는 제외이다.

1
2
3
4
5
6
7
	a += c + d;
    a = (a + b) / (c * d);
     
    while (d++ = s++) {
        n++;
    }
    printSize("size is " + foo + "\n");

변수의 타입을 변환하는 캐스트의 경우 공백으로 구분해야 한다.

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

네이밍 규칙

  • Packages
    • 패키지 이름의 최상위 레벨은 항상 ASCII 문자에 포함되어 있는 소문자로 쓰고, 가장 높은 레벨의 도메인 이름 중 하나여야 한다.
    • 패키지 이름의 나머지 부분은 조직 내부의 명명 규칙을 따르면 된다.
  • Classes
    • 명사여야 한다. 복합 단어일 경우 첫 글자는 대문자여야 한다.
    • 클래스 이름은 간단하고 명시적으로 작성해야 한다.
    • 완전한 단어를 사용하고 두 문자어와 약어는 피하도록 한다.
  • Interface
    • 클래스와 같다. 대문자 사용 규칙을 적용한다.
  • Methods
    • 동사여야 한다. 복합 단어일 경우 첫 단어는 소문자로 시작하고 그 이후에 나오는 단어의 첫 문자는 대문자로 사용해야 한다.
  • Variables
    • 변수 이름의 첫 번째 문자는 소문자로 시작하고 각각의 내부 단어의 첫 번째 문자는 대문자로.
    • 변수 이름이 언더바 또는 달러 표시 문자로 시작하는 것이 허용되기는 하지만 이 문자들로 시작하지 않도록 주의한다.
    • 이름은 짧지만 의미가 있어야 한다.
    • 이름의 선택은 그 변수의 사용 의도를 알아낼 수 있도록 의미적이여야 한다.
    • 한 문자로만 이루어진 변수 이름은 암시적으로만 사용하고 버릴 변수일 경우를 제외하고는 피해야 한다.
    • 보통의 임시 변수들의 이름은 Integer 일 경우에는 i, j, k, m, n을 사용하고 Character일 경우 c, d, e를 사용한다.
  • Constants
    • 클래스 상수로 선언된 변수들과 ANSI 상수들의 이름은 모두 대문자로 쓰고 각각의 단어는 언더바로 분리해야 한다.
    • 디버깅을 쉽게 하기 위해 ANSI 상수들의 사용은 자제하도록 한다.

좋은 프로그래밍 습관

  • 인스턴스 변수와 클래스 변수(static)를 외부에 노출하지 말고 대신 접근을 제공하자.
    • 인스턴스 변수 또는 클래스 변수를 합당한 이유 없이 public으로 선언하지 말자.
      • 인스턴스 변수들은 명시적으로 선언될 필요가 없는 경우가 많다.
    • 인스턴스 변수가 public으로 선언되는 것이 적절한 경우에는 클래스 자체가 어떤 동작을 가지지 않는 데이터 구조일 경우이다.
      • 예를 들면 java가 struct를 지원한다 하면 class 대신 struct를 써야할 때 public으로 선언하는 것이 적합하다.
  • 클래스 변수와 클래스 메서드는 클래스 이름을 사용하여 호출하자.
    • 클래스변수 또는 클래스 메서드를 호출하기 위해서 객체를 사용하는 것을 피해야 한다. 대신 클래스 이름을 사용하자.
1
2
3
classMethod(); //좋은 사용
A_Class.classMethod(); //좋은 사용
A_Object.classMethod(); //나쁜 사용
  • 숫자는 바로 사용하지 않고 선언해 변수 이름으로 접근하자.
    • 숫자 상수는 카운트 값으로 for 루프에 나타나는 -1, 0, 1을 제외하고는 숫자 자체를 코드에 사용하지 말자.
  • 변수에 값을 할당할 때 주의할 것들
    • 하나의 문에서 같은 값을 여러 개의 변수들에 할당하지 말자.
    • 비교 연산자 (==) 와 혼동되기 쉬운 곳에 할당 연산자 (=) 를 쓰지 말자.
    • 실행 시 성능 향상을 위해 할당문 안에 또 다른 할당문을 사용하지 않는다.

그 외 신경써야 할 것들

  • 괄호

연산자 우선순위 문제를 피하기 위해서 복합 연산자를 포함하는 경우에는 자유롭게 괄호를 사용하는 것이 좋은 생각이다(작성자는 연산자 우선 순위를 확실하게 알고 있다고 할지라도, 다른 프로그래머에게는 생소할 수 있다는 것을 기억하자).

1
2
    if (a == b && c == d)     // 이렇게 사용하지 말자
    if ((a == b) && (c == d)) // 이렇게 사용하자
  • 반환 값

프로그램의 구조와 목적이 일치해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 이렇게 사용하지 말자
    if (booleanExpression) {
        return true;
    } else {
        return false;
    }
    
    // 다음과 같이 써야 한다
    return booleanExpression;
    // 이렇게 사용하지 말자
    if (condition) {
        return x;
    }
    return y;
This post is licensed under CC BY 4.0 by the author.