본문 바로가기

Reading

(65)
[Effective-Java] Item 72~74. 표준 예외를 사용하라, 추상화 수준에 맞는 예외를 던지라, 메소드가 던지는 모든 예외를 문서화하라 Item 72. 표준 예외를 사용하라 표준 예외를 재사용하면 익숙해진 규약을 그대로 따라 다른 사람이 익히고 사용하기 쉬워진다. 그리고 예외 클래스 수가 적어지니 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다. 자주 사용되는 예외를 보자. 예외 주요 쓰임 예시 IllegalArgumentException 허용하지 않는 값이 인수로 건네졌을 때 반복 횟수 지정하는 매개변수에 음수 파라미터 IllegalStateException 객체가 메소드 수행에 적절치 않은 상태일 때 제대로 초기화되지 않은 객체를 사용 NullPointerException null 허용하지 않는 메소드에 null을 건넷을 때 null이 올 수 없는 파라미터에 null 삽입 IndexOutOfBoundsException 인덱..
[Effective-Java] Item 69~71. 예외는 진짜 예외 상황에만 사용하라, 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라, 필요 없는 검사 예외 사용은 피하라 Item 69.예외는 진짜 예외 상황에만 사용하라 // 배열의 원소를 순회하는데, 무한루프를 돌다가 배열의 끝에 도달시 Exception으로 종료 try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexoutOfBoundsException e) { } // 표준적인 관용구 for (Mountain m : range) { m.climb(); } JVM은 배열에 접근 시 경계를 넘는지 검사하는데, 일반 반복문도 배열 경계에 도달 시 종료한다. 이 검사를 반복문에도 명시한다면 검증 로직이 중복되므로 하나를 생략한다고 생각할 수 있으나, 이는 잘못된 추론이다. 예외는 예외 상황에 쓸 용도로 설계되었기에, 구현자 입장에선 최적화에 별 신경쓰지 않..
[Effective-Java] Item 66, 67.네이티브 메소드는 신중히 사용하라, 네이티브 메소드는 신중히 사용하라 [아이템66 - 네이티브 메소드는 신중히 사용하라] JNI(자바 네이티브 인터페이스; Java Native Interface): 자바 프로그램이 네이티브 메소드를 호출하는 기술 네이티브 메소드(Native Method): C, C++ 같은(여기에 국한되는건 아니다) 네이티브 프로그래밍 언어로 작성한 메소드 네이티브 메소드의 주요 쓰임 1. 레지스트리 같은 플랫폼 특화 기능 자바 버전이 올라가며 OS같은 하부 플랫폼의 기능들을 점차 흡수하기에 네이티브 메소드 사용 필요는 점차 줄어든다. 자바9 부터는 process API를 추가해 OS 프로세스에 접근할 수 있어졌다. [참고] / [참고2] 추가로 대체할 자바 라이브러리가 없는 네이티브 라이브러리를 사용해야할 때도 사용한다. 2. 네이티브 코드로 작성된 기..
[Effective-Java] Item 64, 65.객체는 인터페이스를 사용해 참조하라, 리플렉션보다는 인터페이스를 사용하라 [아이템64 - 객체는 인터페이스를 사용해 참조하라] 인터페이스를 사용해 참조하자 적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하자. 프로그램이 유연해진다. 선언 타입과 구현 타입을 동시에 바꿀 수 있으니 변수를 구현 타입으로 선언해도 되지 않을까? 클라이언트에서 기존 타입에서만 제공하는 메소드를 사용했거나, 기존 타입을 사용해야하는 다른 메소드에 그 인스턴스를 넘긴다면 새로운 코드로 교체를 했을 경우, 컴파일 되지 않는다. 변수를 인터페이스 타입으로 선언하면 이럴 일이 전혀 없다. 객체의 실제 클래스를 사용해야할 상황은 오직 생성자를 생성할 때 뿐이다. 코드로 자세히 보면 아래와 같다. // 좋지않은 예, 클래스를 타입으로 사용 LinkedHashSe..