Code Convention은 여러가지 이유에서 프로그래머에게 중요하다.
변수명, 클래스명, 메소드명 등에는 영어와 숫자만을 사용한다.
상수에는 단어 사이의 구분을 위해 언더스코어(_)를 사용한다.
식별자의 이름을 한글 발음을 영어로 옮겨서 표기하지 않는다. 한국어 고유명사는 예외이다.
intangibleAssets
(무형자산)moohyungJasan
(무형자산)클래스명, 변수명에 쓰일 단어 중 모든 글자를 대문자로 표기할 약어의 목록을 프로젝트별로 명시적으로 정의한다.
약어의 대소문자 표기는 JDK의 클래스나 라이브러리들 사이에서도 일관된 규칙이 없다. 그러나 단일 프로젝트에서 규칙이 명확하지 않으면 같은 단어의 조합을 다른 이름으로 표기할 수 있어서 혼동을 유발한다.
그래서 기본 정책으로는 약어의 중간단어를 소문자로 표기하고 프로젝트별로 모두 대문자로 표기할 약어의 목록을 명시하는 방식이 가독성을 높이고 규칙을 단순화하는데 유리하다.
HttpApiUrl
HttpAPIUrl
HTTPAPIURL
패키지 이름은 소문자를 사용하여 작성한다.
단어별 구문을 위해 언더스코어(_)나 대문자를 섞지 않는다.
package com.javastudy.thirdassignment
package com.javastudy.thirdAssignment
package com.javastudy.third_assignment
클래스 이름은 단어의 첫 글자를 대문자로 시작하는 대문자 카멜표기법(Upper camel case)을 사용한다. 파스칼표기법(Pascal case)으로도 불린다.
public class Reservation
public class AccessToken
public class reservation
public class Accesstoken
클래스 이름은 명사나 명사절로 짓는다.
인터페이스의 이름은 명사/명사절로 혹은 형용사/형용사절로 짓는다.
public interface RowMapper {
public interface AutoClosable {
JUnit 등으로 작성한 테스트 코드를 담은 클래스는 'Test'을 마지막에 붙인다.
public class WatcherTest {
메소드의 이름에는 첫 번째 단어를 소문자로 작성하고, 이어지는 단어의 첫 글자를 대문자로 작성하는 소문자 카멜표기법(Lower camel case)를 사용한다.
테스트 클래스의 메소드 이름에서는 언더스코어(_)를 허용한다.
메소드명은 기본적으로는 동사로 시작한다. 다른 타입으로 전환하는 메소드나 빌더 패턴을 구현한 클래스의 메소드에는 전치사를 쓸 수 있다.
renderHtml()
toString()
withUserId(String id)
반환값이 고정되어있는 메소드명
- is~ : boolean 타입 리턴
- has~ : boolean 타입 리턴
- contain~ : boolean 타입 리턴
- validate~ : 리턴값 없음
상태를 가지지 않는 자료형이면서 static final
로 선언되어 있는 필드일 때를 상수로 간주한다.
상수 이름은 대문자로 작성하며, 복합어는 언더스코어(_)를 사용하여 구분한다.
public final int UNLIMITED = -1;
public final String POSTAL_CODE_EXPRESSION = "POST";
상수가 아닌 클래스의 멤버변수/지역변수/메소드 파라미터에는 소문자 카멜표기법(Lower camel case)을 사용한다.
private boolean authorized;
private int accessToken;
private boolean Authorized;
private int AccessToken;
메소드 블럭 범위 이상의 생명 주기를 가지는 변수에는 1글자로 된 이름을 쓰지 않는다.
반복문의 인덱스나 람다 표현식의 파라미터 등 짧은 범위의 임시 변수에는 관례적으로 1글자 변수명을 사용할 수 있다.
HtmlParser parser = new HtmlParser();
HtmlParser p = new HtmlParser();
탑레벨 클래스는 소스파일에 1개만 존재해야 한다.
굳이 한 파일 안에 선언해야 한다면 내부 클래스로 선언한다.
클래스를 import할 때는 와일드카드(*)없이 모든 클래스명을 다 쓴다.
static import에서는 와일드카드를 허용한다.
클래스/메소드/멤버변수의 제한자는 Java Language Specification에서 명시한 아래의 순서로 쓴다.
public protected private abstract static final transient volatile synchronized native strictfp
클래스, 인터페이스, 메소드, 생성자에 붙는 애너테이션은 선언 후 새줄을 사용한다. 이 위치에서도 파라미터가 없는 애너테이션 1개는 같은 줄에 선언할 수 있다.
@RequestMapping("/guests")
public void findGuests() {}
@Override public void destroy() {}
문장이 끝나는 ;
뒤에는 새 줄을 삽입한다.
변수 선언문은 한 문장에서 하나의 변수만을 다룬다.
배열 선언에 오는 대괄호([])는 타입의 바로 뒤에 붙인다. 변수명 뒤에 붙이지 않는다.
long형의 숫자에는 마지막에 대문자'L'을 붙인다.
\b
, \f
, \n
, \r
, \t
, \
, \\
와 같이 특별히 정의된 선언 방식이 있는 특수 문자가 있다. 이런 문자들은 숫자를 이용한 \008
이나 \u008
와 같은 숫자를 넣은 선언보다 전용 방식을 활용한다.
System.out.println("---\n---");
System.out.println("---\012---");
탭(tab) 문자를 사용하여 들여쓴다. 탭 대신 스페이스를 사용하지 않는다.
1개의 탭의 크기는 스페이스 4개와 같도록 에디터에서 설정한다.
클래스, 메소드, 제어문 등의 코드 블록이 생길 때마다 1단계를 더 들여쓴다.
클래스 선언, 메소드 선언, 조건/반복문 등의 코드 블록을 감싸는 중괄호에 적용되는 규칙이다. 중괄호 선언은 K&R 스타일(Kernighan and Ritchie style)을 따른다.
줄의 마지막에서 시작 중괄호 '{'를 쓰고 열고 새 줄을 삽입한다. 블록을 마친 후에는 새 줄 삽입 후 중괄호를 닫는다.
아래의 키워드는 닫는 중괄호 (})와 같은 줄에 쓴다.
내용이 없는 블록을 선언할 때에는 같은 줄에서 중괄호 닫는 것을 허용한다.
조건, 반복문이 한 줄로 끝나더라도 중괄호를 활용한다.
최대 줄 사용 너비는 120자까지 가능하다.
package
, ìmport
선언문 중간에서는 줄을 바꾸지 않는다. 최대 줄 수를 초과하더라도 한 줄로 쓴다.
줄바꿈 이후 이어지는 줄에서는 최초 시작한 줄에서보다 적어도 1단계의 들여쓰기를 더 추가한다.
AbstractAggregateRootTest.AggregateRoot proxyAggregateRoot =
em.getReference(AbstractAggregateRootTest.AggregateRoot.class, aggregateRoot.getId());
가독성을 위해 줄을 바꾸는 위치는 다음 중 하나로 한다.
extend
선언 후implements
선언 후throws
선언 후instanceof
package를 선언한 후 빈 줄을 삽입한다.
import 구절은 아래와 같은 순서로 그룹을 묶어서 선언한다.
static imports
java.
javax.
org.
net.
com.*
com.nhncorp.
com.navrcorp.
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;
메소드의 선언이 끝난 후 메소드 선언이 시작되기 전에 빈 줄을 삽입한다.
빈 줄을 포함하여 모든 줄은 탭이나 공백으로 끝내지 않는다.
닫는 대괄호(]) 뒤에 ';'으로 문장이 끝나지 않고 다른 선언이 올 경우 공백을 삽입한다.
여는 중괄호({) 앞에는 공백을 삽입한다.
닫는 중괄호(}) 뒤에 else
, catch
등의 키워드가 있을 경우 중괄호와 키워드 사이에 공백을 삽입한다.
if
, for
, while
, catch
, synchronized
, switch
와 같은 제어문 키워드의 뒤에 소괄호(())를 선언하는 경우, 시작 소괄호 앞에 공백을 삽입한다.
식별자와 여는 소괄호(() 사이에는 공백을 삽입하지 않는다. 생성자와 메소드의 선언, 호출, 애너테이션 선언 뒤에 쓰이는 소괄호가 그에 해당한다.
public StringProcessor() {} // 생성자
@Cached("local")
public String removeEndingDot(String original) {
assertNotNull(original);
...
}
public StringProcessor () {} // 생성자
@Cached ("local")
public String removeEndingDot (String original) {
assertNotNull (original);
...
}
타입캐스팅을 위해 선언한 소괄호의 내부에는 공백을 삽입하지 않는다.
제네릭스(Generics) 선언에 쓰이는 산괄호(<>) 주위의 공백은 다음과 같이 처리한다.
<
앞에 공백을 삽입한다.<
뒤에 공백을 삽입하지 않는다.>
앞에 공백을 삽입하지 않는다.>
뒤에 공백을 삽입한다.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); // 메서드 이름이 바로 이어질 때
}
콤마(,), 반복문(while, for)의 구분자로 쓰이는 세미콜론(;) 뒤에만 공백을 삽입한다.
반복문과 삼항연산자에서는 콜론(:)의 앞 뒤에는 공백을 삽입한다. 라벨 선언 뒤에는 아무런 문자열이 없으므로 앞에만 공백을 삽입한다.
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)
}
}
이항/삼항 연산자의 앞 뒤에는 공백을 삽입한다.
f (pattern == Access.ABNORMAL) {
return 0;
}
finalScore += weight * rawScore - absentCount;
if (finalScore > MAX_LIMIT) {
return MAX_LIMIT;
}
단항 연산자와 연산 대상의 사이에는 공백을 삽입하지 않는다.
주석의 전후에는 아래와 같이 공백을 삽입한다.
//
앞//
뒤/*
뒤*/
앞참고 : 캠퍼스 핵데이 Java 코딩 컨벤션