본문 바로가기

Programming/JAVA

[펌]자바 표준 코드 규약

1. 도입

 

1.1 왜 필요한가?

 

코드 규약은 다음의 이유로 필요하다.

- 소프트웨어의 80%의 비용이 유지, 보수에 들어간다.

- 원 제작자에 의해 유지, 보수되는 소프트웨어는 거의 없다.

- 코드 규약은 소프트웨어 읽기를 쉽게 해준다. 엔지니어들에게 처음보는

  코드를 더 빠르고 완벽하게 이해할 수 있게 해준다.

- 만약 당신이 소스 코드를 하나의 제품으로서 수출한다면 그것을 당신이

  만든 다른 제품들과 같이 잘 패키징되고 깨끗하게 정리되도록 해야 된다.

 

이 규약이 효과를 거두기 위해서는 소프트웨어를 만드는 모든 사람들이

이 규약을 따라야 할 것이다. 모든 사람이!!!

 

1.2 인증

 

이 문서는 SUN사에서 나온 Java language specification에 제시된 Java 언어의

코딩 표준을 반영한 것이다.

주 배포자는 Peter King, Patrick Naughton, Mike DeMoney, Jonni Kanerva,

Kathy Walrath, Scott Hommel씨입니다.

 

이 문서는 Scott Hommel씨에 의해 수정되고 있습니다. 문의하실 사항이

있다면 shommel@eng.sun.com으로 해주십시오.

 

이 문서는 저자의 허락 없이 사적인 용도로 번역되는 것입니다.

 

혹시 저작권에 위배되는 경우 picachu@myscan.org로 메일을 주시면 당장 그에

따른 조치를 취하겠습니다.

 

아직 번역에 미숙한 점이 많으니 읽으시는 분들이 이해해주시길 바랍니다.

 

이 번역이 나올 수 있게 도와주신 우리 동아리의 여러 회원들께 사랑과 행운이 깃드시길...

 

 

2. 파일의 이름

 

 

이 부분에서는 파일의 확장자와 이름에 대한 일반적인 사항을 다룬다.

 

2.1 파일의 접미사들(확장자)

 

자바의 소프트웨어들은 다음과 같은 확장자명을 가진다.

 

자바의 소스 파일              .java

자바의 바이트 코드           .class

 

2.2 일반적인 파일의 이름들

 

자주 사용되는 파일의 이름들은 다음과 같습니다.

GNUmakefile       make파일을 위한 이름

                           이 소프트웨어를 만들려고 gnumake를 썼음을 의미

README                           특정 디렉토리의 내용을 요약한 파일의 이름

 

 

3. 파일의 구성

 

 

하나의 파일은 빈 줄에 의해서 분리되고 각각의 부분에 주석을 단 여러

개의 조각들의 합으로 이루어진다.

2000줄 이상 되는 파일은 부담스러우며 피해야 할 것이다.

자바 프로그래밍의 올바른 형식의 예를 확인하기 위해서는 이 글의 마지막에

있는 자바 소스 파일의 예를 보면 될 것이다.

 

3.1 자바 소스 파일들

 

각각의 자바 소스 파일들은 하나의 public 클래스와 인터페이스를 포함하고 있다.

이 때 private 클래스와 인터페이스는 public 클래스와 연결되어 있을 것이다.

 

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

- 도입 주석(바로 다음에 나온다.)

- package import 문들

- 클래스와 인터페이스 선언

 

3.1.1 도입 주석

 

모든 소스 파일들은 클래스의 이름과 버젼 정보와 날짜와 저작권에 대한 내용을

가지는 C 형식의 주석으로 시작된다.

/*

 * Classname

 *

 * Version information

 *

 * Date

 *

 * Copyright notice

 */

 

3.1.2 package, import

 

대부분의 자바 소스 파일에서 첫번째 주석이 아닌 문장은 package문이다.

그 다음에 import문이 뒤에 따라온다.

 

package java.awt;

 

