티스토리 뷰

JAVA

Java 코딩 컨벤션

김남김 2023. 10. 13. 23:48

 

 

클린코드 책을 읽으면서 어떻게 코드를 더 가독성있게 짤 수 있을까 고민했지만, 
정작 코드 컨벤션은 주의 깊게 찾아보지 않았다. (아마 IDE에서 알아서 짜주기에 별 크게 신경을 쓰지 않았던 것도 있다) 

그래서 이번을 기회로 의외(?)로 몰랐던 자바 코딩 컨벤션만 찾아 기록하고자 한다.

(나머지는 습관화되어 적지 않았으니, https://naver.github.io/hackday-conventions-java/ 을 참고)

 

 


 

선언


식별자의 이름을 한글 발음을 영어로 옮겨서 표기하지 않는다. 한국어 고유명사는 예외이다.

  • 나쁜 예 : moohyungJasan (무형자산)
  • 좋은 예 : intangibleAssets (무형자산)

 

 

패키지 이름은 소문자로 구성하며, 단어별 구문을 위해 언더스코어(_)나 대문자를 섞지 않는다.

  • 나쁜 예 :  package com.apiGateway , package com.api_gateway
  • 좋은 예 :  package com.apigateway

 

인터페이스(interface)의 이름은 클래스 이름은 명사/명사절로 혹은 형용사/형용사절로 짓는다.

  • 좋은 예 : RowMapper, AutoClosable 

 

JUnit 등으로 작성한 테스트 코드를 담은 클래스는 'Test’을 마지막에 붙인다.

  • 좋은 예 : MemberTest  
 

메서드명은 기본적으로는 동사로 시작한다.

다른 타입으로 전환하는 메서드나 빌더 패턴을 구현한 클래스의 메서드에는 전치사를 쓸 수 있다.

  • 좋은 예 : 
    • 동사  renderHtml() 
    • 전환메서드의 전치사  toString()
    • Builder 패턴 적용한 클래스의 메서드의 전치사  withUserId(String id)

 

상태를 가지지 않는 자료형이면서 static final`로 선언되어 있는 필드일 때를 상수로 간주한다. 상수 이름은 대문자로 작성하며, 복합어는 언더스코어(`_)를 사용하여 단어를 구분한다.

  • 좋은 예 :  private final String POSTAL_CODE_EXPRESSION = "POST";

 

탑레벨 클래스(Top level class)는 소스 파일에 1개만 존재해야 한다. 

나쁜 예 : 
public class LogParser {
}

class LogType {
}
 

좋은 예 :

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

클래스를 import할때는 와일드카드(*) 없이 모든 클래스명을 다 쓴다.

static import에서는 와일드카드를 허용한다.

  • 좋은 예 : import java.util.ArrayList; 

 

long형의 숫자에는 마지막에 대문자 'L’을 붙인다. 소문자 'l’보다 숫자 '1’과의 차이가 커서 가독성이 높아진다.

  • 나쁜 예 : long base = 54423234211l;
  • 좋은 예 : long base = 54423234211L;

 

 


 

들여쓰기

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

else 
if (line.startWith(WARNING_PREFIX)) {
    return LogPattern.WARN;
} else if (line.startWith(DANGER_PREFIX)) {
    return LogPattern.NORMAL;
} else {
    return LogPattern.NORMAL;
}
try catch
try {
    writeLog();
} catch (IOException ioe) {
    reportFailure(ioe);
} finally {
    writeFooter();
}
while 
do {
    write(line);
    line = readLine();
} while (line != null);

 

 

조건, 반복문이 한 줄로 끝더라도 중괄호를 활용한다. 이 문서에 언급된 중괄호의 전후의 공백, 제어문 앞 뒤의 새줄 규칙도 함께 고려한다.

좋은 예 :
if (exp == null) {
    return false;
}

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

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

}

 


 

줄바꿈

