[Effective Java]메소드 시그니처를 신중히 설계하라

메소드, 세 번째 아이템

Posted by SungBeom on April 28, 2020 · 3 mins read

API 설계 요령

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

편의 메소드를 너무 많이 만들지 말자. 모든 메소드는 각각 자신의 소임을 다해야 한다. 메소드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 인터페이스도 마찬가지다. 클래스나 인터페이스는 자신의 각 기능을 완벽히 수행하는 메소드로 제공해야 하며, 아주 자주 쓰일 경우에만 별도의 약칭 메소드를 두기 바란다. 확신이 서지 않으면 만들지 말자.

매개변수 목록은 짧게 유지하자. 4개 이하가 좋은데, 4개를 넘어가면 매개변수를 전부 기억하기가 쉽지 않다. 같은 타입의 매개변수 여러 개가 연달아 나오는 경우가 특히 해롭다. 사용자가 매개변수 순서를 기억하기 어려울뿐더러, 실수로 순서를 바꿔 입력해도 그대로 컴파일되고 실행되지만, 의도와 다르게 동작한다.

매개변수 타입으로는 클래스보다는 인터페이스가 더 낫다. 매개변수로 적합한 인터페이스가 있다면 이를 구현한 클래스가 아닌 그 인터페이스를 직접 사용하자. 예를 들어 메소드에 HashMap을 넘기지 말고 Map을 넘기자. 인터페이스 대신 클래스를 사용하면 클라이언트에게 특정 구현체만 사용하도록 제한하는 꼴이며, 혹시라도 입력 데이터가 다른 형태로 존재한다면 명시한 특정 구현체의 객체로 옮겨 담느라 비싼 복사 비용을 치러야 한다.

또한 boolean보다는 원소 2개짜리 열거 타입이 낫다. 열거 타입을 사용하면 코드를 읽고 쓰기가 더 쉬워지고, 나중에 선택지를 추가하기도 쉽다.

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

추가적으로 과하게 긴 매개변수 목록을 짧게 줄여주는 기술 세 가지를 소개하겠다. 첫 번째, 여러 메소드로 쪼갠다. 쪼개진 메소드 각각은 원래 매개변수 목록의 부분집합을 받는다. 잘못하면 메소드가 너무 많아질 수 있지만, 직교성(orthogonality, 직교성이 높다는 것은 공통점이 없는 기능들이 잘 분리되어 있거나 기능을 원자적으로 쪼개 제공한다는 뜻이다)을 높여 오히려 메소드 수를 줄여주는 효과도 있다. java.util.List 인터페이스가 좋은 예인데, 리스트에서 주어진 원소의 인덱스를 찾아야 하는데, 전체 리스트가 아니라 지정된 범위의 부분리스트에서의 인덱스를 찾는다고 해보자. 이 경우에 '부분리스트의 시작', '부분리스트의 끝', '찾을 원소'까지 총 3개의 매개변수가 아닌, 부분리스트를 반환하는 subList 메소드와 주어진 원소의 인덱스를 알려주는 indexOf 메소드를 이용해 원하는 목적을 이룰 수 있다.

매개변수 수를 줄여주는 기술 두 번째는 매개변수 여러 개를 묶어주는 도우미 클래스를 만드는 것이다. 일반적으로 이런 도우미 클래스는 정적 멤버 클래스로 둔다. 특히 잇따른 매개변수 몇 개를 독립된 하나의 개념으로 볼 수 있을 때 추천하는 기법이다. 예를 들어 카드게임을 클래스로 만든다고 하면, 메소드를 호출할 때 카드의 숫자(rank)와 무늬(suit)는 매개변수에 항상 포함되므로, 이 둘을 묶는 도우미 클래스를 만들어 하나의 매개변수로 주고받는 것이다.

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


핵심 정리

API 설계 요령으로는 메소드 이름은 신중이 지어야 하고, 편의 메소드를 너무 많이 만들지 말아야 하며, 매개변수 목록은 짧게 유지해야 한다. 또한 매개변수 타입으로는 클래스보다는 인터페이스가 더 낫고, boolean보다는 원소 2개짜리 열거 타입이 낫다. 매개변수 목록을 짧게 줄여주는 기술로는 여러 메소드로 쪼개는 방법과 매개변수 여러 개를 묶어주는 도우미 클래스를 만드는 방법, 객체 생성에 사용한 빌더 패턴을 메소드 호출에 응용하는 방법이 있다.