import java.awt.peer.CanvasPeer;

 

3.1.3 class interface 선언

 

다음에 테이블은 클래스나 인터패이스의 선언을 설명하고 있다.

다음 표의 순서대로 나와야 할 것이다.

 

주석이 포함된 예를 원한다면 이 글의 마지막 부분에 있는 Java 소스 파일의

예를 참고하라.

 

1            클래스/인터페이스 관련 주석(/**...*/)

2            class 또는 interface

3            클래스나 인터페이스를 구현에 대한 주석(/*...*/)

4            클래스(static) 변수

5            인스턴스 변수

6            생성자(constructor)

7            매소드들

 

 

4. 띄어쓰기(indentation)

 

 

띄어쓰기의 기본 단위는 4칸이다. 띄어쓰기의 정확한 규약(spaces 인지 tabs 인지)

지정되어 있지 않다.

그러니 tab은 반드시 정확히 8칸이어야 한다.(4칸을 사용하면 절대 안됨)

 

4.1 한 줄의 길이

 

한 개의 줄이 80개의 문자 이상을 사용하는 것은 피해야 한다. 왜냐하면 이들은 많은

터미널이나 툴들에서 지원되지 않기 때문이다.

Note: 문서에 사용되는 예제들은 한 줄이 더 짧아야 한다.--일반적으로 70 문자

이상을 넘겨서는 안된다.

 

4.2 줄 맞추기

 

하나의 줄에 하나의 표현이 다 들어가지 않을 경우 다음의 규약에 맞추어 쪼개서 넣는다.

- 쉼표 다음에 쪼갠다.(,)

- 연산자 바로 앞에서 쪼갠다.

- 우선순위를 따져서 쪼갠다.

- 새로운 줄을 이전의 줄과 똑같은 위치에 일치시켜 배치한다.

- 만일 위의 규약들이 코드를 이해하는 데에 혼란을 주거나 오른쪽 여백까지 몰려 있을

경우 8칸만 띄고 써도 된다.

 

여기 매소드의 호출에서 너무 길어 끊어 쓴 예들이 있다.

 

someMethod(longExpression1, longExpression2, longExpressino3,

              longExpression4, longExpression5);

 

var = someMethod1(longExpression1,

                           someMethod2(longExpression2,

                                          longExpression3));

 

다음의 두가지 예는 수식을 쪼개서 쓴 것이다. 처음의 것이 권장되는 것이다.

왜냐하면 소괄호 밖에서 쪼개는 것이 더 우선순위를 가지기 때문이다.

 

longName1 = longName2 * (longName3 + longName4 - longName5)

                 + 4 * longname6; //권장됩니다.

 

longName1 = longName2 * (longName3 + longName4

                                         - longName5) + 4 * longname6; //피해야 한다.

 

다음의 두가지 예는 메소드 선언시 띄어쓰기는 어떻게 하는지 잘 보여주고 있다.

첫번째 예는 규약에 따라 쓰는 것이 어떤 것인지를 잘 보여준다.

그 다음의 예는 규약에 따라 쓰면 두번째와 세번째 줄이 너무 오른쪽으로 멀리

가게 됨으로 여덟 칸만 띄어 쓰고 있다.

 

//CONVENTIONAL INDENTATION

someMethod(int anArg, Object anotherArg, String yetAnotherArg,

                Object andStillAnother) {

    ...

}

 

//INDENT 8 SPACES TO AVOID VERY DEEP INDENTS

private static synchronized horkingLongMethodName(int anArg,

             Object anotherArg, String yetAnotherArg,

             Object andStillAnother) {

    ...

}

 

if문 줄쓰기는 보통 8칸 룰을 따른다. 왜냐하면 4칸 룰은 코드의 몸통을 보는

것을 어렵게 하기 때문이다. 예를 들면,

 

//DON'T USE THIS INDENTATION

