자바 플랫폼은 명명 규칙이 잘 정립되어 있으며 그중 많은 것이 자바 언어 명세에 기술되어 있습니다.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html
자바의 명명 규칙은 크게 철자와 문법, 두 범주로 나뉩니다.
- 철자 규칙은 패키지, 클래스, 인터페이스, 메서드, 필드, 타입 변수의 이름을 다루며 이들은 특별한 이유가 없는 한 반드시 따라야 함
- 위 규칙을 어긴 API는 사용하기 어렵고, 유지보수하기 어려움
- 철자 규칙이나 문법 규칙을 어기면 다른 개발자들이 해당 코드를 읽기 번거로울 뿐 아니라 오역할 수도 있어 오류까지 발생할 수 있음
철자 규칙
1. 패키지
- 패키지와 모듈명은 각 요소를 점(.)으로 구분하여 계층적으로 지음
- 요소들은 모두 소문자 알파벳 혹은 숫자로 이루어짐
- 조직 외부에서도 사용될 패키지라면 조직의 인터넷 도메인 이름을 역순으로 사용
- ex) com.tistory.jaimemin.effectivejava.item68
- 예외: java, javax
- 패키지 이름의 나머지는 해당 패키지를 설명하는 하나 이상의 요소로 이루어짐
- 각 요소는 일반적으로 8자 이하의 짧은 단어
- utilities보다는 util처럼 의미가 통하는 약어를 추천
- 여러 단어로 구성된 이름이라면 awt처럼 각 단어의 첫 글자만 따서 써도 좋음
- awt = Abstract Window Toolkit
- 많은 기능을 제공하는 애플리케이션의 경우 계층을 더 많은 요소 즉, 하위 패키지로 나누는 것을 권장
- ex) java.util.concurrent.atomic.*, java.util.function.*
2. 클래스, 인터페이스, Enum 타입
- 클래스명은 하나 이상의 단어로 구성되며 첫 글자는 대문자로 작성
- 여러 단어의 첫 글자만 딴 약자나 널리 통용되는 줄임말을 제외하고는 줄임말을 쓰지 말자
- 조합한 단어를 구분할 수 있도록 Camel Case로 작성
3. 메서드, 필드명
- 첫 글자를 소문자로 작성하고 클래스명과 같게 단어 별로 Camel Case로 작성
- 첫 단어가 약자라면 단어 전체가 소문자
- ex) AwtFrame은 클래스명이고, 메서드나 필드명에서 사용되는 awt는 약자이므로 소문자
- 지역 변수에도 동일한 규칙 적용
- 문맥에서 의미를 쉽게 유추할 수 있는 경우에는 약어 사용해도 됨
- ex) houseNum, denom, i
- 상수 필드는 static final인 타입을 의미하며 유일하게 Snake Case로 작성
- 상수 필드를 구성하는 단어는 모두 대문자로 쓰며 단어 사이는 _로 구분
- ex) VALUES, NEGATIVE_INFINITY
- 타입 매개변수명은 한 글자로 표현
- T: 임의의 타입 (Type)
- E: 컬렉션의 원소 (Element)
- K: 맵의 키 (Key)
- V: 맵의 값 (Value)
- X: 예외 (eXception)
- R: 메서드의 반환 타입 (Return)
- 그 외 U, V 혹은 T1, T2와 같이 사용
문법 규칙
철자 규칙과 비교하면 더 유연하고 그만큼 논란도 많은 규칙입니다.
- 패키지에 대한 규칙은 별도로 없음
- Enum 타입을 포함하여 객체를 생성할 수 있는 클래스의 이름은 보통 단수 명사나 명사구 사용
- ex) Thread, PriorityQueue, ChessPiece, etc.
- 정적 유틸 클래스와 같이 객체를 생성할 수 없는 클래스에는 보통 복수형 명사 사용
- ex) Collectors, Collections, etc.
- 인터페이스명은 클래스명과 동일하게 짓거나, ible, able로 끝나는 형용사 사용
- ex) Runnable, Iterable, Accessible, etc.
- 어노테이션은 워낙 다양하게 활용되어 지배적인 규칙 없이 명사, 형용사, 동사, 전치사가 두루 쓰임
- ex) @Binding, @Inject, @ImplementsBy, @Singleton, etc.
- 메서드명은 동사나 목적어를 포함한 동사구 사용
- ex) append, drawImage
- boolean 값을 반환하는 메서드는 is, has로 지음
- ex) isDigit, isEmpty, hasSiblings, etc.
- 반환 타입이 boolean이 아닌 경우 보통 명사, 명사구, getXXX로 지음
- get으로 시작하는 형태는 주로 Java Beans 명세에 뿌리를 둠
- 보통 getter/setter의 한 묶음 형태로 만드는 경우가 많음 (getAttribute/setAttribute)
- ex) size, hashcode, getTime, etc.
- 반환 타입을 또 다른 타입으로 반환하는 경우에는 toType의 형태로 지음
- ex) toString, toArray, etc.
- 객체의 내용을 다른 뷰로 보여주는 메서드는 asType의 형태로 지음
- ex) asList, asMap, etc.
- 객체의 값을 기본 타입으로 반환하는 경우에는 typeValue의 형태로 지음
- ex) intValue, longValue, etc.
- 정적팩토리명은 다양하지만 from, of, valueOf, instance, getInstance, newInstance, getType, newType을 흔히 사용
정리
- 표준 명명 규칙을 자연스럽게 사용하도록 습관화하자
- 철자 규칙은 직관적이라 모호한 부분이 적지만, 문법 규칙은 더 복잡하고 느슨함
- 회사 내 코딩 컨벤션과 이전에 언급한 규칙이 충돌할 때는 어떤 규칙에도 고집하지 말고 상식적으로 명명하자
참고
이펙티브 자바
반응형
'JAVA > Effective Java' 카테고리의 다른 글
[아이템 70] 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 (0) | 2024.03.23 |
---|---|
[아이템 69] 예외는 진짜 예외 상황에만 사용하라 (0) | 2024.03.21 |
[아이템 67] 최적화는 신중히 하라 (0) | 2024.03.19 |
[아이템 66] 네이티브 메서드는 신중히 사용하라 (0) | 2024.03.19 |
[아이템 65] 리플렉션보다는 인터페이스를 사용하라 (0) | 2024.03.19 |