본문 바로가기

Language/Java

Java Code Convention

 Java Code Convention

 1 - Introduction

1.1 Why Have Code Conventions

다음은 프로그래머에게 코드 컨벤션(code convention)이 중요한 몇가지 이유이다.

 

소프트웨어가 살아있는 동안(lifetime) 드는 비용의 80%는 유지보수에 소요된다.

어떤 소프트웨어라도 원래의 저작자에 의해서 계속적으로 유지보수 되는 경우는 거의 없다.

코드 컨벤션은 소프트웨어의 가독성을 향상시키고, 엔지니어가 새로운 코드를 좀더 빠르고 더욱 완벽하게 이해할 수 있게 한다.

자신의 소스 코드를 상품으로 내놓으려면, 그것이 자신의 다른 상품처럼 잘 패키징되고 명료한지 확인할 필요가 있다.

 

2 - File Names

2.1 File Suffixes

자바 소프트웨어는 다음과 같은 파일 확장자를 사용한다.

 

File Type

Suffix

Java source

.java

Java bytecode

.class

 

3 - File Organization

 

하나의 파일은 빈 라인으로 구분된 섹션들로 구성되어 있으며, 각 섹션을 식별하는 주석이 추가적으로 올 수 있다.

파일 크기가 2000라인이 넘는 것은 부담이 되므로 피하도록 한다.

적절한 형식의 자바 프로그램의 예는 20페이지의 "Java Source File Example"을 참조하라.

 

3.1 Java Source Files

각 자바 소스 파일은 하나의 public 클래스나 인터페이스를 포함한다. private 클래스와 인터페이스가 어떤 public 클래스와 연관된다면, public 클래스 소스파일 안에 이것들을 넣을 수 있다. public 클래스는 그 파일 내에서 첫번째 클래스나 인터페이스가 되어야 한다.

자바 소스 파일은 다음과 같은 순서를 가진다.

 

도입 주석 (5페이지의 "Begining Comments" 참고)

패키지와 임포트(import)

클래스와 인터페이스 선언 (5페이지의 "Class and Interface Declarations" 참조)


3.1.1 Beginning Comments

모든 소스파일은 클래스 명, 버전 정보, 날짜, 저작권 경고를 열거한 C 스타일의 주석으로 시작한다.

 

/*

 * Classname

 *

 * Version information

 *

 * Date

 *

 * Copyright notice

 */

 

3.1.2 Package and Import Statements

대부분의 자바 소스 파일의 주석이 아닌 첫번째 라인은 package문이다. 그 뒤에는 import문이 따라온다. 예를 들면,

 

package java.awt;

 

import java.awt.peer.CanvasPeer;

 

Note: 유일 패키지명의 첫번째 요소는 항상 소문자로 된 ASCII 문자로 쓰며, 현재까지의 최상위 도메인명인 com, edu, gov, mil, net, org 중에 하나이거나, ISO 표준 3166 (1981)에서 지정한 두글자로 된 영문 국가 코드 중에 하나여야 한다.

 

3.1.3 Class and Interface Declarations

다음의 테이블은 클래스 혹은 인터페이스 선언부분을 그들이 나타나는 순서에 따라 보여준다. 주석을 포함하는 예제는 20페이지의 "Java Source File Example"을 참조하라.

 

 

Part of Class/Interface Declaration

Notes

1

Class/interface documentation comment (/**...*/)

이 주석의 내용에 대한 정보는 10페이지의 "Documentation Comments" 참조

2

class or interface statement

 

3

Class/interface implementation comment (/*...*/), if necessary

이 주석에는 클래스/인터페이스 도큐먼트 주석에는 적당하지 않은 클래스 범위나 인터페이스 범위의 정보를 포함해야 한다.

4

Class (static) variables

먼저 public 클래스 변수, 그 다음은 protected 변수, 그리고 패키지 레벨(접근 제한자 없음)의 변수, 다음으로 private 변수가 온다.

5

Instance variables

클래스 변수의 순서와 동일.

6

Constructors

 

7

Methods

메소드는 스코프(scope)나 접근성 보다는 기능성에 의하여 그룹이 지어져야 한다. 예를 들어, private 클래스는 두개의 public 클래스 사이에 위치할 수 있다. 이것은 코드를 더 쉽게 읽고 이해하게 하기 위함이다.

 