if ((condition1 && condition2)

    || (condition3 && condition4)

    ||!(condition5 && condition6)) { //BAD WRAPS

    doSomethingAboutIt();                  //MAKE THIS LINE EASY TO MISS

}

 

//USE THIS INDENTATION INSTEAD

if ((condition1 && condition2)

             || (condition3 && condition4)

             ||!(condition5 && condition6)) {

    doSomethingAboutIt();

}

 

//OR USE THIS

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

             ||!(condition5 && condition6)) {

    doSomethingAboutIt();

}

 

여기 조건문을 처리하는 세가지의 방법이 제시되어 있다.

 

alpha = (aLongBooleanExpression) ? beta : gamma;

 

alpha = (aLongBooleanExpression) ? beta

                                                      : gamma;

 

alpha = (aLongBooleanExpression)

             ? beta

             : gamma;

 

 

5. 주석 달기

 

자바 프로그램은 다음의 두가지 종류의 주석을 가진다. 구현부의 주석과 문서형의 주석이다. 구현부의 주석은 C++에서도 볼수있는 것들이다. /*...*/ //와 같은 제한자들이 사용된다. 문서형 주석은 doc comment라고도 불리는 것들로서 자바만 가지고 있는 특이한 것이다. 이것들은 /**...*/ 제한자가 사용되는 것이다. 이것은 javadoc이라는 툴을 통해서 html파일 형식으로 추출될수도 있는 것이다. 구현부 주석은 코드에 다는 주석이나 특정 구현부에 대한 주석을 의미한다.

문서형 주석(Doc comment)은 소스 코드가 없는 상황에서도 개발자가 구현부에 대해서 이해할 수 만든 코드에 대한 세부적이며 자세한 설명이다. 주석은 코드에 대한 개괄적인 내용을 제공하고 코드자체에서는 알 수 없는 부가적인 정보를 제공한다. 주석은 프로그램에 대해서 손쉽게 읽을 수 있고 이해할 수 있도록 하는 정보만을 포함하고 있어야 한다.

예를 들어, 어떻게 이 패키지가 만들어 졌는지 또는 어느 디렉토리에 이것이 들어 있는 지는 주석에 포함될 필요가 없는 것들이다. 중요하지 않은 것과 분명하지 않은 , 그러나 코드 안에 이미 들어 있는 내용을 복사해서 그대로 가져다 붙이는 것은 피해야 할 것이다. 필요없는 주석들이 시효가 지나서 못 쓰게 되는 경우가 허다하다. 일반적으로 말해서 코드가 개선되면서 유효기간이 지난 주석은 버려야 한다.

Note: 주석의 빈도가 너무 많은 경우 이것은 코드의 허접함을 드러내는 것일수 있습니다. 주석을 덧붙이는 것이 귀찮다고 생각되는 경우 깨끗한 코드의 작성을 위해 다시 쓰는 것을 고려해 보는 것도 좋습니다. 주석은 아스테리크나 다른 문자들로 이루어진 박스에 둘러 쌓여져 있어서는 안됩니다.

 

예를 들어

 

***********       -------------

*              *     |                 |

*              *         |                |     

***********     -------------

 

이런 것을 사용해서는 안됩니다.

 

주석에는 form-feed나 벡 스페이스 같은 특수 문자가 포함되어서는 안됩니다.

 

5.1 주석의 형식 구현하기

 

프로그램은 구현부에 다음의 4가지의 구현부 주석을 가질수 있다.

블록 주석, 단일 문장 주석, 따라 붙는 주석, 문장 끝까지 붙는 주석

 

5.1.1 블록 주석 달기

 

블록 주석은 파일과 메소드, 자료 구조, 알고리즘에 대한 설명을 제공하는데 사용된다.

블록 주석은 각 파일이나 각 메소드의 처음이나 메소드 내부에서 사용된다.

함수나 메소드의 내부에 있는 블록 주석은 설명하는 코드와 비슷한 위치에 자리잡을수

있도록 잘 띄어써야 한다.

 

