Java

Java Style Guide

밍 석 2022. 12. 13. 07:36

Java Style Guide

패키지 이름은 소문자로 구성

나쁜 예시

package com.navercorp.apiGateway


package com.navercorp.api_gateway

좋은 예시

package com.navercorp.apigateway



소스파일당 1개의 탑레벨 클래스를 담기

나쁜 예시

public class LogParser {
}

class LogType {
}

좋은 예시

public class LogParser {
    // 굳이 한 파일안에 선언해야 한다면 내부 클래스로 선언
    class LogType {
    }
}



static import에만 와일드 카드 허용

나쁜 예시

import java.util.*;

좋은 예시

import java.util.List;
import java.util.ArrayList;



상수는 대문자와 언더스코어로 구성

public final int UNLIMITED = -1;
public final String POSTAL_CODE_EXPRESSION = “POST”;



변수에 소문자 카멜표기법 적용

나쁜 예시

private boolean Authorized;
private int AccessToken;

좋은 예시

private boolean authorized;
private int accessToken;



한 줄에 한 문장

나쁜 예시

int base = 0; int weight = 2;

좋은 예시

int base = 0;
int weight = 2;



중괄호

생략 가능하더라도 중괄호를 사용해야 한다.

 

나쁜 예시

if (sum > 0)
    return sum;
else
    return -1;

좋은 예시

if (sum > 0) {
    return sum;
}
else {
    return -1;
}

 

추가적인 코드 예시

// 가능하다
if (condition) {
    body();
}


// 나름 허용한다.
if (condition) body();


// 이건 허용하지 않는다.
if (condition)
    body(); 



K&R 스타일로 중괄호 선언

나쁜 예시

public class SearchConditionParser
{
    public boolean isValidExpression(String exp)
    {

        if (exp == null)
        {
            return false;
        }

        for (char ch : exp.toCharArray())
        {
             ....
        }

        return true;
    }
}

좋은 예시

public class SearchConditionParser {
    public boolean isValidExpression(String exp) {

        if (exp == null) {
            return false;
        }

        for (char ch : exp.toCharArray()) {
            ....
        }

        return true;
    }
}



닫는 중괄호와 같은 줄에 else, catch, finally, while 선언

ex1) 나쁜 예시

if (line.startWith(WARNING_PREFIX)) {
    return LogPattern.WARN;
}
else if (line.startWith(DANGER_PREFIX)) {
    return LogPattern.DANGER;
}
else {
    return LogPattern.NORMAL;
}

ex1) 좋은 예시

if (line.startWith(WARNING_PREFIX)) {
    return LogPattern.WARN;
} else if (line.startWith(DANGER_PREFIX)) {
    return LogPattern.NORMAL;
} else {
    return LogPattern.NORMAL;
}



ex2) 나쁜 예시

try {
    writeLog();
}
catch (IOException ioe) {
    reportFailure(ioe);
}
finally {
    writeFooter();
}

ex2) 좋은 예시

try {
    writeLog();
} catch (IOException ioe) {
    reportFailure(ioe);
} finally {
    writeFooter();
}



ex3) 나쁜 예시

do {
    write(line);
    line = readLine();
}
while (line != null);

ex3) 좋은 예시

do {
    write(line);
    line = readLine();
} while (line != null);



조건/반복문에 중괄호 필수 사용

나쁜 예시

if (exp == null) return false;

for (char ch : exp.toCharArray()) if (ch == 0) return false;

좋은 예시

if (exp == null) {
    return false;
}

for (char ch : exp.toCharArray()) {

    if (ch == 0) {
        return false;
    }

}



식별자와 여는 소괄호 사이에 공백 미삽입

나쁜 예시

public StringProcessor () {} // 생성자

@Cached ("local")
public String removeEndingDot (String original) {
    assertNotNull (original);
    ...
}

좋은 예시

public StringProcessor() {} // 생성자

@Cached("local")
public String removeEndingDot(String original) {
    assertNotNull(original);
    ...
}



타입 캐스팅에 쓰이는 소괄호 내부 공백 미삽입

나쁜 예시

String message = ( String ) rawLine;

좋은 예시

String message = (String)rawLine;



콤마/구분자 세미콜론의 뒤에만 공백 삽입

나쁜 예시

for (int i = 0;i < length;i++) {
    display(level,message,i)
}

좋은 예시

for (int i = 0; i < length; i++) {
    display(level, message, i)
}



단항 연산자와 연산 대상 사이에 공백을 미삽입

나쁜 예시

int point = score[++ index] * rank -- * - 1;

좋은 예시

int point = score[++index] * rank-- * -1;



ASCII 코드 외의 문자

String unitAbbrev = "μs";  - Best

String unitAbbrev = "\u03bcs"; // 최악, 이게 뭔지 알 도리가 없음



빈 블록인 경우

중괄호를 그냥 열고 닫아라.

// 가능
void doNothing() {}


// 가능
void doNothingElse() {
}


// 안됨 (try에는 내용이 있기 때문에)
try {
    doSomething();
} catch (Exception e) {}



공백

private int x; // 괜찮음
private Color color; // 괜찮음

private int   x;      // 해도 되지만, 권장하지 않음
private Color color;  // 괜찮음



그룹화 괄호 : 권장

int n = 5 * 3 + 1 // 가능하지만 별로

int n = (5 * 3) + 1 // 이렇게 사용하자



배열

전부 가능하다.

new int[] {           new int[] {
  0, 1, 2, 3            0,
}                       1,
                        2,
new int[] {             3,
  0, 1,               }
  2, 3
}                     new int[]
                          {0, 1, 2, 3}



숫자 리터럴

long형 숫자의 경우 3000000000l대신 3000000000L 으로 쓴다.

소문자 l은 숫자 1과 헷갈릴 수 있기 때문이다.