티스토리 뷰
클린코드 책을 읽으면서 어떻게 코드를 더 가독성있게 짤 수 있을까 고민했지만,
정작 코드 컨벤션은 주의 깊게 찾아보지 않았다. (아마 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 을 선언한다.
if (line.startWith(WARNING_PREFIX)) {
return LogPattern.WARN;
} else if (line.startWith(DANGER_PREFIX)) {
return LogPattern.NORMAL;
} else {
return LogPattern.NORMAL;
}
try {
writeLog();
} catch (IOException ioe) {
reportFailure(ioe);
} finally {
writeFooter();
}
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 구절은 아래와 같은 순서로 그룹을 묶어서 선언한다.
- static imports
- java.
- javax.
- org.
- net.
- 8~10을 제외한 com.*
- 1~6, 8~10을 제외한 패키지에 있는 클래스
- com.nhncorp.
- com.navercorp.
- 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 |