Home Item68 (일반적으로 통용되는 명명규칙을 따르라)
Post
Cancel

Item68 (일반적으로 통용되는 명명규칙을 따르라)

일반적으로 통용되는 명명규칙을 따르라

자바는 명명 규칙이 잘 정립되어 있다. 자바의 명명 규칙은 크게 철자와 문법 두 범주로 나뉜다.

  • 철자 규칙
    • 패키지, 클래스, 인터페이스, 메서드, 필드, 타입 변수의 이름
  • 문법 규칙
    • 자바 문법에 대한 부분 (반복문, 예외 등등)

특별한 이유없이 철자 규칙을 따르지 않아서는 안된다. 규칙을 어긴 API는 사용하기 어렵고, 유지보수 또한 어렵다.

다른 프로그래머들이 그 코드를 읽기 번거롭고 다른 뜻으로 오해할 수도 있어 오류를 발생시킬 수 있다.

철자 규칙

패키지와 모듈 이름

  • 패키지와 모듈 이름은 점(.)으로 구분해 계층적으로 짓는다.
  • 요소들은 모두 소문자 알파벳이다. (드물게 숫자 포함)
  • 인터넷 도메인 이름을 역순으로 사용한다.
    • com.goole, org.eff
  • 표준 라이브러리와 선택적 패키지들은 각각 java와 javax로 시작한다.
  • 패키지 이름의 나머지는 해당 패키지를 설명하는 하나 이상의 요소로 이루어져야 한다.
    • 일반적으로 8자 이하의 짧은 단어 (utilities보다는 util같은 약어 사용 추천)
    • 여러 단어일 경우 awt와 같은 각 단어의 첫 글자를 따서 사용하는 것을 추천
  • 보통 인터넷 도메인 이름 뒤에 요소 하나만 붙인 패키지가 많지만, 많은 기능을 제공하는 경우 계층을 나누어 더 많은 요소로 구성해도 된다.
    • ex) java.util.concurrent.atomic
      • java.util 처럼 많은 기능을 제공하는 경우

클래스와 인터페이스 이름

  • 하나 이상의 단어로 이루어지고, 각 단어는 대문자로 시작한다.
    • 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를 잘 설계할 경우 필드가 노출될 일이 없어 필드 이름은 비교적 덜 중요하다.

정리

표준 명명 규칙을 체화하여 자연스럽게 베어 나오도록 해야한다.

철자 규칙은 직관적이기 때문에 모호한 부분이 적지만, 문법 규칙은 보다 복잡하고 느슨하다.

단, 자바 언어 명세의 말 중 ‘오랫동안 따라온 규칙과 충돌한다면, 그 규칙을 맹종해서는 안된다’ 라는 문구가 있다.

규칙을 무조건 맹종하지 말고 상식이 이끄는 대로 따르도록 하자.

This post is licensed under CC BY 4.0 by the author.

Item67 (최적화는 신중히 하라)

Item69 (예외는 진짜 예외 상황에만 사용하라)