블록 주석이 나오기에 앞서 코드와의 구분을 위해 빈 줄이 하나 필요하다.

 

/*

 * Here is a block comment.

 */

 

블록 주석은 /*-로 시작할 수 있다. 이것은 띄어쓰기를 여겼는데도 불구하고 다시

포맷을 수정하지 않아야 할 주석의 경우에 앞에 붙이는 것이다.

 

/*-

 * Here is a block comment with some very special

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

 *

 *    one

 *            two

 *                three

 */

 

5.1.2 단일 문장 주석 달기

 

하나의 줄 전체를 차지하는 짧은 주석은 그 뒤에 따라오는 코드와 같은 정도로

띄어쓰기해서 쓸 수 있다. 만약 주석을 한 줄에 다 쓸 수 없는 경우에는 블록 주석의

형식을 따라야 할 것이다. 단일 문장 주석을 쓰는 경우 그 앞에 빈 줄이 하나 놓여

있어야 할 것이다. 여기에 자바 코드에서 어떻게 단일 문장 주석을 사용할지가 잘 나와있다.

 

if (condition) {

 

    /* Handle the condition. */

    ...

}

 

5.1.3 따라 붙는 주석(trailing comments)

 

매우 짧은 주석은 그것이 설명하는 코드 옆에 바로 붙어 있을 수 있다. 그러나

충분히 구현부 코드와 상당히 떨어져 있어야 한다. 만약 하나 이상의 짧은 주석이

코드에 나올때 그들은 모두 동일한 탭 간격만큼 떨어져 있어야 할 것이다.

여기 따라 붙는 주석의 예가 있다.

 

if (a == 2) {

    return TRUE;              /* 특별한 경우 */

} else {

    return isPrime(a);                    /* 홀수 a 일때만 작동한다 */

}

 

5.1.4 문장 끝까지 붙는 주석(end-of-line comments)

//주석 제한자는 한 줄 전체를 또는 줄의 부분만에 주석을 달려고 할때 사용된다.

이것은 연속적인 많은 줄의 주석에 사용되어서는 안된다.

그러나 코드의 한 부분을 주석화 할 경우에는 연속적인 많은 줄을 대상으로도

이 주석 형식을 사용할 수 있다.

이 세가지 형식들의 예는 다음과 같다.

 

if (foo > 1) {

    // Do a double-filp.

    ...

}

else{

    return false;  // Explain why here.

}

 

//if (bar > 1) {

//

//    //Do a triple-flip.

//    ...

//}

//else{

//    return false;

//}

 

5.2 Documentation comments(문서형 주석)

Note: 이 문서의 맨 마지막에 나오는 자바 소스 파일의 예에 이 주석은 어떻게

생겼는지 잘 볼 수 있다.

더 많은 정보를 얻기 원한다면 "How to Write Doc Comments for Javadoc"이라는

문서를 참고하십시오.

여기에는 @return, @param, @see 등의 doc comment(문서형 주석)의 테그들에 대한

