본문 바로가기
728x90

도서/이펙티브자바7

Item 12. toString을 항상 재정의하라 Object의 기본 toString() 메서드는 다음과 같다. 1 2 3 public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } Colored by Color Scripter cs 따라서 기본 toString() 메서드를 그냥 사용한다면 유의미한 정보를 얻기 어렵다. 따라서 모든 하위 클래스에서 toString을 재정의 해야 한다. toString() 메서드를 직접 호출할 일은 드물다. 하지만, 객체를 println, printf, 문자열 연결 연산자(+), assert 구문에 넘길 때, 디버거가 객체를 출력할 때 자동으로 불린다. 또 한, 에러 로깅에도 사용할 수 있다. 따라서 toS.. 2022. 5. 8.
Item 72. 표준 예외를 사용하라. 표준 예외를 재사용하는 것으로 얻을 수 있는 이점은 다음과 같다. 1. 표준 예외는 많은 프로그래머에게 익숙한 규약을 따른다. 따라서 내가 작성한 API를 다른 사람이 익히고 사용하기 쉬워진다. 2. 예외 클래스 수가 적으면 메모리 사용량이 줄고 클래스를 적재하는 시간도 적게 걸린다. 많이 사용되는 예외들은 다음과 같다. 예외 사용처 IllegalArgumentException 허용하지 않는 값이 인수로 건네졌을 때(null은 따로 NullPointerException 으로 처리) IllegalStateException 객체가 메서드를 수행하기에 적절하지 않은 상태일 때 NullPointerExcetpion null을 허용하지 않는 메서드에 null을 건넸을 때 IndexOutOfBoundsExcepti.. 2022. 4. 17.
Item 69. 예외는 진짜 예외 상황에만 사용하라 코드 부터 보자. 1 2 3 4 5 6 7 8 9 try { int i = 0; while (true) { range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e) { } Colored by Color Scripter cs 이 코드는 배열의 끝에 도달하면 에러를 던져 코드를 종료한다. for-each loop 를 사용하지 않고 이처럼 작성한 이유는 다음과 같다. JVM은 배열에 접근할 때마다 경계를 넘었는지를 검사한다. 반복문 또한 배결 경계에 도달하면 종료한다. 따라서 반복문을 사용하면 경계 검사가 중복되므로 하나를 생량한 것이다. 하지만 이는 다음과 같은 이유로 잘못된 추론이다. 1. 예외는 예외 상황에서만 사용할 목적으로 설계되었으므로 JV.. 2022. 4. 17.
Item 42. 익명 클래스보다는 람다를 사용하라 예전에는 자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용했고 이런 인터페이스의 인스턴스를 함수 객체(function object)라 해서, 특정 함수나 동작을 나타내는대 사용했다. 함수 객체를 만드는 방식으로는 익명 클래스를 주로 사용했다. 하지만 익명 클래스는 너무 길기 때문에 함수형 프로그래밍에 적합하지 않았다. 자바 8에 와서야 람다가 도입되 함수 객체를 람다를 통해 짧은 길이로도 만들 수 있게 되었다. 람다는 함수나 익명 클래스와 개념은 비슷하지만 코드는 훨신 간결하다. 람다의 매개변수와 반환값은 컴파일러가 타입 추론을 사용해 추론하기 때문에 통상적인 상황에서는 타입을 명시하지 않아도 된다. 그럼에도 타입을 명시해야 코드가 더 명확할 때에는 타입을 명시해야 한다. 람다.. 2022. 3. 12.
728x90