본문 바로가기
Language/Effective java

메서드

by y.j 2022. 8. 1.
728x90

메서드 시그니처를 신중히 설계하라

API 설계 요령

  • 메서드 이름을 신중히 짓자. 항상 표준 명명 규칙을 따라야 한다.
  • 편의 메서드를 너무 많이 만들지 말자. 너무 많은 메서드는 익히고, 사용하고, 문서화, 테스트, 유지보수하기 너무 어렵다.
  • 매개변수 목록은 짧게 유지하자. 4개 이하가 좋다. 4개가 넘어가면 매개변수를 전부 기억하기 쉽지 않다. 특히 같은 타입의 매개변수를 여러 개가 연달아 나오는 경우는 많이 해롭다.
1. 여러 메서드로 쪼갠다.
   - 쪼개진 메서드 각각은 원래 매개변수 목록 부분집합을 받는다. 잘못하면 메서드가 너무 많아질 수 있지만,
     직교성을 높여 오히려 메서드 수를 줄여주는 효과도 있다. 
   * 직교성이란? 공통점이 없는 기능들이 잘 분리되어 있다.


2. 매개변수를 여러 개를 묶어주는 도우미 클래스를 만드는 것이다.

3. 빌더 패턴을 메서드 호출 응용
   - 클라이언트에서 setter로 매개변수를 받고 execute 메서드를 호출해 앞서 설정한 매개변수 유효성을 검사한다.
  • 매개변수의 타입으로는 클래스보다는 인터페이스가 낫다. 하위 클래스 어떤 거든 변수로 받을 수 있고 구현체를 받게 된다면 특정 구현체만 사용하도록 제한하게 된다.
  • boolean보다는 원소 2개짜리 열거 타입이 낫다. 

 

다중정의는 신중히 사용하라

아래코드는 "그 외"를 3번 출력한다. 왜냐하면 Set과 List는 Collection의 하위타입이기 때문이다. 오버로딩은 어느 메서드가 호출할지가 컴파일 타임에 정해지기 때문에 조심히 사용해야 한다.

public class Main {
    public static String Classify(Set<?> s) {
        return "집합";
    }

    public static String Classify(List<?> lst) {
        return "리스트";
    }

    public static String Classify(Collection<?> c) {
        return "그 외";
    }

    public static void main(String[] args) {
        Collection<?>[] collections = {
                new HashSet<String>(),
                new ArrayList<BigInteger>(),
                new HashMap<String, String>().values()
        };

        for(Collection<?> c : collections) {
            System.out.println(Classify(c));
        }
    }
}

 

오버라이딩경우에는 런타임에 동적으로 선택되지만, 오버로딩은 컴파일 타임에 정적으로 정해지기 때문에 조심히 사용해야 한다.

  • 다중정의가 혼동을 일으키는 상황을 피해야 한다.
  • 안전하고 보수적으로 가려면 매개변수 수가 같은 다중정의는 만들지 말자.
  • 다중정의하는 대신 메서드 이름을 다르게 지어주는 길이 더 좋을 수 있다.

 

 

 

 

728x90

'Language > Effective java' 카테고리의 다른 글

일반적인 프로그래밍 원칙  (0) 2022.08.08
메서드  (0) 2022.08.04
메서드  (0) 2022.08.01
람다와 스트림  (0) 2022.07.29
람다와 스트림  (0) 2022.07.26

댓글