[아이템 51] 메서드 시그니처를 신중히 설계하라
먼저 메서드 시그니처(Method Signature)가 뭔지 알아보자
자바 컴파일러는 메서드 이름과 파라미터를 이용하여 메서드를 구분하는데
메서드의 이름과 파라미터가 메서드 시그니처이다.
즉,
이름이 같은 메서드들이 있더라도 파라미터의 개수와 타입이 다르면
컴파일러가 서로 다른 메서드로 구분하는 것이다.
이번 아이템은 메서드 시그니처 설계에 대해 얘기하고 있고
즉, 메서드를 만들 때 메서드 이름이랑 파라미터에 신경 쓰라는 소리 ㅋ
✅ 메서드 이름은 신중히!
표준 명명 규칙에 따라 짓도록 하고 긴 이름은 지양하자(자바 라이브러리의 API 참조해도 ok)
같은 패키지에 속한 다른 이름들과 일관되게 짓는 것이 좋다.
자바 표준 명명 규칙을 정리한 글을 가져와봤다.
https://ozofweird.tistory.com/entry/Java-%EB%AA%85%EB%AA%85-%EA%B7%9C%EC%B9%99
[Java] 명명 규칙
1. 반의어 반의어 설명 get / set 받다 / 받다 add / remove 추가 / 제거 create / destroy 창조 / 파괴 start / stop 시동 / 정지 insert / delete 삽입 / 삭제 increment / decrement 증가 / 감소 old / new 구 / 신 begin / end 시작
ozofweird.tistory.com
✅ 편의 메서드를 많이 만들지 않기!
편의 메서드(convenience method)란?
말 그대로 편의를 위한 메서드
예로 JPA에서 1:N 관계 중 N 쪽에 요소를 추가할 때 만들어 쓰는 add() 메서드가 있다.
편의 메서드를 사용하면 메서드가 명확하게 무슨 일을 하는지 알 수 있고,
기능 단위로 묶을 수 있기 때문에 재사용도 가능하다.
하지만 편의 메서드가 너무 많아지면
- 메서드가 너무 많은 클래스는 문서화하고, 테스트하고 유지보수하고 사용하기 어렵다.
- 클래스나 인터페이스는 자신의 기능을 수행하는 메서드를 제공해야 한다.
즉, 자주 쓰일 경우에만 만들자!
✅ 메서드의 매개변수 너무 많지 않게!
매개변수는 4개 이하가 적절하고 특히 같은 타입의 매개변수 여러 개가 연달아 나오는 것은 좋지 않다.
매개변수를 줄일 수 있는 방법
▶️ 메서드 여러 개로 나누기
상황) 전체 리스트가 아닌 지정된 범위의 부분 리스트에서 주어진 원소를 찾아야 하는 요구사항
하나의 메서드로 기능 구현하려면 부분 리스트의 시작, 부분 리스트의 끝, 찾을 원소까지 총 3개의 매개변수 필요
기능으로 분리해 보면 리스트를 구하는 기능, 주어진 원소를 찾는 기능으로 나눌 수 있기 때문에 메서드 쪼개기가 가능하다.
그리고 두 기능은 공통점도 없기 때문에 굳이 하나의 메서드 안에 같이 들어있을 필요도 없다.
예시) - List 인터페이스
'공통점이 없는 기능이 잘 분리' 👉 '직교성이 높다.'
예시)
마이크로 서비스 아키텍처는 직교성이 높고, 모놀리식 아키텍처는 직교성이 낮다.
기능을 쪼개다 보면 중복이 줄고 결합성이 낮아짐 👉 유지보수 up 테스트 eazy
▶️ 매개변수 여러 개를 묶어 도우미 클래스로 만들기
class Human{
public void Emotion(String happy, String sad, String angry, String anxious){
...
}
}
class Human{
//도우미 클래스
static class EmotionHelper{
String happy;
String sad;
String angry;
String anxious;
}
public void Emotion(EmotionHelper emotionHelper){
...
}
}
▶️ 빌더 패턴을 사용
저번 아이템 주제로도 나왔던 내용이라 정리한 걸 첨부해 본다
https://kangkent.tistory.com/188
[아이템2] 생성자에 매개변수가 많다면 빌더를 고려하라
☺️ '이펙티브 자바'와 백기선 님 [이펙티브 자바] 편을 공부하고 정리한 글입니다. 다음은 영양정보를 보여주는 NutritionFacts클래스이다. 반드시 필요한 필드와 부가적인 필드(있어도 되고 없어
kangkent.tistory.com
위에서 설명한 매개변수를 줄이는 방법 중에 매개변수를 묶어 클래스로 따로 빼기도 했지만
매개변수 타입으로 클래스보다 인터페이스를 사용하는 것이 더 나은 유연함을 얻을 수 있다.
예시)
매개변수 타입을 인터페이스인 Map을 사용하면 TreeMap, ConcurrentHashMap, TreeMap 등
Map 구현체들을 인수로 사용이 가능하지만,
매개변수 타입으로 HashMap을 사용한다면 특정 구현체만 사용해야 한다.
정리
메서드 하나에 여러 매개변수 사용하지 말자
그렇다면 매개변수를 줄이기 위해 최대한 쪼개보자 🪓
매개변수를 클래스로 빼고자 한다면 타입으로 인터페이스 사용이 가능한지 생각해 보자