4 - Indentation

 

들여쓰기 단위로 4개의 공백을 사용한다. 들여쓰기로 스페이스(space)를 사용할 것인지 탭(tab)을 사용할 것인지는 정의되어 있지 않다. 탭은 정확히 매 8칸마다 설정되어야 한다.

 

4.1 Line Length

각 라인은 80글자를 넘지 않도록 한다. 그것을 넘기게 되면 많은 터미널(terminal)과 툴(tool)에서다룰 수 없게 되기 때문이다.

Note: 도큐먼트(documentation)에서 사용하는 예제는 라인 길이보다 짧아야 한다. 보통 70자를 넘기지 않는다.

 

4.2 Wrapping Lines

하나의 표현식이 한 라인에 맞지 않을 경우에는 다음의 일반적인 원리에 따라 줄바꿈 하도록 한다.

 

콤마 뒤에서 줄바꿈 한다.

연산자 앞에서 줄바꿈 한다.

하위 레벨보다는 상위 레벨에서 줄바꿈하는 것이 좋다.

새로운 라인은 이전 라인과 같은 레벨에서 표현식의 처음을 정렬한다. (들여쓰기 일치)

위의 규칙을 따르는 것이 코드들 혼란 스럽게 하거나 오른쪽 여백을 지저분하게 만든다면, 그냥 8칸 들여쓰기 한다.

 

다음은 함수 호출에 대한 줄바꿈 예제이다.

 

someMethod(longExpression1, longExpression2, longExpression3,

         longExpression4, longExpression5);

 

var = someMethod1(longExpression1,

                   someMethod2(longExpression2,

                            longExpression3));

 

다음은 산술 표현식에 대한 두가지 예제이다. 첫번째 것이 괄호 표현식 밖에서 줄바꿈을 하기 때문에 더 바람직 하다. 또한, 상위레벨에서 줄바꿈 하고 있다.

 

longName1 = longName2 * (longName3 + longName4 - longName5)

            + 4 * longname6; // 적절

 

longName1 = longName2 * (longName3 + longName4

                           - longName5) + 4 * longname6; // 부적절

 

다음은 메소드 선언의 두가지 예제이다. 첫번째 것은 일반적인 줄바꿈 규칙에 따른 것이다. 두번째 것은 일반적인 규칙을 적용했을때 두번째와 세번째 라인이 오른쪽으로 너무 멀리 떨어지게 되므로, 단지 8칸 들여쓰기만 사용했다.


//평범한 들여쓰기

someMethod(int anArg, Object anotherArg, String yetAnotherArg,

            Object andStillAnother) {

    ...

}

 

//너무 깊게 들여쓰는 것을 피하기 위해 8 들여쓰기

private static synchronized horkingLongMethodName(int anArg,

         Object anotherArg, String yetAnotherArg,

         Object andStillAnother) {

    ...

}

 

if문에서의 줄바꿈은 일반적으로 8칸 룰을 적용해야 한다. 원래의 4칸 들여쓰기는 본문(body)을 보기 힘들게 만들기 때문이다. 예를 들어,

 

//이러한 들여쓰기는 사용하지 말것.

if ((condition1 && condition2)

     || (condition3 && condition4)

     ||!(condition5 && condition6)) { //나쁜 줄바꿈

     doSomethingAboutIt();              // 라인을 놓치기 쉽게 만든다

}

 

//대신 이러한 들여쓰기를 사용한다.

if ((condition1 && condition2)

        || (condition3 && condition4)

        ||!(condition5 && condition6)) {

    doSomethingAboutIt();

}

 

//혹은 이렇게 사용한다.

if ((condition1 && condition2) || (condition3 && condition4)

        ||!(condition5 && condition6)) {

    doSomethingAboutIt();

}

 

3(ternary) 표현식에 대한 형식은 다음의 세가지 방법이 있다.

 

alpha = (aLongBooleanExpression) ? beta : gamma; 

 

alpha = (aLongBooleanExpression) ? beta

                                       : gamma; 

 

alpha = (aLongBooleanExpression)

         ? beta

         : gamma;


5 - Comments

 