정보가 자세히 수록되어 있다.

 

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 { ...

 

최상위 단계의 클래스와 인터페이스는 띄어쓰기가 되지 않는다는 사실에 주목하십시오.

단 그것들의 member는 띄어쓰기를 해야 할 것입니다. 클래스나 인터페이스에서 문서형

주석의 첫째 줄은 /** 띄어쓰기 되지 않습니다. 계속되는 문서형 주석은 각 줄마다

한칸씩 띄고 씁니다. 생성자를 포함하는 멤버는 첫번째 문서형 주석줄로부터 4칸의

공백을 가지고 거기에 5칸의 공백을 더한다.

 

만일 당신이 클래스나 인터페이스, 상수, 메소드에 맞지 않는 내용의 주석을 가지고

있다면 블록 주석 또는 단일 문장 주석으로 선언 직후에 바로 주석을 달아줄 수 있다.

예를 들어, 클래스의 구현에 대한 세부적인 사항들은 블록 주석으로 class문 다음에

나와야 한다. class doc comment가 아닌...

 

문서형 주석(doc comment)는 메소드나 생성자를 정의하는 블록안에 위치해서는 절대 안된다.

왜냐하면 자바는 문서화된 주석들과 주석 바로 뒤의 첫번째 선언을 연관시켜서

해석할 수 있기 때문이다.

 

 

6. 선언

 

 

6.1 한 줄마다 하나씩...

 

한 문장마다 하나의 선언이 권장되는 이유는 주석처리를 위해서 입니다.

예를 들면,

int level, size;

보다는

int level; // indentation level

int size; // size of table

가 더 권장됩니다.

다른 타입의 문장을 같은 문장에 넣지 마세요. 예를 들면,

int foo, fooarray[];           //틀렸어요!!

 

Note: 위의 예들은 데이터 형과 변수명이나 배열 이름사이에 한 칸씩만 띄고 있다.

다른 괜찮은 대안으로는 tab을 사용하는 것이 있다.

예를 들어,

int          level;                  // indentation level

int          size;                   // size of table

Object   currentEntry;       // currently selected table entry

 

6.2 초기화

 

로컬 변수를 선언한 곳에서 초기화시켜주시는 것을 잊지 마십시요.

선언된 곳에서 변수를 초기화 하지않는 유일한 경우는 초기값이 이전에 계산된

값에 영향을 받을 경우에 한정됩니다.

 

6.3 위치선정

 

블록의 처음에만 선언문을 배치하십시오.(블록은 { }로 싸인 곳입니다)

처음으로 쓰일때까지 변수를 선언하는 것을 보류하시는 것은 어리석은 일입니다.

이 경우 초보 프로그래머들은 해깔릴 수 있고 코드의 안정성을 위태로워질 수 있습니다.

 

void myMethod() {

    int int1 = 0;                  // 메소드 블록의 시작

 

    if (condition) {

             int int2 = 0;                        // if문 블록의 시작

             ...

    }

}

 

이 규칙의 예외가 적용되는 곳은 for 루프이다.

for문 안에서는 선언되는 것이 허락된다.

 

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

 

지역 변수의 선언이 더 상위에 있는 변수의 선언을 가려서는 안된다.

예를 들면 동일한 변수의 이름을 안에 있는 블록에서 재선언하지 말아라.

 

int count;

...

myMethod() {

if (condition) {

int count;                          // 피해야 한다!!

...

}

...

}

 

6.4 클래스와 인터페이스 선언

 

자바 클래스나 인터페이스를 선언할 때, 다음의 형식을 따르시는 것이 좋습니다.

- 메소드 이름하고 (로 시작하는 파라미터 리스트 사이에는 빈칸이 필요치 않습니다.

- '{'는 선언문의 마지막에 위치하는 것이 좋습니다.

- '}'는 그 자체로 한 줄을 시작하고 그것과 짝을 이루는 '{'과 같은 위치에

놓여 있어야 합니다. 예외적인 경우로 아무 문장도 없는 경우에는 '}'가 바로

'{'옆에 붙어서 나올 수 있습니다.

 

class Sample extends Object {

int ivar1;

int ivar2;

 

Sample(int i, int j) {

ivar1 = i;

ivar2 = j;

}

 

int emptyMethod() {}

 

...

}

 

- 메소드는 빈 줄로 구분됩니다.

 

 

 

7. 구문들

 

 

7.1 간단한 구문

 

각 줄들은 적어도 하나의 문장(구문)이 나와야 합니다. 예를 들면,

argv++;               // 맞아요.

argc++;               // 맞아요.

argv++; arg--;     // 피해야 합니다.

 

7.2 복합 구문

 

복합 구문은 { }안에 둘러 쌓인 여러개의 구문들의 집합을 가리켜 말하는 것입니다.

- 둘러 쌓인 구문들은 둘러 싸고 있는 구문들 보다 한 단계 더 띄어쓰기를 해야 됩니다.

- "{"은 반드시 처음으로 둘러싸고 있는 문장의 각 줄의 끝에 있어야 합니다.

"}"은 반드시 줄의 처음에 있어야 하고

(아직 많이 남음- 다시 쓸 것)

 

7.3 return

 

값을 가지고 있는 return문에는 절대로 소괄호를 써서는 안된다. 예를 들어,

return;

 

return myDisk.size();

 

return (size ? size : defaultSize);

 

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

 

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

 

for문은 다음과 같은 형식으로 쓰입니다.

 

for (initialization; condition; update) {

statements;

}

아무것도 쓰지 않은 for문은 다음과 같이 씁니다.

 

for (initialization; condition; update);

for문에서 초기화나 업데이트문에 콤마 연산자를 사용할 경우 세가지 이상의

변수를 씀으로 인해 발생할 수 있는 복잡성을 피해야 합니다. 만일 반드시

필요하다면 for루프 이전 또는 루프의 끝 쪽에 독립적인 구문들을 씁니다.

 

7.6 while

 

while문은 다음의 형식으로 쓰입니다.

 

while (condition) {

statements;

}

아무것도 쓰지 않은 while문은 다음과 같은 형식으로 씁니다.

 

while (condition);

 

7.7 do-while

 

do-while문은 다음과 같은 형식으로 쓰입니다.

do {

statements;

} while (condition);

 

7.8 switch

 

switch문은 다음의 형식과 같이 쓴다.

switch (condition) {

case ABC:

statements;

/* falls through */

case DEF:

statements;

break;

 

case XYZ:

statements;

break;

 

default:

statements;

break;

}

 

