java38 [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] 아이템69 예외는 진짜 예외 상황에만 사용하라 ■ 예외는 예외 진짜 예외 상황에서만 사용하라 아래 코드는 예외를 잘못 사용한 코드이다. 무한 루프를 돌다가 배열의 끝에 도달해 예외가 발생하면 끝을 내는 코드이다. try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsException e) { } 반복문에서 배열의 크기보다 커졌는지 검사를 하는 부분을 줄이려고 의도한 코드 였을 텐데, 이는 잘못된 추론이다. 예외는 예외 상황에 쓸 용도로 설계되었으므로 JVM 구현자 입장에서는 명확한 검사만큼 빠르게 만들어야 할 만큼 최적화에 신경쓰지 않았을 확률이 높다. 코드를 try-catch 블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한된다. 배열을 순회하는 표준 관.. 2021. 8. 22. [Effective Java] 아이템61 박싱된 기본 타입보다는 기본 타입을 사용하라 ■ 기본 타입과 박싱된 기본 타입의 차이점 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성이라는 속성을 갖는다. 즉, 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 이런 차이점 때문에 주의해서 사용하지 않으면 문제가 발생할 수 있다. ■ 비교자 문제 발생 예시 Comparator naturalOrder = (i, j) -> (i < j) ? -1 : ( i == j ? 0 : 1); 위의 코드를 naturalOrder.compare(new Integer(42), new Integ.. 2021. 7. 23. [Effective Java] 아이템60 정확한 답이 필요하다면 float와 double은 피하라 ■ float과 double은 정확하지 않을 수 있다. float과 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 근사치로 계산하도록 세심하게 설계되었다. 그렇기 때문에 float과 double은 특히 금융 계산과는 맞지 않는다. 금융 계산은 BigDecimal, int 혹은 long을 사용해야한다. BigDecimal의 아쉬운점으로는 기본 타입보다 사용하기가 훨씬 불편하고 느리다는 점이있다. ■ 핵심 정리 정확한 계산이 필요한 경우 float나 double은 피하라 코딩 시의 불편함이나 성능 저하를 신경 쓰지 않겠다면 BigDecimal을 사용하라 BigDecimal이 제공하는 여덝 가지 반올림 모드를 이용하여 반올림을 완벽히 제.. 2021. 7. 23. 이전 1 2 3 4 ··· 7 다음