Java 프로그램은 구현(implementation) 주석과 도큐먼트(documentation) 주석, 두 종류의 주석을 가질 수 있다. 구현 주석은  C++에서 볼 수 있는 /*...*/ //로 구분되는 주석이다. 도큐먼트 주석은 Java에서만 볼 수 있는 /**...*/로 구분되는 주석이다. 도큐먼트 주석은 javadoc 툴을 이용하여 HTML로 추출할 수 있다.

 

구현 주석은 코드에 관해 설명하거나, 특정한 구현사항에 대해 기술하는 데에 쓰인다. 도큐먼트 주석은 개발자들이 소스코드를 직접 접하지 않아도 읽을 수 있도록 구현과는 별개의 관점에서 코드명세를 설명한다.

 

주석은 코드에 대한 개요와 코드 자체로는 쉽게 이해할 수 없는 추가적인 정보를 제공한다. 주석은 해당 프로그램을 읽고 이해하는 것에 관련된 정보만을 가지고 있어야 한다. 예를 들어, 패키지가 어떻게 만들어져 있는지 혹은 어느 디렉토리에 위치하고 있는지에 대한 사항은 주석으로 적당치 않다.

 

설계가 명백한가 혹은 명백하지 않은가에 대한 논의는 적절하다. 그러나 코드에 있는 내용을 다시 반복하는 일은 피하라. 이러한 주석을 달다가는 제 날짜에 못 맞추기 쉽다. 일반적으로, 코드에 포함됨으로써 날짜에 못 맞출 것 같은 주석이 있다면 사용하지 말라.

 

Note: 잦은 주석은 코드의 질을 떨어뜨리기도 한다. 어쩔수 없이 주석을 사용해야 할 때가 있다면, 차라리 더 명백한 코드로 다시 작성하는 것을 고려하라.

 

별표(*)나 다른 문자를 사용하여 커다란 박스로 주석을 둘러쌀 필요는 없다.
폼피드(form-feed)나 백스페이스(backspace)와 같은 특수문자를 포함해서는 안된다.

 

5.1 Implementation Comment Formats

주석에는 block, single-line, trailing, 그리고 end-of-line의 네가지 스타일이 있다.

 

5.1.1 Block Comments

블록 주석은 파일이나, 메소드, 데이터 구조 혹은 알고리즘을 설명하는데 쓰인다. 블록 주석은 파일의 시작부분이나 각 메소드의 앞에 사용될 수 있다. 물론, 메소드 내의 다른 곳에서도 쓰일 수 있다. 함수나 메소드 내에서 사용되는 블록 주석은 그 것이 설명하는 코드와 같은 레벨로 들여쓰기 되어야 한다.

블록 주석의 앞에는 빈 라인을 하나 사용하여 코드의 나머지 부분과 구분한다.

 

/*

 * Here is a block comment.

 */

 

록 주석은 /*-로 시작할 수 있다. 이 주석은 indent(1)이 형식을 재구성(reformatted)할 수 없는 블록 주석으로 인식하게 한다. 예를 들어,


 

/*-

 * Here is a block comment with some very special

 * formatting that I want indent(1) to ignore.

 *

 *    one

 *        two

 *            three

 */

 

Note: indent(1)을 사용하지 않으면, 코드에 /*-를 사용할 필요도 없고 다른 사람이 코드에 indent(1)을 실행시킬 여지를 만들 필요도 없다.

 

10페이지의 "Documentation Comments"를 참조하라.

 

5.1.2 Single-Line Comments

짧은 주석은 뒤에 오는 코드의 레벨에 맞춰 들여쓰기 하여 사용될 수 있다. 만약 주석을 한 줄에 다 처리할 수 없으면 블록 주석(5.1.1 참조)을 사용한다. 한줄 주석 앞에는 한줄을 띄운다. 다음은 자바 코드로 표현한 한줄 주석의 예이다. (10페이지의 "Documentation Comments" 참조)

 

if (condition) {

 

    /* Handle the condition. */

    ...

}

 

5.1.3 Trailing Comments

매우 짧은 주석은 설명할 코드와 같은 라인상에 나타날 수 있다. 그러나 이 경우에는 반드시 구문(statement)와 구분될 수 있을 정도로 충분히 간격을 벌려 주어야 한다. 한 그룹의 코드에서 짧은 주석이 둘 이상 쓰일 때는 같은 탭 간격만큼 들여 써준다.

 

다음은 Java 코드에서의 꼬리 주석(trailing comment)의 예이다.

 

