Effective Java73 [Effective Java] 아이템73 추상화 수준에 맞는 예외를 던지라 ■ 추상화 수준에 맞는 예외를 던져라 수행하려는 일과 관련 없이 보이는 예외가 튀어나오면 당황스러울 수 있다. 메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버릴 때 종종 일어나는 일이다. 이는 내부 구현 방식을 드러내어 윗 레밸 API를 오염시킨다. 이 문제를 피하려면 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야한다. 이를 예외 번역이라 한다. try { // ... } catch (LowerLevelException e) { throw new HigherLevelException(); } 예외 연쇄 예외를 번역할 때, 저수준 예외가 디버깅에 도움이 된다면 예외 연쇄를 사용하는게 좋다. 근본 원인이 되는 저수준 예외를 고수준 예외에 실어 보내는 방식(Throw.. 2021. 8. 22. [Effective Java] 아이템72 표준 예외를 사용하라 ■ 표준 예외를 사용하라 표준 예외를 사용하면 다른 개발자들이 익히고 사용하기 쉬워진다는 장점이 있다. 또한 예외 클래스의 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다. Exception, Throwable, Error, RuntimeException 은 직접 재사용하지 말자. 이 클래스들은 추상 클래스라고 생각하길 바란다. 이 예외들은 다른 예외들의 상위 클래스이므로 안정적으로 테스트할 수 없다. 다음 표는 널리 재사용하는 예외들이다. IllegalArgumentException 허용되지 않는 값이 인수로 건내졌을때(null이면 NullPointException을 사용) IllegalStateException 객체가 메소드를 수행하기 적합하지 않은 상태일때 NullPoint.. 2021. 8. 22. [Effective Java] 아이템71 필요 없는 검사 예외 사용은 피하라 ■ 검사 예외의 문제 검사 예외를 남발하면 쓰기 불편한 API가 된다. 어떤 메서드가 검사 예외를 던질 수 있다고 선언 됐다면, 이를 호출하는 코드에서는 catch 블록을 두어 그 예외를 붙잡아 처리하거나 더 바깥으로 던져 문제를 전파해야한다. API 사용자에게 부담을 준다. 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에 자바 8부터는 부담이 더 커졌다. API를 제대로 사용해도 발생할 수 있거나, 프로그래머가 의미있는 조치를 취할 수 있다면 받아들일 수 있지만, 둘다 해당이 안되면 비검사 예외를 사용하는 게 좋다. 특히 검사 예왹사 프로그래머에게 지우는 부담은 메서드가 단 하나의 검사 예외만 던질 때가 특히 크다. 이미 다른 검사 예외도 던지는 상황에서 또 다른 검사 예외를 추.. 2021. 8. 22. [Effective Java] 아이템70 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 ■ 검사 예외와 비검사 예외 / 에러 자바는 문제 상황을 알리는 타입으로(throwable)으로 검사 에외, 런타임 예외, 에러 이렇게 3가지를 제공한다. 예외 종류와 관련해서는 아래 링크를 참고하자. https://insight-bgh.tistory.com/24?category=857504 호출하는 쪽에서 복구하리라 여겨지는 상황이라면 검사 예외를 사용하라. 이것이 검사와 비검사 예외를 구분하는 기본 규칙이다. 검사 예외를 던지면 호출자가 그 예외를 catch로 잡아서 처리하거나 더 바깥으로 전파하도록 강제한다. 비검사 throwable은 두 가지로, 바로 런타임 예외와 에러다. 이 둘은 프로그램에서 잡을 필요가 없거나 보통 잡지 말아야한다. 이런 throwable을 잡지 않은 스레드는 적절한 오류 메.. 2021. 8. 22. [Effective Java] 아이템69 예외는 진짜 예외 상황에만 사용하라 ■ 예외는 예외 진짜 예외 상황에서만 사용하라 아래 코드는 예외를 잘못 사용한 코드이다. 무한 루프를 돌다가 배열의 끝에 도달해 예외가 발생하면 끝을 내는 코드이다. try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsException e) { } 반복문에서 배열의 크기보다 커졌는지 검사를 하는 부분을 줄이려고 의도한 코드 였을 텐데, 이는 잘못된 추론이다. 예외는 예외 상황에 쓸 용도로 설계되었으므로 JVM 구현자 입장에서는 명확한 검사만큼 빠르게 만들어야 할 만큼 최적화에 신경쓰지 않았을 확률이 높다. 코드를 try-catch 블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한된다. 배열을 순회하는 표준 관.. 2021. 8. 22. [Effective Java] 아이템68 일반적으로 통용되는 명명 규칙을 따르라 자바 플랫폼의 명명 규칙은 잘 정립되어 있으며, 그중 많은 것이 자바 언어 명세에 기술되어 있다. 자바의 명명 규칙은 크게 철자와 문법, 두 범주로 나뉜다. ■ 패키지와 모듈 이름 조직의 인터넷 도메인 이름을 역순으로 사용한다 (com.google) 예외 적으로 표준 라이브러리와 선택적 패키지들은 각각 java, javax로 시작한다. 패키지 이름의 나머지는 해당 패키지를 설명하는 하나 이상의 요소로 이루어진 8자이하의 짧은 단어로 표현한다. ■ 클래스와 인터페이스 (열거 타입, 애너테이션 포함) 클래스와 인터페이스의 이름은 하나 이상의 단어로 이뤄지면 각 단어는 대문자로 시작한다. 단어를 줄여쓰지 않도록 한다. ■ 메서드와 필드 첫글자를 소문자로 쓴다는 점만 빼면 클래스 명명 규칙과 같다. 객체를 반환.. 2021. 8. 1. 이전 1 2 3 4 ··· 13 다음