일반적으로 통용되는 명명규칙을 따르라
자바는 명명 규칙이 잘 정립되어 있다. 자바의 명명 규칙은 크게 철자와 문법 두 범주로 나뉜다.
- 철자 규칙
- 패키지, 클래스, 인터페이스, 메서드, 필드, 타입 변수의 이름
- 문법 규칙
- 자바 문법에 대한 부분 (반복문, 예외 등등)
특별한 이유없이 철자 규칙을 따르지 않아서는 안된다. 규칙을 어긴 API는 사용하기 어렵고, 유지보수 또한 어렵다.
다른 프로그래머들이 그 코드를 읽기 번거롭고 다른 뜻으로 오해할 수도 있어 오류를 발생시킬 수 있다.
철자 규칙
패키지와 모듈 이름
- 패키지와 모듈 이름은 점(.)으로 구분해 계층적으로 짓는다.
- 요소들은 모두 소문자 알파벳이다. (드물게 숫자 포함)
- 인터넷 도메인 이름을 역순으로 사용한다.
- com.goole, org.eff
- 표준 라이브러리와 선택적 패키지들은 각각 java와 javax로 시작한다.
- 패키지 이름의 나머지는 해당 패키지를 설명하는 하나 이상의 요소로 이루어져야 한다.
- 일반적으로 8자 이하의 짧은 단어 (utilities보다는 util같은 약어 사용 추천)
- 여러 단어일 경우 awt와 같은 각 단어의 첫 글자를 따서 사용하는 것을 추천
- 보통 인터넷 도메인 이름 뒤에 요소 하나만 붙인 패키지가 많지만, 많은 기능을 제공하는 경우 계층을 나누어 더 많은 요소로 구성해도 된다.
- ex) java.util.concurrent.atomic
- java.util 처럼 많은 기능을 제공하는 경우
- ex) java.util.concurrent.atomic
클래스와 인터페이스 이름
- 하나 이상의 단어로 이루어지고, 각 단어는 대문자로 시작한다.
- max, min 처럼 널리 통용되는 줄임말은 허용하나 그 외에 단어를 줄여쓰는 것은 허용하지 않는다.
- 약자의 경우 첫 글자만 대문자로 쓰는 것을 권장한다.
- HttpUrl vs HTTPURL
- HttpUrl이 더 보기 편하다. 각 약자의 시작과 끝이 명확하다.
메서드와 필드 이름
- 첫 글자를 소문자로 쓴다는 점을 제외하고는 클래스 명명 규칙과 동일하다.
- 하지만 상수필드는 예외이다.
- 상수 필드를 구성하는 단어는 모두 대문자를 사용하고 단어 사이는 밑줄로 구분한다.
- 이름과 이름사이 밑줄을 쓰는 경우는 상수가 유일하다.
- 타입이 가변이더라도 가리키는 객체가 불변이라면 상수이다.
- 상수 필드를 구성하는 단어는 모두 대문자를 사용하고 단어 사이는 밑줄로 구분한다.
1
2
public static final List<String> IMMUTABLE_LIST =
Collections.unmodifiableList(List.of("A", "B", "C"));
지역 변수
- 약어 사용이 가능하다.
- 변수가 사용되는 문맥에서 의미가 쉽게 유추 가능하기 때문이다.
- 입력 매개변수 또한 지역변수여서 동일하게 적용 가능하다. 하지만 메서드 설명 문서에 작성해야하므로 신경을 기울여야 한다.
타입 매개변수
- 보통 한 문자로 표현한다.
- 임의의 타입: T (Type)
- 컬렉션 원소의 타입: E (Element)
- 맵의 키와 값: K, V (Key, Value)
- 예외: X (eXeption)
- 메서드 반환 타입: R (Return)
- 그 외 임의 타입 시퀀스: T, U, V
문법 규칙
철자 규칙과 비교해 더 유연해 논란 또한 많다.
패키지에 대한 규칙은 따로 없다.
클래스
- 객체를 생성할 수 있는 클래스(열거 타입 포함)의 이름은 단수 명사나 명사구를 사용한다.
- Thread, PriorityQueue, ChessPiece
- 객체를 생성할 수 없는 클래스 이름은 복수형 명사를 사용한다.
- Collectors, Collections
- 인터페이스 이름은 클래스와 똑같이 짓거나 able 혹은 ible로 끝나는 형용사로 짓는다.
- Collection, Comparator, Runnable, Iterable
- 애너테이션은 다양하기 때문에 지배적인 규칙은 없다.
메서드
- 동작을 수행하는 메서드의 이름은 동사나 동사구를 사용한다.
- append, drawImage
- boolean값을 반환하는 메서드라면 is나 has로 시작하고, 명사나 명사구, 혹은 형용사로 기능하는 아무 단어나 구로 끝나도록 짓는다.
- isDigit, isProbablePrime, isEmpty, isEnabled, hasSiblings
- 반환 타입이 boolean이 아니거나 해당 인스턴스의 속성을 반환하는 메서드의 이름은 보통 명사, 명사구, 혹은 get으로 시작하는 동사구로 짓는다.
- size, hashCode, getTime
get으로 시작하는 형태가 좋다?
이러한 주장들이 있지만, 근거가 부족하다. 오히려 get이 없는 경우 가독성이 좋은 경우가 있다.
1
2
3
if (car.speed() > SPEED_LIMIT) {
generateAudibleAlert("경찰 조심하세요!");
}
특별한 메서드 이름
- 객체의 타입을 바꾸어 다른 타입의 객체로 반환하는 인스턴스 메서드는 보통 toType을 사용한다.
- toString, toArray
- 객체의 내용을 다른 뷰로 보여주는 메서드는 asType을 사용한다.
- asList
- 객체의 값을 기본 타입 값으로 반환하는 메서드의 이름은 보통 typeValue 형태로 짓는다.
- intValue
- 정적 팩토리의 이름
- from, of, valueOf, instance, getInstance, getType 등 다양하다.
- 아이템1 참고
필드 이름
- 클래스, 인터페이스, 메서드에 비해 덜 명확하고 덜 중요하다.
API를 잘 설계할 경우 필드가 노출될 일이 없어 필드 이름은 비교적 덜 중요하다.
정리
표준 명명 규칙을 체화하여 자연스럽게 베어 나오도록 해야한다.
철자 규칙은 직관적이기 때문에 모호한 부분이 적지만, 문법 규칙은 보다 복잡하고 느슨하다.
단, 자바 언어 명세의 말 중 ‘오랫동안 따라온 규칙과 충돌한다면, 그 규칙을 맹종해서는 안된다’ 라는 문구가 있다.
규칙을 무조건 맹종하지 말고 상식이 이끄는 대로 따르도록 하자.