아래의 글은 네이버 캠퍼스 핵데이 Java 코딩 컨벤션을 기준으로 작성된 글입니다.
▶중괄호
K&R 스타일로 중괄호 선언
- 클래스 선언, 메서드 선언, 조건/반복문 등의 코드 블럭을 감싸는 중괄호에 적용되는 규칙이다.
- 중괄호 선언은 K&R 스타일을 따른다.
- 줄의 마지막에서 시작 중괄호를 ‘{’ 를 쓰고 열고 새줄을 삽입한다.
- 블럭을 마친후에는 새줄 삽입 후 중괄호를 닫는다.
- else, catch, finally, while(do while)은 닫는 중괄호와 같은 줄에 선언
//Bad Example
public class SearchConditionParser
{
public boolean isValidExpression(String exp)
{
if (exp == null)
{
return false;
}
for (char ch : exp.toCharArray())
{
....
}
return true;
}
}
//Good Example
public class SearchConditionParser {
public boolean isValidExpression(String exp) {
if (exp == null) {
return false;
}
for (char ch : exp.toCharArray()) {
....
}
return true;
}
}
빈 블럭에 새 줄 없이 중괄호 닫기 허용
- 내용이 없는 블럭을 선언할 때는 같은 줄에서 중괄호를 닫는 것을 허용한ㄷ.ㅏ
조건/반복문에 중괄호 필수 사용
- 조건, 반복문이 한 줄로 끝나더라도 중괄호를 활용한다.
- 이 문서에 언급된 중괄호의 전후의 공백, 제어문 앞 뒤의 새줄 규칙도 함께 고려한다.
//Bad Example
if (exp == null) return false;
for (char ch : exp.toCharArray()) if (ch == 0) return false;
//Good Example
if (exp == null) {
return false;
}
for (char ch : exp.toCharArray()) {
if (ch == 0) {
return false;
}
}
〰️줄바꿈
최대 줄 너비는 120
줄바꿈 후 추가 들여쓰기
- 줄바꿈 이후 이어지는 줄에서는 최초 시작한 줄에서보다 적어도 1단계의 들여쓰기를 더 추가한다.
줄바꿈 허용 위치
- 가독성을 위해 줄을 바꾸는 위치는 다음 중의 하나로 한다.
- extends 선언 후
- implements 선언 후
- throws 선언 후
- 시작 소괄호 ( 선언 후
- 콤마 , 후
- . 전
- 연산자 전
//Good Example
public boolen isAbnormalAccess (
User user, AccessLog log) {
String message = user.getId() + "|" | log.getPrefix()
+ "|" + SUFFIX;
}
📰빈 줄
pakage 선언 후 빈 줄 삽입
//Good Example
package com.naver.lucy.util;
import java.util.Date;
import 선언의 순서와 빈 줄 삽입
- 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.
//Good Example
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;
메소드 사이에 빈 줄 삽입
- 메서드의 선언이 끝난 후 다음 메서드 선언이 시작되기 전에 빈줄을 삽입한다.
🈳공백
공백으로 줄을 끝내지 않음
- 빈 줄을 포함하여 모든 줄은 탭이나 공백으로 끝내지 않는다.
중괄호의 시작 전, 종료 후에 공백 삽입
- 여는 중괄호 { 앞에는 공백을 삽입한다. 닫는 중괄호 } 뒤에 else, catch 등의 키워드가 있을 경우 중괄호와 키워드 사이에 공백을 삽입한다.
//Good Example
public void printWarnMessage(String line) {
if (line.startsWith(WARN_PREFIX)) {
...
} else {
...
}
}
제어문 키워드와 여는 소괄호 사이에 공백 삽입
- if, for, while, catch, synchronized, switch 와 같은 제어문 키워드의 뒤에 소괄호 (, ) 를 선언하는 경우, 시작 소괄호 앞에 공백을 삽입한다.
//Good Example
if (maxLine > LIMITED) {
return false;
}
식별자와 여는 소괄호 사이에 공백 미삽입
- 식별자와 여는 소괄호 사이에는 공백을 삽입하지 않는다.
- 생성자와 메서드의 선언, 호출, 에너테이션 선언 뒤에 쓰이는 소괄호가 그에 해당한다.
제네릭스 산괄호의 공백 규칙
- 제네릭스 선언에 쓰이는 산괄호 주위의 공백은 다음과 같이 처리한다.
- 제네릭스 메서드 선언 일 때만 앞에 공백을 삽입한다.<
- < 뒤에 공백을 삽입하지 않는다.
- > 앞에 공백을 삽입하지 않는다.
- 아래의 경우를 제외하고는 `>`뒤에 공백을 삽입한다.
- 메서드 레퍼런스가 바로 이어질 때
- 여는 소괄호('(')가 바로 이어질 때
- 메서드 이름이 바로 이어질 때
public static <A extends Annotation> A find(AnnotatedElement elem, Class<A> type) { // 제네릭스 메서드 선언
List<Integer> l1 = new ArrayList<>(); // '(' 가 바로 이어질때
List<String> l2 = ImmutableList.Builder<String>::new; // 메서드 레퍼런스가 바로 이어질 때
int diff = Util.<Integer, String>compare(l1, l2); // 메서드 이름이 바로 이어질 때
}
콜론의 앞 뒤에 공백 삽입
- 반복문과 삼항 연산자에서 콜론의 앞 뒤에는 공백을 삽입한다.
- 라벨 선언 뒤에는 아무런 문자열의 없으므로 앞에만 공백을 삽입한다.
//Good Example
for (Customer customer : visitedCustomers) {
AccessPattern pattern = isAbnormal(accessLog) ? AccessPattern.ABUSE : AccessPattern.NORMAL;
int grade = evaluate(customer, pattern);
switch (grade) {
case GOLD :
sendSms(customer);
case SILVER :
sendEmail(customer);
default :
inreasePoint(customer)
}
}
주석문 기호 전후의 공백 삽입
- 주석의 전 후에는 아래와 같이 공백을 삽입한다.
- 명령문과 같은 줄에 주석을 붙일 때 // 앞
- 주석 시작 기호 // 뒤
- 주석 시작 기호 /* 뒤
- 블록 주석을 한 줄로 작성시 종료 기호 */ 앞
//Good Example
/*
* 공백 후 주석내용 시작
*/
System.out.print(true); // 주석 기호 앞 뒤로 공백
/* 주석내용 앞에 공백, 뒤에도 공백 */