가독성을 위해 줄을 바꾸는 위치는 다음 중의 하나로 한다. 

  • extends 선언 후
  • implements 선언 후
  • throws 선언 후
  • 시작 소괄호(() 선언 후
  • 콤마(,) 후
  • . 전
  • 연산자 전
    • +, -, *, /, %
    • ==, !=, >=, >,⇐, <, &&, ||
    • &, |, ^, >>>, >>, <<, ?
    • instanceof
좋은 예 :
public boolen isAbnormalAccess (
    User user, AccessLog log) {

    String message = user.getId() + "|" | log.getPrefix()
        + "|" + SUFFIX;
}

 


 

빈 줄

 

빈 줄은 명령문 그룹의 영역을 표시하기 위하여 사용한다.

좋은 예 :

package com.naver.lucy.util;

import java.util.Date;

 

import 구절은 아래와 같은 순서로 그룹을 묶어서 선언한다.

import 구절은 아래와 같은 순서로 그룹을 묶어서 선언한다.

  1. static imports
  2. java.
  3. javax.
  4. org.
  5. net.
  6. 8~10을 제외한 com.*
  7. 1~6, 8~10을 제외한 패키지에 있는 클래스
  8. com.nhncorp.
  9. com.navercorp.
  10. com.naver.

 

각 그룹 사이에는 빈줄을 삽입한다. 같은 그룹 내에서는 알파벳 순으로 정렬한다.

좋은 예 :

import java.util.Date;
import java.util.List;

import javax.naming.NamingException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.Assert;

import com.google.common.base.Function;

import com.naver.lucy.util.AnnotationUtils;

 

 

메서드의 선언이 끝난 후 다음 메서드 선언이 시작되기 전에 빈줄을 삽입한다.

좋은 예 :

public void setId(int id) {
    this.id = id;
}

public void setName(String name) {
    this.name = name;
}

 

공백

 

여는 중괄호({) 앞에는 공백을 삽입한다. 닫는 중괄호(}) 뒤에 else ,catch 등의 키워드가 있을 경우 중괄호와 키워드 사이에 공백을 삽입한다.

 

좋은 예 :

public void printWarnMessage(String line) {
    if (line.startsWith(WARN_PREFIX)) {
        ...
    } else {
        ...
    }
}

 

if, for, while, catch, synchronized, switch`와 같은 제어문 키워드의 뒤에

소괄호((,)`)를 선언하는 경우, 시작 소괄호 앞에 공백을 삽입한다.

좋은 예 :

if (maxLine > LIMITED) {
    return false;
}

 

 

식별자와 여는 소괄호(() 사이에는 공백을 삽입하지 않는다. 생성자와 메서드의 선언, 호출, 애너테이션 선언 뒤에 쓰이는 소괄호가 그에 해당한다.

좋은 예 :

public StringProcessor() {} // 생성자

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

 

타입캐스팅을 위해 선언한 소괄호의 내부에는 공백을 삽입하지 않는다.

좋은 예 :

String message = (String)rawLine;
 

 

단항 연산자와 연산 대상의 사이에는 공백을 삽입하지 않는다.

  • 전위 연산자 : 연산자 뒤에 공백을 삽입하지 않는다.
    • 전위 증감/감소 연산자 : ++,--
    • 부호로 쓰이는 +, -
    • NOT 연산자 : ~, !
    • 후위 연산자 : 연산자 앞에 공백을 삽입하지 않는다.
    • 후위 증감/감소 연산자 : ++,--

나쁜 예 :

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

좋은 예 :

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

 

 

'JAVA' 카테고리의 다른 글

모든 객체의 공통 메서드  (1) 2023.12.02
객체의 생성과 파괴  (2) 2023.12.02
자바 습관(올바른 문자열 처리)  (0) 2023.11.29
자바 습관 (기본 프로그래밍)  (0) 2023.11.28
어떻게 협력하는가? (with MVC)  (0) 2023.10.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
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
글 보관함