if (a == 2) {

    return TRUE;         /* special case */

} else {

    return isPrime(a);  /* works only for odd a */

}

 

5.1.4 End-Of-Line Comments

주석 기호 "//"는 라인 전체 혹은 부분에만 주석 처리 할 수 있게 해준다. 이것은 텍스트 주석에 대해 연속적인 여러 줄에 걸쳐 사용하면 안되지만, 코드의 일부를 주석처리 하기 위해 연속된 여러 줄에 걸쳐 사용할 수는 있다. 다음은 이 주석의 세가지 스타일의 예이다.


if (foo > 1) {

    // Do a double-flip.

    ...

}

else {

    return false;     // Explain why here.

}

//if (bar > 1) {

//

//    // Do a triple-flip.

//    ...

//}

//else {

//    return false;

//}

 

5.2 Documentation Comments

Note: 여기에 설명된 주석형식의 예는 20페이지의 "Java Source File Example"를 참조하라.

 

세한 정보는 다음의 위치에서 도큐먼트 주석태그 (@return, @param, @see)에 관한 정보를 담은 "How to Write Doc Comments for Javadoc"를 참조하라.

 

http://java.sun.com/products/jdk/javadoc/writingdoccomments.html

 

도큐먼트 주석과 javadoc에 관한 자세한 정보는 다음의 javadoc 홈페이지를 참조하라.

 

http://java.sun.com/products/jdk/javadoc/

 

도큐먼트 주석은 자바 클래스, 인터페이스, 생성자, 메소드, 필드에 대해 설명한다. 각 도큐먼트 주석은 클래스, 인터페이스, 메소드당 하나씩 주석기호 /**...*/ 안에 설정된다. 이 주석은 선언문 앞에 나와야 한다.

 

/**

 * The Example class provides ...

 */

