티스토리 뷰

이펙티브 자바 Effective Java 2/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이병준역
출판 : 인사이트 2014.09.01
상세보기


자바 플랫폼에는 작명 관습(naming convention)이 잘 정립되어 있으며, 그 중 상당수는 자바 언어 명세(The Java Language Specification)에도 언급되어 있다. 간단하게 말해서 자바의 작명 관습은 두 가지 범주로 나눌 수 있다. 철자에 관한 것이 하나고, 문법에 관한 것이 하나다.

철자에 관계된 작명 관습은 패키지, 클래스, 인터페이스, 메서드, 필드 그리고 자료형 변수에 관한 것으로, 그 양이 얼마 되지 않는다. 아주 그럴듯한 이유가 없이 이 규칙을 어겨서는 안된다.

패키지 이름은 마침표를 구분점으로 사용하는 계층적 이름이어야 한다. 패키지 이름을 구성하는 각각의 컴포넌트는 알파벳 소문자로 구성하고, 숫자는 거의 사용하지 않는다. 여러분의 조직 바깥에서 이용될 패키지 이름은 해당 조직의 인터넷 도메인 이름으로 시작해야 하는데 com.sun, gov.sna 처럼 최상위 도메인 이름이 먼저 온다. 패키지 이름의 나머지 부분은 어떤 패키지인지 설명하는 하나 이상의 컴포넌트로 구성된다. 패키지명 컴포넌트는 짧아야 하며, 보통 여덟 문자 이하로 만들어진다. 의미가 확실한 약어를 활용하면 더 좋다.(utilities 대신 util이라고 하면 좋다)

enum이나 어노테이션 자료형 이름을 비롯, 클래스나 인터페이스 이름은 하나 이상의 단어로 구성된다. 각 단어의 첫 글자는 대문자다. TimerFutureTask가 그 예다. 두문자 또는 max나 min처럼 널리 쓰이는 약어를 제외하면 약어 사용은 피해야 한다. 두문자의 경우 전부 대문자로 써야하는지, 아니면 그 첫 글자만 대문자로 써야 하는지에 대해서는 합의된 것이 별로 없다.

메서드와 필드이름은 클래스나 인터페이스 이름과 동일한 철자 규칙을 따른다. 다만 첫 글자는 소문자로 한다. removeensureCapacity 등이 그 예다.

앞서 살펴본 규칙의 유일한 예는 상수 필드(constant field)의 이름을 지을때다. 상수 필드의 이름은 하나 이상의 대문자 단어로 구성되며, 단어 사이에는 밑줄 기호(_)를 둔다. VALUESNEGATIVE_INFINITY가 그 예다.

지역 변수 이름은 멤버 이름과 같은 철자 규칙을 따르는데, 약어가 허용된다는 것만 다르다.

자료형 인자의 이름은 보통 하나의 대문자다. 가장 널리 쓰이는 것은 다섯 가지로, 임의 자료형인 경우엔 T, 컬렉션 요소 자료형인 경우에는 E, 맵의 키와 값에 대해서는 각각 K와 V, 예외인 경우에는 X를 사용한다. 임의 자료형이 연속되는 경우에는 T, U, V 처럼하거나 T1, T2, T3처럼 나열한다.

식별자 자료형 예제
패키지 com.google.inject, org.joda.time.format
클래스나 인터페이스 Timer, FutureTask, LinkedHashMap, HttpServlet
메서드나 필드 remove, ensureCapacity, getCrc
상수 필드 MIN_VALUE, NEGATIVE_INFINITY
지역 변수 i, xref, houseNumber
지료형 인자 T, E, K, V, X, T1, T2

문법적(grammatical) 작명 관습은 더 가변적일 뿐만 아니라, 철자 관습에 비해 논쟁의 여지가 많다.

enum 자료형을 비롯한 클래스에는 단수형의 명사나 명사구(noun phrase) 가 이름으로 붙는다. Timer, BufferedWriter, ChessPiece 등이 그 예다.

인터페이스도 클래스와 비슷한 작명 규칙을 따른다. able이나 ible 같은 형용사격 어미가 붙기도 한다. Collection, Comparator, Iterable, Accessible 등이 그 예다.

어떤 동작을 수행하는 메서드는 일반적으로 동사나 동사구(목적어 포함)를 이름으로 갖는다. append나 drawImage 등이 그 예다.

boolean 값을 반환하는 메서드의 이름은 보통 is, 드물게는 has로 시작하고 그 뒤에는 명사나 명사구 또는 형용사나 형용사구가 붙는다. isDigit, isProbablePrime, isEmpty, hasSiblings 등이 그 예다.

boolean 이외의 기능이나 객체 속성을 반환하는 메서드에는 보통 명사나 명사구 또는 get으로 시작하는 동사구를 이름으로 붙인다. size, hashCode, getTime 등이 그런 이름이다. 빈(bean) 클래스에 속한 메서드의 이름은 반드시 get으로 시작해야 한다.

특별히 주의해야 하는 메서드 이름도 있다. 객체의 자료형을 변환하는 메서드, 다른 자료형의 독립적 객체를 반환하는 메서드에는 보통 toType 형태의 이름을 붙인다. toString, toArray 같은 이름이 그 예다.

인자로 전달받은 객체와 다른 자료형의 뷰(view) 객체를 반환하는 메서드(규칙5)에는 asType 형태의 이름을 붙인다. asList 같은 이름이 그 예다.

정적 팩터리 메서드에는 valueOf, of, getInstance, newInstance, getType, newType 같은 이름을 붙인다.(규칙1)

요약

요약하자면, 표준적 작명 관습을 내면화시키고 마치 제2의 천성인 것처럼 사용하라는 것이다. 철자 관습은 직관적이고 모호한 부분도 멸로 없다. 반면 문법적 관습은 좀 더 복잡하고 느슨하다.

댓글