JAVA/Effective Java

[아이템 68] 일반적으로 통용되는 명명 규칙을 따르라

꾸준함. 2024. 3. 20. 07:57

자바 플랫폼은 명명 규칙이 잘 정립되어 있으며 그중 많은 것이 자바 언어 명세에 기술되어 있습니다.

 

https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html

 

Chapter 6. Names

class Test { static int v; static final int f = 3; public static void main(String[] args) { int i; i = 1; v = 2; f = 33; // compile-time error System.out.println(i + " " + v + " " + f); } } In this program, the names used as the left-hand-sides in the assi

docs.oracle.com

 

자바의 명명 규칙은 크게 철자와 문법, 두 범주로 나뉩니다.

  • 철자 규칙은 패키지, 클래스, 인터페이스, 메서드, 필드, 타입 변수의 이름을 다루며 이들은 특별한 이유가 없는 한 반드시 따라야 함
    • 위 규칙을 어긴 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을 흔히 사용

 

정리

  • 표준 명명 규칙을 자연스럽게 사용하도록 습관화하자
  • 철자 규칙은 직관적이라 모호한 부분이 적지만, 문법 규칙은 더 복잡하고 느슨함
  • 회사 내 코딩 컨벤션과 이전에 언급한 규칙이 충돌할 때는 어떤 규칙에도 고집하지 말고 상식적으로 명명하자

 

참고

이펙티브 자바

반응형