Item 51. Method Signature
메서드 시그니처를 신중히 설계하라
메서드를 설계할 때는 일관된 메서드 명명 규칙을 따라야 하고, 너무 많은 편의 메서드를 정의하면 안된다. 또한 매개변수 목록은 아래와 같은 이유로 짧게 4개 이하로 적게 유지하는 것이 좋다.
매개변수를 전부 기억하기 쉽지 않음
같은 타입의 매개변수가 여러 개 나오는 경우, 특히 매개변수의 타입이 기본 타입이라면 실수하기 쉬움(의도치 않은 형변환으로 인한 오류 발생 가능)
매개변수 목록을 줄이는 방법
매개변수 수를 줄이는 방법으론 다음과 같은 세 가지 방법이 있다.
1. 여러 메서드로 쪼개기
쪼개진 메서드를 각각 원래 매개변수의 부분집합을 받게하여 나뉘어 받도록 한다. 잘못하면 메서드가 많아질 수 있지만, 직교성을 높여 오히려 메서드 수를 줄이는 효과를 기대할 수 있다.
class Example {
public static void main(String[] args) {
List<String> list = List.of("a", "b", "c", "d", "e", "f", "g", "h", "i", "j");
// 1. 지정된 범위의 부분리스트에서 인덱스를 찾는 기능을 수행하는 임의의 메서드(존재하지 않는 메서드)
list.indexOf("a", 0, 5);
// 2. 실제 구현은 아래와 같이 두 개의 메서드로 나뉘어서 사용 가능
list.subList(0, 5).indexOf("a");
}
}
만약 지정된 범위의 부분리스트에서 인덱스를 찾는 기능을 수행을 하나의 메서드로 구현하게되면 총 3개의 매개변수가 필요하다. 하지만 List 인터페이스에서는 이를 두 개의 메서드를 사용하여 완벽하게 위 기능을 수행할 수 있다.
2. 매개변수 여러 개를 묶어주는 도우미 클래스를 만들기
일반적으로 이런 도우미 클래스는 정적 멤버 클래스로 두는데, 특히 매개변수를 하나의 개념으로 묶을 수 있을 때 사용한다. 매개변수 수 압축 뿐만 아니라 순서를 바꿔서 호출하지 않도록 해주는 장점도 있다.
3. 1,2를 혼합한 방법
빌더 패턴을 메서드 호출에 응용한 방법으로 보면 되는데, 빌더패턴과 같이 매개변수가 많고, 생략해도 괜찮을 때 사용하면 좋다. 사용 방법은 아래와 같다.
모든 매개변수를 하나로 추상화한 객체 정의
클라이언트에서 이 객체의 setter 메서드를 호출해 필요한 값을 설정
각 setter 메서드는 매개변수 하나 혹은 서로 연관된 몇 개만 설정
필요한 매개변수 설정 후 execute 메서드를 호출해 앞서 설정한 유효성 검사
설정 완료된 객체를 넘겨 원하는 메서드 호출
그 외 주의사항
매개변수 타입으로 클래스보다는 인터페이스 사용
매개변수 타입으로 적합한 인터페이스가 있다면 구현 클래스 보다는 인터페이스를 직접 사용해 다른 구현체로 쉽게 교체할 수 있도록 한다.(HashMap
x, Map
o)
boolean보다는 원소 2개짜리 열거 타입을 사용
boolean이 더 명확할 때를 제외하고는 원소 2개짜리 열거 타입을 사용하는 것이 가독성 측면에서도, 확장성 측면에서도 더 좋다.
Last updated
Was this helpful?