Skip to content

Latest commit

 

History

History
50 lines (34 loc) · 2.23 KB

item69.md

File metadata and controls

50 lines (34 loc) · 2.23 KB

69. 예외는 진짜 예외 상황에만 사용하라


  • 예외는 제어 흐름용으로 쓰여선 안 된다. 오직 예외 상황을 처리할 때만 사용해야 한다.

  • 성능 개선을 목적으로 과하게 쓴 기법은 자제하라, 표준적이고 쉽게 이해되는 관용구를 사용해라.

  • 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다.

    특정 상태에서만 호출할 수 있는 '상태 의존적' 메서드를 제공하는 클래스는 '상태 검사' 메서드도 함께 제공해야 한다.

  • ex) 각각 상태 의존적 메서드, 상태 검사 메서드에 해당하는

    Iterator 인터페이스의 next(상태 의존적 메서드)와 hasNext(상태 검사 메서드)를 제공한다.

    그리고 별도의 상태 검사 메서드 덕분에 다음과 같은 표준 for 관용구를 사용할 수 있다

    //Iterator 표준 관용구 사용
    for(Iterator<Foo> i = collection.iterator(); i.hashNext();) {
      Foo foo = i.next();
      ...
    }

    만약 Iterator가 hasNext를 제공하지 않았다면, 클라이언트가 그 일을 대신해야 했다.

    // 컬렉션을 이런 식으로 순회하지 말 것
    try{
      Iterator<Foo> i = collection.iterator();
      while(true) {
        Foo foo = i.next();
        ...
      }
    } catch(NoSuchElementException e) {
    
    }

    이 코드는 위에서 우리가 잘못되었다고 판단했던 배열을 순회하던 반복문에서 예외를 사용한 것과 비슷하다.

    반복문에서 예외를 사용하면 장황하고 헷갈리며 속도도 느리고, 엉뚱한 곳에서 발생한 버그를 숨기기도 한다.

  • 상태 검사 메서드, 옵셔널, 특정 값 중 하나를 선택하는 지침

    • 외부 동기화 없이 여러 스레드가 동시 접근 가능하거나 상태가 변할 수 있다면 옵셔널을 사용한다.
    • 성능이 중요한 상황에서 상태 검사 메서드가 상태 의존적 메서드의 작업 일부를 중복 수행한다면 옵셔널 반환을 선택한다.
    • 그 외의 경우에는 상태 검사 메서드 방식이 더 낫다.