[Java] Item 51 : 메서드 시그니처를 신중히 설계하라
Effective Java를 읽고 정리한 정리본입니다.
📌 Item 51 : 메서드 시그니처를 신중히 설계하라
🫧 API 설계 요령
✨ 1. 메서드 이름을 신중히 짓자
- 항상 표준 명명 규칙을 따를 것
- 애매하면 자바 라이브러리의 API 가이드를 참조할 것
✨ 2. 편의 메서드를 너무 많이 만들지 말자
- 아주 자주 쓰일 경우에만 별도의 약칭 메서드를 두라.
- 확신이 서지 않으면 만들지 말라.
✨ 3. 매개변수 목록은 짧게 유지하자.
- 매개변수는 4개 이하로 유지하라.
- 같은 타입의 매개변수 여러 개가 연달아 나오는 경우를 주의하자.
🫧 과하게 긴 매개변수 목록을 짧게 줄이는 법
✨ 1. 여러 메서드로 쪼갠다.
- 쪼개진 메서드 각각은 원래 매개변수 목록의 부분집합을 받는다.
ex) java.util.List
리스트에서 주어진 원소의 인덱스를 찾아야 하는데, 전체 리스트가 아니라 지정된 범위의 부분 리스트에서의 인덱스를 찾는다고 해 보자.
이 기능을 하나의 메서드로 구현하려면 부분 리스트의 시작
, 부분리스트의 끝
, 찾을 원소
까지의 총 세 개의 매개변수가 필요하다.
그런데 List는 그 대신 부분리스트를 반환하는 subList 메서드와 주어진 원소의 인덱스를 알려주는 indexOf 메서드를 별개로 제공한다.
subList가 반환한 부분리스트 역시 완벽한 List이므로 두 메서드를 조합하면 원하는 목적을 이룰 수 있다.
✨ 2. 매개변수 여러 개를 묶어주는 도우미 클래스를 만든다.
일반적으로 이런 도우미 클래스는 정적 멤버 클래스로 둔다.
특히 잇따른 매개변수 몇 개를 독립된 하나의 개념으로 볼 수 있을 때 추천하는 기법이다.
예를 들어 카드게임을 클래스로 만든다고 해보자.
그러면 메서드를 호출할 때 카드의 숫자(rank)와 무늬(suit)를 뜻하는 두 매개변수를 항상 같은 순서로 전달할 것이다.
따라 이 둘을 묶는 도우미 클래스를 만들어 하나의 매개변수로 주고받으면 API는 물론 클래스 내부 구현도 깔끔해질 것이다.
✨ 3. 객체 생성에 사용한 빌더 패턴을 메서드 호출에 응용한다.
- 먼저 모든 매개변수를 하나로 추상화한 객체를 정의하고, 클라이언트에서 이 객체의 세터 메서드를 호출해 필요한 값을 설정하게 한다.
- 이때 각 세터 메서드는 매개변수 하나 혹은 서로 연관된 몇 개만 설정하게 한다.
-
클라이언트는 먼저 필요한 매개변수를 다 설정한 다음, execute 메서드를 호출해 앞서 설정한 매개변수들의 유효성을 검사한다.
-
마지막으로, 설정이 완료된 객체를 넘겨 원하는 계산을 수행한다.
🫧 매개변수의 타입으로는 클래스보다 인터페이스가 더 낫다.
매개변수로 적합한 인터페이스가 있다면 이를 구현한 클래스가 아닌 그 인터페이스를 직접 사용하자.
🫧 boolean 보다는 원소 두 개 짜리의 열거 타입이 낫다.
열거 타입을 사용하면 코드를 읽고 쓰기가 더 쉬워진다.
예를 들어 다음은 화씨온도와 섭씨온도를 원소로 정의한 열거 타입이다.
public enumTemperatureScale { FAHRENHEIT, CELSIUS }
온도계 클래스의 정적 팩터리 메서드가 이 열거 타입을 입력받아 적합한 온도계 인스턴스를 생성해준다고 해보자.
확실해 Thermometer.newInstance(true); 보다는 Thermometer.newInstance(TemperatureScale.CELSIUS)가 하는 일을 훨씬 명확히 알려준다.