본문 바로가기

회고/이펙티브 자바 3판

[ 아이템 51 ] 메서드 시그니처를 신중히 설계하라

반응형

메서드 이름을 신중히 짓자

 

 항상 표준 명명 규칙을 따라야 한다. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선 목표다. 그다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는 것이다. 긴 이름은 피하자. 애매하면 자바 라이브러리 API 가이드를 참고하자

 

편의 메서드를 너무 많이 만들지 말자

 

 모든 메서드는 자신의 소임을 다해야 한다. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 인터페이스도 마찬가지다. 메서드가 너무 많으면 이를 구현하는 사람과 사용하는 사람 모두를 고통스럽게 한다. 확신이 서지 않으면 만들지 말자

 

매개변수 목록은 짧게 유지하자

 

 4개 이하가 좋다. 4개가 넘어가면 매개변수를 전부 기억하기가 쉽지 않다. 같은 타입의 매개변수 여러 개가 연달아 나오는 경우는 특히 해롭다.

 

 과하게 긴 매개변수 목록을 짧게 줄여주는 기술

 1.  여러 메서드로 쪼갠다. 쪼개진 메서드 각각은 원래 매개변수 목록의 부분집합을 받는다. 잘못하면 메서드가 너무 많아질 수도 있지만, 직교성을 높여 오히려 메서드 수를 줄여주는 효과가 있다. java.util.List 인터페이스가 좋은 예다. 리스트에서 주어진 원소의 인덱스를 찾아야 하는데, 전체 리스트가 아니라 지정된 범위의 부분리스트에서의 인덱스를 찾는다고 해보자. 원래는 '부분리스트의 시작', '부분리스트의 끝', '찾을 원소' 3개의 매개변수가 필요하다. 그런데, 주어진 원소의 부분리스트를 반환하는 subList 메서드와 인덱스를 알려주는 indexOf 메서드를 별개로 제공한다. 

 

 2. 매개변수 여러 개를 묶어주는 도우미 클래스를 만든다. 일반적으로는 정적 멤버 클래스로 둔다. 매개변수 몇 개를 독립된 하나의 개념으로 볼 수 있을 때 추천하는 방법이다. 예를 들어, 카드게임을 클래스로 만드나고 하면 호출할 때 카드의 숫자(rank)와 무늬(suit)를 뜻하는 매개변수를 항상 같은 순서로 전달 할 것이다. 따라서 이 둘을 묶느 도우미 클래스를 만들어서 하나의 매개변수로 주고받으면 API는 물론 클래스 내부 구현도 깔끔해 질 것이다.

 

 3. 앞서의 두 기법을 혼합한 것으로, 객체 생성에 사용한 빌더 패턴을 메서드 호출에 응용하는 것이다. 이 기법은 매개변수가 많을 때, 특히 그 중 일부는 생략해도 괜찮을 때 도움이 된다. 매개변수를 하나로 추상화한 객체를 정의하고, 클라이언트에서 이 객체의 세터(setter) 메서드를 호출해 필요한 값을 설정하게 한다. 이 때 각 세터 메서드는 매개변수 하나 혹은 서로 연관된 몇 개만 설정하게 한다.

그 이외에

 매개변수의 타입으로는 클래스보다는 인터페이스가 낫다. 예를 들어 메서드에  HashMap을 넘길 일은 전혀 없다. 대신 Map을 사용하자. 그러면 HashMap뿐 아니라 TreeMap, ConcurrentHashMap, TreeMap의 부분맵 등 어떤 Map 구현체도 인수로 건넬 수 있다. 심지어 자기 존재하지 않는 Map도 가능하다.

 

 또한 boolean보다는 원소 2개짜리 열거 타입이 낫다. 열거타입을 사용하면 코드를 읽고 쓰기가 더 쉬워진다. 예를 들어 다음은 화씨온도와 섭시온도를 원소로 정의한 열거타입이다.

 

public enum TemperatureScale { FAHRENHEIT, CELSIUS }

온도계 클래스의 정적 팩터리 메서드가 이 열거 타입을 입력받아 적합한 온도계 인스턴스를 생성해준다고 해보자. 확실히 Thermometer.newInstance(true)보다는 Thermometer.newInstance(TemperatureScale.CELCIUS)가 하는 일을 훨씬 명확히 알려준다. 나중에 켈빈온도도 지원해야 한다면, tHERMOMETER에 또 다른 정적 메서드를 추가할 필요 없이 TemperatureScale 열거 타입에 캘빈온도(KELVIN) 추가하면 된다. 

 

*느낀점

좋은 메서드 시그니처라는 것은, 결국 메서드명과, 매개변수에 대한 정보를 확인 했을 때, 한눈에 충분히 그 역할과 의도를 이해할 수 있는 모습이어야 할 것이다. 메서드의 이름을 잘 지어야 하며, 매개변수도 최대한 신경써야 한다는 것을 알았다. 특히 매개변수를 4개 이하로 유지하기 위한 여러 기법들을 알아보았다. 메서드를 쪼개는 경우가 있더라도, 매개변수를 공통된 클래스로 묶는 경우가 있더라도 매개변수를 줄일 수 있다면 고려해야 할 것이다.

반응형