Effective Java 3/E - (8) 메소드

신복호·2020년 12월 6일
0

Effactive JAVA 3/E

목록 보기
8/12
post-thumbnail

8장 메소드

아이템 49. 메개변수가 유효한지 검사해라

  • 메소드 몸체가 실행되기 전에 매개 변수를 확인하면 잘못된 값이 넘어왔을때 즉각적이로 깔끔한 방식으로 예외를 던질수 있다.

  • java7 에서 추가된 java.util.requireNonNull 메소드는 유연하고 사용하기 편하므로 null을 수동으로 검사 안해도 된다.

    public class Board {
       private final Bar bar;
       
       public Board(Bar bar){
          Object.requireNonNull(bar, "bar는 필수 값입니다.");
          this.bar = bar
       }
    
    }
  • 메소드나 생성자를 작성할 때면 그 매개변수들에 어떤 제약이 있을지 생각해야 한다. 그 제약들을 문서화 하고 메소드 코드 시작 부분에서 명시적으로 검사해야한다.

아이템 50. 적시에 방어적 복사본을 만들라

  • java는 네이티브 메소드를 사용하지 않아 C, C++ 언어에서의 버퍼 오피런,와일드 포인터 같은 메모리 충돌오류에서 안전하다. 다만 우리가 만든 클래스가 불변이 깨질수 있음을 명심하고 방어적인 프로그래밍을 해야 한다.
  • 클래스가 클라이언트로 부터 받는 혹은 클라이언트로 반환하는 구성요소가 가변이라면 그 요소들은 반드시 방어적으로 복사해야한다.
  • 만약 복사 비용이 너무 크거나 클라이언트가 그 요소들을 잘못 수정할일이 없음을 신뢰한다면 방어적 복사 대신 해당 구성요소를 수정했을때 책임이 클라이언트에 있음을 명시해야 한다.

아이템 51.메소드 시그니처를 신중하게 설계 해라

  • 메소드의 이름을 신중하게 지어라

    • 표준 명명 규칙에 따라 지으자
    • 긴 이름은 지양하자
    • 자바 라이브러리 가이드를 참고 하면 좋다.
  • 편의 메소드를 너무 많이 만들지 마라

    • 너무 많은 세소드는 그에 따른 문서화, 유지보수, 테스트를 해야한다.

    • 메소드의 매개변수 목록도 4개 이하가 적절하며 특히 같은 타입의 매개 변수가 연달아 나오는것은 좋지 않다.

    • 과하게 긴 메개변수 목록을 짧게 줄여주는 기술

      • 여러 메소드로 쪼갠다.
        -> List에서의 subList / indexOf 등

        List<Integer> numberList = List.of(1,2,3,4);
        
        List<Integer> newNumberList = list.subList(0,2); // 순서 (value값 아님)
        int index = newNumberList.indexOf(2) // value    
      • 도우미 클래스 이용 (helper class)

             // 기존 메서드
        public void someMethod(String name, String address, String email, String job) {
            // do something
        }
        
        // Helper 클래스 적용
        class SomeHelper {
            String name;
            String address;
            String email;
            String job;
        }
        
        public void someMethod(SomeHelper someHelper) {
            // do something
        }
        

        참조 : https://madplay.github.io/post/effectivejava-chapter8-methods

      • 빌더 패턴 이용 (아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하자)

  • 매개변수의 타입으로는 클래스 보다는 인터페이스가 더 낫다.
    -> ex) HashMap 보다는 Map을 사용하는 것이 좋다.

  • boolean 보다는 원소 2개짜리 열거 타입이 낫다. (메소드 이름상 boolean을 받아야 의미가 더 명확할때는 제외한다.)

메소드의 이름과 매개변수 리스트는 신중히 설계해야 한다.

아이템 52. 다중정의(overloading)는 신중하게 사용해라

  • 다중정의 (overloading)은 어느 메소드를 호출할지 컴파일 타임에서 결정이 된다. 재정의(overriding)한 메소드는 동적으로 선택되고 다중정의한 메소드는 정적으로 선택 된다.

  • 일반적으로 매개변수 수가 같을 때는 다중정의를 피하는 것이 좋다.

  • 상황에 따라 특히 생성자라면 이 조언을 따르지 못할 것이다. 그러면 햇갈릴만한 매개변수는 형변환하여 정확한 다중정의 메소드가 선택되도록 해야 한다.

  • 이것이 불가능 하다면 (ex) 기존 클래스를 수정해 새로운 인터페이스를 구성해야 할때는 같은 객체를 입력받는 다중정의 메소드를이 모두 동일하게 동작하도록 만들어야 한다.

    일반적으로 매개변수 개수가 같을 때는 다중 정의를 피하는 것이 좋다.

아이템 53. 가변인수는 신중하게 사용해라

  • 인수 개수가 일치하지 않은 메소드를 정의해야 한다면 가변인수가 반드시 필요하다.

  • 메소드를 정의 할 때 필수 매개변수는 가변인수 앞에 두고, 가변인수를 사용할때에는 성능 문제 까지 고려해야 한다.(배열을 새로 할당하고 초기화되기 떄문)

    가변인수는 성능에 문제가 있을 수 있다. 신중히 사용하자.

아이템 54. null이 아닌, 빈 컬렉션 이나 배열을 반환해라

  • null을 반환하는 메소드는 null을 방어하는 코드를 반드시 추가해주어야 한다.

    null이 아닌, 빈 배열이나 컬렉션을 반환하라.

아이템 55. Optional 반환은 신중하게 해라

  • 값을 반환하지 못할 가능성이 있고, 호출할 떄마다 반환값이 없을 가능성을 염두에 둬야 하는 메소드라면 Optional을 반환해야 할 상황일 수 있다.

  • 하지만 Optional 반환에는 성능 저하가 뒤따르니, 성능에 민감한 메소드라면 null을 반환하거나 예외를 던지는 편이 나을수도 있다.

[참조] JAVA 8 (3) Stream / Optional의 등장

아이템 56. 공개된 API요소에는 항상 문서화 주석을 작성해라

  • API를 올바르게 문서화하려면 공개된 모든 클래스,인터페이스,메소드,필드선언에 문서화 주석을 다는것이 좋다.

  • 메소드용 문서화 주석에는 해당 메소드와 클라이언트 사이의 규약을 명료하게 기술한다.

  • 열거 타입을 문서화할 때는 상수들에도 주석을 달아야 한다.

  • 어노테이션 타입을 문서화할 때는 멤버들에도 모두 주석을 달아야 한다.

  • 클래스 혹은 정적 메소드가 쓰레드 안전하든 아니든, 쓰레드 안전 수준을 반드시 API 설명에 포함해야 한다.

    문서화 주석은 API를 문서화하는 가장 좋은 방법이다.

profile
한참 열정이 가득한 백엔드 개발자입니다.

0개의 댓글