public class Example { ...

 

최상위 클래스와 인터페이스는 들여쓰기 하지 않는 반면, 그 멤버들은 들여쓴다는 것에 주의하라. 클래스와 인터페이스에 대한 도큐먼트 주석의 첫라인(/**)은 들여쓰지 않고 그 이후 라인들은 한칸씩 들여써서 별표(*)를 수직으로 정렬한다. 생성자를 포함해서, 멤버들은 첫라인에 4칸 들여쓰기를 하고 그 이후부터는 5칸을 들여쓴다.

 

문서화(documentation)에 적합하지 않은 클래스, 인터페이스, 변수 혹은 메소드에 관한 정보를 제공하고 싶다면, 선언문 바로 뒤에 구현(implementation) 블록 주석(5.1.1 참조)이나 한줄 주석(5.1.2 참조)를 사용한다. 예를 들어, 클래스 구현에 관한 세부사항은 클래스 도큐먼트 주석이 아닌, class (statement) 바로 뒤에 구현 블록 주석으로 처리해야 할 것이다.

 

도큐먼트 주석은 메소드나 생성자 정의부분 내부에 위치해선 안된다. 왜냐하면, Java는 도큐먼트 주석은 그 바로 뒤에 나오는 선언문과 연관시키기 때문이다.


6 - Declarations

 

6.1 Number Per Line

라인당 하나의 선언문을 쓰는 것이 주석을 달기에 좋다. 다시 말해서,

 

int level; // indentation level

int size;  // size of table

 

로 쓰는 것이 다음보다 낫다.

 

int level, size;

 

같은 라인에 서로 다른 타입을 선언하지 말라. 예를 들어 :

 

int foo,  fooarray[]; //틀림!

 

Note: 위의 예에서는 타입과 식별자 사이에 한개의 스페이스가 사용되었다. 가능한 또 다른 방법은 탭을 사용 하는 것이다. 예를 들어 :

 

int      level;             // indentation level

int      size;              // size of table

Object  currentEntry;   // currently selected table entry

 

6.2 Initialization

가능하면 로컬 변수가 선언될때 초기화하라. 선언과 동시에 초기화 되지 않는 유일한 경우는어떤 계산이 먼저 일어나고 그것에 의해 초기값이 결정되는 경우 뿐이다.

 

6.3 Placement

선언문은 블록(block)의 시작 부분에만 작성하라. (블록이란 중괄호 "{" "}"로 둘러싸인 코드를 말한다.) 변수 선언을 그 변수가 처음 사용될때까지 미루지 말라. 이것은 조심성 없는 프로그래머를 혼란 시킬 수 있고, 범위(scope)내에서의 코드 이식성을 방해할 수 있다.

 

void myMethod() {

    int int1 = 0;         // beginning of method block

 

    if (condition) {

        int int2 = 0;     // beginning of "if" block

        ...

    }

}

 

이 규칙이 적용되지 않는 유일한 경우는 for 루프문에서 인덱스를 쓸 때 뿐이다. Java에서의 for 루프문은 변수가 for 문 내에서 선언될 수 있다.

 

for (int i = 0; i < maxLoops; i++) { ... }

 

상위레벨에서 선언한 것을 로컬 블록에서 다시 선언해서 사용하지 말라. 예를들어, 다음과 같이 내부 블록에서 같은 변수명을 다시 선언하지 말라.


 

int count;

...

myMethod() {

    if (condition) {

        int count = 0;     // 부적절!

        ...

    }

    ...

}

 

6.4 Class and Interface Declarations

자바 클래스와 인터페이스를 코딩할때는 다음과 같은 포맷 형식을 따른다.

 

메소드 명과 파라미터 리스트의 괄호 "(" 사이는띄우지 않는다.

여는 중괄호 "{"는 선언문과 같은 라인의 끝에 사용한다.

닫는 중괄호 "}"는 새로운 라인에 여는 중괄호와 같은 들여쓰기로 따로 사용한다. , 예외로 내용이 없는 구문(statement)에는 "{" 바로 다음에 "}"가 온다.

 

class Sample extends Object {

    int ivar1;

    int ivar2;

 

    Sample(int i, int j) {

        ivar1 = i;

        ivar2 = j;

    }

 

    int emptyMethod() {}

 

    ...

}

 

메소드 사이는 한 줄 띄운다.


7 - Statements

 

7.1 Simple Statements

각 라인에는 최대 하나의 문장(statement)을 사용한다. 예를들면,

 

argv++;       // 맞음

argc--;       // 맞음

argv++; argc--;       // 부적절!

 

7.2 Compound Statements

복합문은 중괄호로 둘러싸인 문장들의 리스트 "{  statements }"를 가진 구문이다. 다음 예를 참고하라.

중괄호로 둘러싸인 문장은 복합문보다 한 레벨 이상 더 들여쓰기 한다.

여는 중괄호는 복합문을 시작하는 라인의 끝에 사용한다. 닫는 중괄호는 새로운 라인에 사용하고 복합문의 시작과 같은 레벨로 들여쓰기 한다.

if-else 문이나 for문과 같은 제어문에서 중괄호는 모든 문장에 걸쳐서 사용되며 문장이 하나일지라도 사용한다이는 괄호를 추가하는 것을 잊음으로써 발생할 수 있는 버그를 사전에 방지하여, 문장을 추가하기 쉽게 만든다.

 

7.3 return Statements

값을 가진 return문은 다른 방법을 사용해서 더 명확히 할 수 있는 경우가 아니라면 괄호를 사용하지 않는다. 예를 들어,

 

return;

 

return myDisk.size();

 

return (size ? size : defaultSize);

 

7.4 if, if-else, if else-if else Statements

if-else문은 다음과 같은 형식을 따른다.

 

if (condition) {

    statements;

}

 

if (condition) {

    statements;

} else {

    statements;

}


if (condition) {

    statements;

} else if (condition) {

    statements;

} else{

    statements;

}

 

Note: if문은 항상 중괄호{}를 사용한다. 다음 형식은 에러를 발생시키기 쉬우니 피한다.

 

if (condition) //부적절! 여기서는 중괄호 {}를 생략했다!

    statement;

 

7.5 for Statements

for문은 다음과 같은 형식을 따른다.

 

for (initialization; condition; update) {

    statements;

}

 

비어있는 for(모든 작업이 for선언문에서 끝나는 경우)은 다음과 같은 형식을 따른다.

 

for (initialization; condition; update);

 

for문의 initialization절이나 update절에서 콤마(,)를 사용할때는 변수를 세개 이상 사용하면 문장이 복잡해지므로 피하라. 변수를 세개 이상 사용해야 할 경우에는 for 루프문의 처음에 따로 문장을 쓰거나(initialization 절의 경우), 루프문의 마지막에 따로 문장을 사용한다(update절의 경우).

 

7.6 while Statements

while문은 다음과 같은 형식을 따른다.

 

while (condition) {

    statements;

}

 

비어 있는 while문은 다음과 같은 형식을 따른다.

 

while (condition);

 

7.7 do-while Statements

do-while문은 다음과 같은 형식을 따른다.

 

do {

    statements;

} while (condition);


7.8 switch Statements

switch문은 다음과 같은 형식을 따른다.

 

switch (condition) {

case ABC:

    statements;

    /* falls through */

 

case DEF:

    statements;

    break;

 

case XYZ:

    statements;

    break;

 

default:

    statements;

    break;

}

 

조건통과(fall through)하는 문장(break 문을 사용하지 않은 case)마다, 정상적으로 break문이 위치해야 하는 자리에 주석을 추가하라. 위의 예에서는 /*  falls through */ 와 같은 주석을 사용했다.

모든 switch문에는 default문을 사용한다. defalt문에서의break는 중복이긴 하지만, 나중에 다른 case문을 추가했을때 발생할 수 있는 조건통과(fall-through) 에러를 방지할 수 있다.

 

7.9 try-catch Statements

try-catch문은 다음과 같은 형식을 따른다.

 

try {

    statements;

} catch (ExceptionClass e) {

    statements;

}

 

try-catch문뒤에는 finally문이 올수도 있다. 이것은 try블록 수행의 성공 여부에 상관없이 실행된다.

 

try {

    statements;

} catch (ExceptionClass e) {

    statements;

} finally {

    statements;

}


8 - White Space

 

8.1 Blank Lines

빈 라인은 논리적으로 연관된 코드 섹션을 구분시켜 줌으로써 가독성을 향상시킨다.

두개의 빈 라인은 다음과 같은 경우에 사용한다.

 

소스 파일의 섹션 사이

클래스와 인터페이스 정의 사이

 

한개의 빈 라인은 다음과 같은 경우에 사용한다.

 

메소드 사이

메소드 내의 로컬 변수와 그 메소드의 첫 문장(statement) 사이

블록 주석(5.1.1 참고)과 한줄 주석(5.1.2 참고)

메소드 내부의 논리적 섹션간에 가독성 향상을 위해 사용

 

8.2 Blank Spaces

빈 스페이스는 다음의 경우에 사용한다.

키워드 다음에 괄호가 오는 경우에 하나의 스페이스로 구분한다. 예를 들어,

 