7.9 try-catch

 

try-catch문은 다음의 형식을 가집니다.

 

try {

statements

} catch (ExceptionClass e) {

statements;

}

하나의 try-catch문 뒤에는 try블록이 성공적으로 완성되던 말든 수행되는

finally문이 있을 수 있습니다.

 

try {

statements;

} catch (ExceptionClass e) {

statements;

} finally {

statements;

}

 

 

8. 공백 처리

 

 

8.1 빈 줄

 

빈 줄은 논리적으로 연관된 코드를 조각으로 나누어 가독성(readability)를 높여줍니다.

두 개의 빈 줄은 다음의 경우에 사용될 수 있습니다.

- 자바 소스코드의 각 부분들 사이에

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

빈 줄 하나는 다음의 경우에 사용될 수 있습니다.

- 메소드들 사이에

- 메소드 안에 있는 지역 변수(local variable)와 그것의 첫번째 구문 사이에

- 블록 주석과 단일 문장 주석 사이에

- 가독성을 위해서 메소드 안에 논리적인 부분들 사이에 집어 넣는다.

 

8.2 빈칸들

 

빈 칸은 다음의 경우에 사용된다.

- 소괄호가 따라 나오는 키워드는 빈 칸에 의해 나뉜다.

예를 들면,

while (true) {

...

}

빈 칸이 메소드의 이름과 소괄호 사이에는 쓰여지면 안 된다는 사실에 주목하십시오.

이것은 키워드와 메소드 호출을 구분하기 위해 정한 규약임을 잊지 마십시오.

- 빈 칸은 아규먼트 목록에 콤마들 뒤에 반드시 있어야 합니다.

- "."을 제외한 모든 이진수 연산자는 반드시 빈 칸으로 떨어져 있어야 합니다.

이 빈 칸은 음수를 나타내는 -와 증가를 나타내는 ++와 감소를 나타내는 --에는 절대로

넣어서는 안됩니다.

a += c + d;

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

 

while (d++ = s++) {

n++;

}

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

- for문에 있는 표현들은 빈 칸을 두고 쓰여져야 합니다. 예를 들면,

for (expr1; expr2; expr3)

- 형 변환시에는 빈 칸이 뒤에 나와야 합니다. 예를 들면,

