JAVA 104

[아이템 75] 예외의 상세 메시지에 실패 관련 정보를 담으라

예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 아래와 같이 해당 예외의 stack trace 정보를 자동으로 출력합니다. 예상하지 못한 장애가 발생했을 때 위와 같은 정보가 실패 원인을 분석해야 하는 개발자 혹은 SRE가 얻을 수 있는 유일한 정보인 경우가 많습니다. 특히 재현하기 어려운 장애일 경우 더 자세한 정보를 얻기가 어렵거나 불가능하기 때문에 예외의 toString() 메서드에 실패 원인에 관한 정보를 가능한 많이 담아 반환해야 합니다. 예외 메시지 관련 원칙 실패 순간을 포착하려면 발생한 예외와 관련된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 함 stack trace에는 예외가 발생한 파일명과 예외가 발생한 line이 출력되는 것이 일반적이므로 문서와 소스코드를 통해 얻을 수 있..

JAVA/Effective Java 2024.03.29

[아이템 74] 메서드가 던지는 모든 예외를 문서화하라

메서드가 발생시키는 예외는 해당 메서드를 올바르게 사용하는 데 매우 중요한 정보이므로 각 메서드가 발생시키는 예외를 하나씩 문서화하는 것이 필요합니다. Checked Exception은 항상 별도로 선언하고, 각 예외가 발생하는 상황을 JavaDoc의 @throws 태그로 문서화하라 공통 상위 예외 클래스 하나로 뭉뚱그려 선언하는 일은 지양해야 함 메서드 사용자에게 각 예외에 대처할 수 있는 힌트를 주지 못할 뿐만 아니라 같은 맥락에서 발생할 여지가 있는 다른 예외들까지 삼켜버릴 수 있어 API 사용성을 떨어뜨림 ex) Exception이나 Throwable을 throw 한다고 선언해서는 안됨 예외 케이스: main 메서드는 JVM만이 호출하므로 Exception으로 묶어서 던지도록 선언해도 괜찮음 1...

JAVA/Effective Java 2024.03.28

[아이템 73] 추상화 수준에 맞는 예외를 던지라

로그를 확인하는 도중 일을 수행하는 도중 예상치 못한 예외가 발생하면 상당히 당황스러울 수 있습니다. 이는 메서드가 저수준 예외를 처리하지 않고 상위 레이어로 던질 때 종종 발생하며 다음과 같은 문제가 발생할 수 있습니다.. 내부 구현 방식을 상위 layer에 드러내 윗 레벨 API를 오염시킬 수 있으며 다음 릴리즈에서 구현 방식이 변경될 경우 다른 예외가 발생해 기존 클라이언트 프로그램을 깨지게 할 수 있음 이번 아이템에서는 위 문제를 방지하기 위한 기법들을 소개합니다. 1. 상위 메서드에서 저수준 예외를 번역하자 상위 메서드에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야하며 이를 `예외 번역(Exception Translation)`이라고 함 ex) 데이터베이스 연결을 시도할..

JAVA/Effective Java 2024.03.27

[아이템 72] 표준 예외를 사용하라

객체 지향 프로그래밍의 장점으로 `재사용성`이라는 특성은 항상 강조되며, 이는 예외도 마찬가지입니다. 자바 라이브러리는 대부분 API에서 쓰기 충분한 수의 예외를 제공 표준 예외를 재사용해라 표준 예외는 많은 개발자들에게 이미 익숙하고 널리 사용되기 때문에 적용 시 다른 사람들이 API를 익히고 사용하기 쉽습니다. 또한, 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다는 장점이 존재합니다. 달리 말하자면 무분별하게 Custom Exception을 생성하면 빌드하는 시간도 오래 걸리고 클래스 로딩 시간이 오래 걸린다는 뜻입니다. 그러나 대부분의 상용 서비스의 API 규격서에는 예외 상황이 발생하더라도 단순히 예외를 던지는 것이 아닌 API 응답을 반환하고, 이들은 대부..

JAVA/Effective Java 2024.03.25

[아이템 71] 필요 없는 검사 예외 사용은 피하라

아이템 70에서 Checked Exception과 Unchecked Exception에 대해 다루었습니다. Checked Exception은 try-catch 블록으로 감싸거나 예외를 던지는 행위를 강제하기 때문에 싫어하는 자바 개발자가 많지만 제대로 활용할 경우 API와 프로그램의 질을 높일 수 있습니다. Checked Exception은 다음과 같은 상황에서 적절하며, 이에 해당하지 않는 경우에는 Unchecked Exception을 사용하는 것이 적절합니다. API를 제대로 사용해도 발생할 수 있는 예외 프로그래머가 의미 있는 조치를 취할 수 있는 경우 요약하면, Checked Exception은 특정한 상황에서만 사용하는 것이 좋으며, 일반적으로는 Unchecked Exception을 선호합니다...

