자바코드의 컨벤션의 필요성을 알게 되어 내용을 정리하고자 글을 쓰게 되었습니다.
Google Java Style Guide 번역본이 잘 되어있기 때문에 모든 내용을 정리하기 보다는 필요한 부분들을 추가하는 방식으로 복습하며 익히고자 합니다.
'클래스'라는 용어는 "일반 "클래스, enum 클래스, 인터페이스, 어노테이션(@interface)을 모두 지칭한다.
멤버(클래스의)라는 용어는 중첩클래스, 필드, 메소드, 생성자를 포함한다. 즉. 생성자와 주석을 제외한 클래스의 최상위 내용들을 말한다.
주석은 항상 구현한 주석을 말한다. 우리는 "documentation comments" 대신에 "Javadoc"이라는 용어를 사용한다.
static이든 아니든, 와일드카드(*)를 이용한 임포트는 사용하지 않는다.
임포트 구문은 다음과 같이 표현된다.
한 블럭에 static 임포트를 포함
한 블럭에 non-static 임포트를 포함
static import, non-static import가 둘 다 있는 경우 한개의 빈 줄로 두 블록을 구분한다.
import문들 사이에서 위의 경우 이외의 빈 줄은 없다.
static 중첩 클래스에서는 static import가 사용되지 않는다.
일반적 import로 사용된다.
클래스가 여러개의 생성자를 가지거나, 같은 이름의 여러개의 메소드를 가진다면, 이들은 순차적으로 작성되어야 한다.
중간에 다른 코드가 끼어 있으면 안된다.(private 로 선언된 멤버라도
새 블록이나 block-like construct가 열릴 때 마다 두번의 스페이스가 들여쓰기된다. 블록이 끝나면 이전의 들여쓰기 레벨로 돌아간다.

줄 바꿈을 할 때, 적어도 원래 줄에서 +4의 스페이스만큼 들여쓰기를 한다.
선택적 그룹핑 괄호는 코드 작성자와 리뷰어가 괄호를 생략해도 잘못 해석될 가능성이 없고, 더 쉽게 읽을 수 있다고 동의할 때 생략가능하다. 모든 독자가 자바의 연산자 우선순위 테이블을 모두 알고 있다고 가정하는 것은 합리적이지 않다.
따라서 연산자 우선순위가 명확하더라도 그룹을 짓는 괄호를 하는 것을 추천한다.
public class MyClass {
// 수직공백
public void run() {
int a = 0;
int b = 0;
// 그룹화
{
a += 10;
a -= 5;
System.out.println(a);
}
// 그룹화
{
b += 62;
b -= 3;
System.out.println(b);
}
}
}
대괄호는 변수형에 붙인다. C처럼 변수명에 붙이지 않는다.
String[] args // 허용
String args[] // 안됨
long 형 변수는 대문자 L을 접미어로 사용한다. 숫자 자릿수 1과 혼동되지 않게 하기 위해 소문자는 절대로 사용하지 않는다.
3000000000L // 허용
3000000000l //안됨
패키지 이름은 모두 소문자로 이루어진다.
_를 쓰지 않으며, 단순히 단어들이 연속으로 쓰여진 형태이다.
com.example.deepspace // 가능
com.example.deepSpace // 불가
com.example.deep_space // 불가
클래스 이름은 UpperCamelCase로 작성된다.
클래스 이름은 명사 또는 명사구 이다. (예를 들어 Character, ImmutableList)
인터페이스 이름도 명사 또는 명사구이다. 하지만 간혹 형용사 또는 형용사구가 대신할 수 있다.(예를 들어 Readable)
어노테이션 타입은 특별한 규칙이나 널리 알려진 규칙은 없다.
테스트 클래스는 테스트하는 클래스의 이름이 앞에 오고, 뒤에 Test로 마무리한다. (예를 들어 HashTest, HashIntegerationTest)
메소드 이름은 lowerCamelCase로 작성된다.
메소드는 동사 또는 동사구이다. (sendMessage, stop)
JUnit의 테스트에서는 논리적인 컴포넌트로 분리시키기 위해 밑줄(_)이 나올 수 있다. 각 컴포넌트의 이름은 lowerCamelCase여야 한다.
하나의 전형적인 패턴은 _이다. (예를 들어 pop_emptyStack)
테스트 메소드의 이름을 짓는 정해진 답은 없다.
상수는 모두 대문자이다. 각 단어는 밑줄(_)로 구분된다.(SEND_MESSAGE)
상수란 정확히 무엇인가?
상수는 static final 키워드로 정의된 필드이다. 이 필드의 내용은 불변하며, 메소드는 부작용이 있으면 안된다. 이는 원시 자료형, String, 불변 타입, 불변 타입의 불변 collection을 포함한다. 만약 어떤 인스튼스의 상태가 바뀔 수 있다면 이는 상수가 아니다.
그렇지만 단지 절대 변하지 않는 객체로 표현하는 것은 충분하지 않다.
// 상수
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final ImmutableMap<String, Integer> AGES = ImmutableMap.of("Ed", 35, "Ann", 32);
static final Joiner COMMA_JOINER = Joiner.on(','); // Joiner가 불변이기 때문
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }
// 상수 아님
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final ImmutableMap<String, SomeMutableType> mutableValues =
ImmutableMap.of("Ed", mutableInstance, "Ann", mutableInstance2);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
상수가 아닌 필드는 (static이던 아니던) lowerCamelCase로 작성한다.
상수가 아닌 필드는 명사 또는 명사구이다. (예를 들면 computedValues, index)
매개변수의 이름은 lowerCamelCase로 작성한다.
public 메소드에서 한 문자로 된 파라미터 네이밍은 피해야 한다.
지역변수는 lowerCamelCase로 작성한다.
final이나 불변인 지역변수는 상수로 생각되어선 안된다. 따라서 상수 스타일로 네이밍하면 안된다.
각 타입 변수는 아래 둘 중 하나의 방법으로 이름을 짓는다.
@Override 어노테이션을 사용할 수 있는 메소드 마다 붙인다. 이는 슈퍼클래스의 메소드를 오버라이딩하고 있음을 표현하거나, 클래스 메소드가 인터페이스 메소드를 구현하고 있음을 표현하거나, 인터페이스 메소드가 슈퍼인터페이스 메소드를 재구현하고 있음을 표현한다.
static 클래스 멤버로의 참조는 사용 할 수 있다는 자격이 있어야 하는데, 클래스의 이름으로 자격을 증명한다. 클래스 타입이나 인스턴스 참조가 아니다.