myMethod((byte) a Num, (Object) x);

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

                           + 1);

 

9. 이름 붙이는 방법

 

이름 붙이는 규약은 프로그램을 더 쉽게 이해할 수 있도록 해준다.

그것들은 identifier(예를 들면, 상수, 패키지, 클래스)의 기능이 무엇인지에 대한

정보를 준다.

Identifier             이름 붙이는 방법              예들

패키지                 패키지 앞에 붙는 접두사는 모두    com.sun.eng

ASCII소문자이고 먼저 도메인 이름com.apple.quicktime.v2    

이 나오거나 국가코드(2글자)가 나edu.cmu.cs.bovik.cheese

와야한다. 그 뒤에 계속 붙어나오는

것들은 그 단체의 이름을 붙이는 규약

에 따른다. 부서명, 계정이름, 머신명

등이 올 것이다.

 

클래스                 클래스의 이름은 반드시 명사이어   class Raster;

야한다. 각 단어의 첫 글자는 반      class ImageSprite;

드시 대문자이어야 하고 이름은

간단하면서도 특징을 잘 서술할 수

있으며 단어 전체를 사용하여 지어

야 한다. 약자는 금물이다.

 

인터페이스          인터페이스의 이름은 클래스           interface RasterDelegate;

이름처럼 대문자로 시작한다.          interface Storing;

 

메소드                 메소드이름은 동사를 주로 쓴다.     run();

소문자로 시작하되 각 단어들의      runFast();

첫 문자는 대문자이다.                    getBackground();

 

변수들                 변수들을 제외하고 모든 클래스      int i;

인스턴스, 클래스 상수들은 소문     char c;

자로 시작한다. 변수 이름은 "_"      float myWidth;

"$"로 시작해서는 안된다.

변수 이름은 그리고 짧지만 기억을

위해 의미가 담겨있어야 한다.

그리고 임시적으로 쓰고 버릴 변수가

아니라면 1글자 이상의 변수 이름을

지어야 할 것이다.

 

상수들                 클래스 상수와 ANSI상수의 이름      static final int MIN_WIDTH = 4;

은 대문자로 시작하고 "_"           

구분된다.                                       static final int GET_THE_CPU = 1;

(, ANSI 상수는 디버깅의 편의     

를 위해 지금은 쓰지 않는다.          static final int MAX_WIDTH = 999;

 

10. 프로그래밍 실제

 

10.1 인스턴스와 클래스 변수에 접근 가능성을 부여하는 방법

특별한 이유 없이 인스턴스나 클래스 변수에 public 접근자를 부여하지 마십시오.

특히, 인스턴스 변수는 명시적으로 정해질 필요는 없다.

종종 이것들은 메소드를 호출할 때 부작용을 일으키기도 한다.

public 접근자가 붙은 인스턴스 변수가 합당한 한 예로는 클래스가 꼭 필요한

데이터들로 이루어진 구조일때만 가능하다.

, 어떤 메소드나 행동들이 없어야 한다.

만일 자바가 struct(구조체)를 지원한다면 클래스 대신에 구조체를 쓰는 것이 현명할

것입니다.

하지만 그럴수는 없으니 데이터만 있는 클래스라면 public 접근자를 써도 됩니다.

 

10.2 클래스 변수와 인스턴스들을 참조한다.

 

클래스 변수와 메소드에 접근하기 위해 객체를 사용하는 것은 피하십시요.

대신에 클래스의 이름을 사용하십시오.

예를 들어,

classMethod();                // 좋아요..

AClass.classMethod();    // 좋아요..

anObject.classMethod(); // 피해야 할 것!!

 

10.3 상수들

 

수치 상수들은 for 루프에서 카운터의 숫자로 쓰이는 -1,0,1을 제외하고는

바로 써 넣어줄 필요는 없습니다.

 

10.4 변수 할당

 

하나의 문장에서 여러 개의 변수에 같은 값을 대입하는 것은 피해야 합니다.

코드 분석을 어렵게 하기 때문입니다.

예를 들면,

fooBar.fChar = barFoo.lchar = 'c';  // 피하세요!!

동일함을 나타내는 연산자와 해깔릴 소지가 있는 곳에는 대입연산자를 사용하지 마십시오.

예를 들어,

if (c++ = d++) {    // 피하세요!!(자바가 이런 것은 받아들이지 않습니다.)

...

}

이것은 이렇게 쓰여져야 합니다.

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

...

}