    while (true) {

        ...

    }

 

메소드와 그 괄호 사이는 띄어쓰지 않는다는 것을 기억하라. 이는 메소드 호출과 키워드를 구분하는데 도움이 된다.

인수(argument) 리스트에서 콤마 다음에 한칸 띄움.

(.) 연산자를 제외한 모든 이항(binary) 연산자는 피연산자와 공백을 띄운다. 단항 마이너스(unary minus)나 증감연산자("++", "--")와 같은 단항(unary) 연산자는 피연산자와 띄어쓰지 않는다. 예를들어,

 

    a += c + d;

    a = (a + b) / (c * d);

   

    while (d++ = s++) {

        n++;

    }

    printSize("size is " + foo + "\n");

 

for문에서의 표현식 사이는 공백으로 구분한다. 예를 들어,

 

    for (expr1; expr2; expr3)

 

캐스트(cast)연산자 뒤에는 한칸 띄어쓴다. 예를 들어,

 

    myMethod((byte) aNum, (Object) x);

    myMethod((int) (cp + 5), ((int) (i + 3)) + 1);


9 - Naming Conventions

 

네이밍(Naming) 룰은 프로그램의 가독성을 향상시킴으로써 이해하기 쉽게 만든다. 이것은 또한 식별자(identifier)의 기능에 대한 정보를 제공한다. 예를 들어, 상수인지 패키지인지 클래스 인지를 알게 해주며, 이것은 코드를 이해하는데 있어 도움을 준다.

 

Identifier Type

Rules for Naming

Examples

Packages

유일 패키지명의 접두어는 항상 소문자로 된 ASCII 문자로 쓰며, 현재까지의 최상위 도메인명인 com, edu, gov, mil, net, org중에 하나이거나, ISO 표준 3166 (1981)에서 지정한 두글자로 된 영문 국가 코드 중에 하나여야 한다.

패키지명의 나머지 요소들은 조직의 내부 네이밍 규칙에 따라 바뀐다. 이러한 규칙들에 따르면 어떤 디렉토리명 요소에는 부서명, 프로젝트명, 기관명, 로그인 사용자명 등이 올 수 있다.

com.sun.eng

com.apple.quicktime.v2

edu.cmu.cs.bovik.cheese

Classes

클래스명은 명사여야 하고, 각 단어의 첫글자는 대문자로 한다. 클래스명은 간단해야 하며, 그 클래스를 잘 설명할 수 있어야 한다. (만약 URL이나 HTML같은 단어처럼 축약형이 더 널리 사용되는 경우가 아니라면) 이니셜명이나 축약형은 피하고 전체 단어를 사용하라.

class Raster;
class ImageSprite;

Interfaces

인터페이스명은 클래스명과 같은 대소문자 규칙을 적용한다.

interface RasterDelegate;
interface Storing;

Methods

메소드는 동사여야 하고 첫 글자는 소문자, 다음의 각 단어의 첫글자는 대문자를 사용한다.

run();
runFast();
getBackground();

Variables

변수를 제외하고, 모든 인스턴스, 클래스, 클래스 상수는 첫 글자를 소문자로 시작하는 대소문자 혼합 형태이다. 내부 단어는 대문자로 시작해야 한다. 변수명으로 언더스코어("_")나 달러("$") 둘다 허용은 되지만, 이들 글자들로 시작할 수는 없다.

변수명은 짧지만 의미를 가져야 한다. 변수명은 기억하기 쉬워야 한다. , 임의의 관찰자가 보더라도 그 사용의도를 알 수 있게 해야 한다. 임시적인 1회성(throwaway) 변수가 아니라면 한 글자로 된 변수명은 피해야 한다. 임시변수에 대한 일반적인 이름은 i, j, k, m 가 있고, 정수를 나타내는 n, 문자를 나타내는 c, d, e가 있다.

int      i;

char     c;

float    myWidth;

Constants

클래스 상수로 선언된 변수명과 ANSI 상수명은 언더스코어("_")로 구분된 대문자 단어를 사용한다. (디버깅을 편하게 하려면 ANSI 상수는 피하는 것이 좋다.)

static final int MIN_WIDTH = 4;

static final int MAX_WIDTH = 999;

static final int GET_THE_CPU = 1;

 


10 - Programming Practices

 

10.1 Providing Access to Instance and Class Variables

타당한 이유 없이는 인스턴스나 클래스 변수를 만들지 말라. 종종 인스턴스 변수는 명시적으로 사용할 필요가 없을 수가 있다. 이는 종종 메소드 호출의 부작용으로 나타나곤 한다.

적당한 public 인스턴스 변수의 한가지 예는, 클래스가 비헤이비어(behavior)를 가지지 않은 근본적인 데이터 구조인 경우이다. 다시 말해서, class 대신에 struct(만약 Java struct를 지원한다고 했을때)를 사용한다면, 그땐 클래스의 인스턴스 변수를 public으로 지정하는 것이 적당하다.

 

10.2 Referring to Class Variables and Methods

정적인 클래스 변수나 메소드에 접근하기 위해 객체를 사용하는 것은 피하라. 그 대신 클래스명을 사용하라. 예를 들어,

 

classMethod();               //좋다

AClass.classMethod();       //좋다

anObject.classMethod();    //부적절!

 

10.3 Constants

숫자상수(리터럴 상수) for 루프문에서 카운터 값으로 쓰는 -1, 0, 1을 제외하고는 직접적으로 코딩하지 않는게 좋다.

 

10.4 Variable Assignments

한 문장에서 여러변수에 같은 값을 할당 하는 것은 읽기에 어려우니 피하라. 예를 들어,

 

fooBar.fChar = barFoo.lchar = 'c'; // 부적절!

 

대등(equality) 연산자와 쉽게 혼동될 수 있는 곳에 할당(assignment) 연산자를 사용하지 말라. 예를 들어,

 

if (c++ = d++) {        // 부적절! (Java에서 허용되지 않음)

    ...

}

 

이것은 다음과 같이 쓰여져야 한다.

 

if ((c++ = d++) != 0) {

    ...

}

 

런타임 성능 향상을 위해 포함된 할당(embedded assignment)을 사용하지 말라. 이러한 성능향상은 컴파일러의 몫이다. 예를 들어,

 

d = (a = b + c) + r;        // 부적절!

 

이것은 다음과 같이 쓰여져야 한다.

 

a = b + c;

d = a + r;


10.5 Miscellaneous Practices

10.5.1 Parentheses

연산자 우선순위 문제를 피하기 위해 여러 연산자가 혼합된 문장에서 괄호를 자유로이 사용하는 것은 좋다. 프로그램을 작성하는 본인에게는 연산자 우선 순위가 명확해 보인다 할지라도, 다른 사람에게는 그렇지 않을 수가 있다. 당신이 알고 있는 만큼 다른 프로그래머들도 우선순위를 잘 알고 있다고 가정하지 말라.

 

if (a == b && c == d)      // 부적절!

if ((a == b) && (c == d)) // 맞음

 

10.5.2 Returning Values

프로그램 구조를 의도에 맞게 만들도록 한다. 예를 들어,

 

if (booleanExpression) {

    return true;

} else {

    return false;

}

 

대신에 다음과 같이 쓰여져야 한다.

 

return booleanExpression;

 

이와 유사하게,

 

if (condition) {

    return x;

}

return y;

 

이는 다음과 같이 쓰여져야 한다.

 

return (condition ? x : y);

 

10.5.3 Expressions before `?' in the Conditional Operator

삼항(ternary) 연산자 " ? : " "?" 앞에 이항(binary) 연산자를 포함한 표현식이 있다면 괄호처리 해준다. 예들 들어,

 

(x >= 0) ? x : -x;

 

10.5.4 Special Comments

모호하지만 작동한다는 것을 표시하기 위해 주석에 xxx를 사용하라. 불분명하고 깨져있다는 것을 알리기 위해 주석에 FIXME 를 사용하라.


11 - Code Examples

 

11.1 Java Source File Example

다음의 예제는 하나의 public 클래스를 가진 자바 소스 파일을 어떻게 구성 하는지를 보여준다. 인터페이스도 이와 유사하게 구성된다. 더 자세한 정보는 5페이지의 "Class and Interface"10페이지의 "Documentation Comments"를 참조하라.

 

/*

 * @(#)Blah.java        1.82 99/03/18

 *

 * Copyright (c) 1994-1999 Sun Microsystems, Inc.

 * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.

 * All rights reserved.

 *

 * This software is the confidential and proprietary information of Sun

 * Microsystems, Inc. ("Confidential Information").  You shall not

 * disclose such Confidential Information and shall use it only in

 * accordance with the terms of the license agreement you entered into

 * with Sun.

 */

 

 

package java.blah;

 

import java.blah.blahdy.BlahBlah;

 

/**

 * 클래스 설명

 *

 * @version   1.82 18 Mar 1999

 * @author    Firstname Lastname

 */

public class Blah extends SomeClass {

    /* 클래스 구현 주석의 위치 */

 

    /** classVar1 도큐먼트 주석 */

    public static int classVar1;

 

    /**

     * classVar2 도큐먼트 주석이

     * 라인을 넘길때

     */

    private static Object classVar2;


 

    /** instanceVar1 도큐먼트 주석 */

    public Object instanceVar1;

 

    /** instanceVar2 도큐먼트 주석 */

    protected int instanceVar2;

 

    /** instanceVar3 도큐먼트 주석 */

    private Object[] instanceVar3;

 

    /**

     * ...생성자 Blah 도큐먼트 주석...

     */

    public Blah() {

        // ...구현은 여기에...

    }

 

    /**

     * ...메소드 doSomething 도큐먼트 주석...

     */

    public void doSomething() {

        // ...구현은 여기에...

    }

 

    /**

     * ...메소드 doSomethingElse 도큐먼트 주석...

     * @param someParam description

     */

    public void doSomethingElse(Object someParam) {

        // ...구현은 여기에...

    }

}

 

'Language > Java' 카테고리의 다른 글

JAVA 접근 제한자 (public, private, protected, default)  (1) 2014.02.27
Java Reflection 개념 및 사용법  (4) 2014.02.27
JAVA ThreadLocal  (0) 2014.02.27
PreparedStatement batch insert (JDBC)  (0) 2014.02.21
Spring Remote (RMI) 예제  (0) 2014.02.21