JAVA/Effective Java 2024.03.25

[아이템 70] 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라

자바는 문제 상황을 알리는 타입(throwable)으로 검사 예외(checked exception), 런타임 예외(unchecked exception), 그리고 Error를 제공합니다. 1. Checked Exception RuntimeException 클래스를 상속하지 않은 예외 컴파일러가 강제로 예외 처리를 요구 예외를 try-catch문으로 감싸지 않거나 상위 계층으로 던지지 않을 경우 컴파일 에러 발생 ex) IoException, SQLException, etc. 2. Unchecked Exception RuntimeException을 상속한 클래스 Checked Exception과 달리 try-catch문으로 감싸지 않거나 상위 계층으로 던지지 않더라도 컴파일 에러 발생하지 않음 컴파일러가 예..

JAVA/Effective Java 2024.03.23

[아이템 69] 예외는 진짜 예외 상황에만 사용하라

예외를 안 써도 되는 상황에서는 예외를 사용하지 말자 코드가 달성하고자 한 목표 JVM은 배열에 접근할 때마다 인덱스가 범위를 넘지 않는지 검사 일반적인 반복문도 배열 범위의 경계에 도달하면 종료 일반적인 반복문을 사용하면 검사를 두 번하므로 두 검사 중 하나를 생략함으로써 성능 최적화를 목표함 위 코드의 문제점 코드 가독성 저하 잘못된 추론을 근거로 성능 최적화를 노렸고 잘못되었다는 근거는 다음과 같음 예외는 예외 상황에 사용할 용도로 설계되었으므로 JVM 구현자 입장에서는 최적화에 별로 신경 쓰지 않았을 가능성이 큼 try-catch 블록 내 코드는 JVM이 적용할 수 있는 최적화가 제한됨 배열을 순회하는 표준 관용구는 앞서 걱정한 중복 검사를 수행하지 않음 (JVM이 알아서 최적화) 1. 예외를 사..

JAVA/Effective Java 2024.03.21

[아이템 68] 일반적으로 통용되는 명명 규칙을 따르라

자바 플랫폼은 명명 규칙이 잘 정립되어 있으며 그중 많은 것이 자바 언어 명세에 기술되어 있습니다. https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html Chapter 6. Names class Test { static int v; static final int f = 3; public static void main(String[] args) { int i; i = 1; v = 2; f = 33; // compile-time error System.out.println(i + " " + v + " " + f); } } In this program, the names used as the left-hand-sides in the assi docs.or..

JAVA/Effective Java 2024.03.20

[아이템 67] 최적화는 신중히 하라

최적화 관련 명언 `(맹목적인 어리석음을 포함해) 그 어떤 핑계보다 효율성이라는 이름 아래 행해진 컴퓨팅 죄악이 더 많다(심지어 효율을 높이지도 못하면서).` - 윌리엄 울프 `(전체의 97% 정도인) 자그마한 효율성은 모두 잊자. 섣부른 최적화가 만악의 근원이다.` - 도널드 크누스 `첫 번째, 하지 마라. 두 번째, (전문가 한정) 아직 하지 마라. 다시 말해, 완전히 명백하고 최적화되지 않은 해법을 찾을 때까지는 하지 마라` - M.A 잭슨 정리하자면 최적화는 주로 해로운 결과를 초래할 가능성이 높으며, 특히 섣불리 진행할수록 더 그럴 확률이 높습니다. 따라서 최적화를 진행하기 전에 많은 요소를 고려한 뒤 진행해야 합니다. 프로그램을 설계할 때 고려해야 할 요소 1. 빠른 프로그램보다는 좋은 프로그..

JAVA/Effective Java 2024.03.19

[아이템 66] 네이티브 메서드는 신중히 사용하라

Java Native Interface(JNI)는 자바 프로그램이 네이티브 메서드를 호출하는 기술입니다. "네이티브 메서드"는 일반적으로 특정 프로그래밍 언어로 작성된 코드가 아닌, 시스템의 네이티브 코드로 구현된 함수 이러한 메서드들은 일반적으로 고성능이 필요한 작업이나 특정 플랫폼과의 상호 작용을 수행할 때 사용 네이티브 메서드는 일반적으로 C나 C++와 같은 저수준 언어로 작성되며, 특정 플랫폼의 기능에 직접 액세스 가능 전통적인 네이티브 메서드의 주요 쓰임 전통적인 네이티브 메서드의 주요 쓰임은 다음과 같습니다. 레지스트리 같은 플랫폼 특화 기능을 사용 네이티브 코드로 작성된 기본 라이브러리를 사용 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 별도로 네이티브 언어로 작성 하지만 자바 ..

JAVA/Effective Java 2024.03.19