실행 시간의 효율성을 높이기 위해서 암묵적인 변수 할당은 하지 않는 것이 좋습ㄴ다.

이것은 컴파일러가 하는 작업입니다.

예를 들면,

d = (a = b +c) +r; // 피해야 합니다!!

이것은 이렇게 쓰여져야 합니다.

a = b + c;

d = a + r;

 

10.5 다양한 실제

 

10.5.1 소괄호("(" ")")

여러가지 복잡한 연산자가 나오는 구문에서 연산자가 반복되는 것이 괜찮은 경우라

할지라도  연산자의 반복을 막기 위해서 소괄호를 자유롭게 사용하는 것은 좋은 생각입니다.

 

if (a == b && c == d)                     // 피해야 합니다.

if ((a == b) && (c == d))   // 올바른 표현입니다.

 

10.5.2 값을 돌려 받기

 

당신의 프로그램의 구조가 인덴트에 맞게 만들려고 노력하십시오. 예를 들면,

if (booleanExpression) {

return true;

} else {

return false;

}

은 이렇게 쓰여져야 합니다.

return booleanExpression;

비슷한 경우로,

if (condition) {

return x;

}

return y;

는 이렇게 쓰여져야 합니다.

return (condition ? x : y);

 

10.5.3 조건문에서 ?앞에 붙는 표현들

 

만약 조건문이 ?: 연산자 안에 있는 ?앞에 이진수 연산자가 존재한다면 소괄호로 묶어야 한다.

예를 들면,

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

 

10.5.4 특수한 주석들

 

약간 의심이 가지만 작동되는 구문이라고 주석을 달 때는 XXX를 사용합니다.

의심이 되고 작동이 되지 않는 구문이라고 주석을 달 때는 FIXME라고 주석을 붙입니다.

 

 

 

11. 코드 예제

 

 

11.1 자바 소스파일 예문

 

다음의 코드 예문은 자바 소스 파일이 하나의 public 클래스를 어떻게 포함하고

있는지를 잘 보여준다. 인터페이스 역시 비슷한 형식으로 되어있다. 더 많은 정보를

원한다면 앞에 있는 "클래스와 인터페이스 선언" "문서형

주석(Documentation comment)달기"를 참고하라.

 

/*

 * @(#)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;

 

/**

 * Class description goes here.

 *

 * @version       1.82 18 Mar 1999

 * @author         Firstname Lastname

 */

public class Blah extends SomeClass {

    /* A class implementation comment can go here. */

 

    /** classVar1 documentation comment */

    public static int classVar1;

 

    /**

     * classVar2 documentation comment that happens to be

     * more than one line long

     */

    private static Object classVar2;

 

    /** instanceVar1 documentation comment */

    public Object instanceVar1;

 

    /** instanceVar2 documentation comment */

    protected int instanceVar2;

 

    /** instanceVar3 documentation comment */

    private Object[] instanceVar3;

 

    /**

     * ...constructor Blah documentation comment...

     */

    public Blah() {

        // ...implementation goes here...

    }

 

    /**

     * ...method doSomething documentation comment...

     */

    public void doSomething() {

        // ...implementation goes here...

    }

 

    /**

     * ...method doSomethingElse documentation comment...

     * @param someParam description

     */

    public void doSomethingElse(Object someParam) {

        // ...implementation goes here...

    }

}

출처 : Tong - 라제폰님의 JAVA / JSP / ASP통