이펙티브 자바

자바 개발자라면 한 번쯤 읽어야 한다는 말을 귀에 못이 박히도록 들어왔는데, 드디어 3판을 완독했다.

이펙티브 자바

저자 조슈아 블로크(Joshua Bloch)는 자바 컬렉션 프레임워크를 직접 설계한 구글의 핵심 엔지니어다. 단순히 자바를 잘 쓰는 사람이 아니라 자바 언어 자체를 만든 사람이 쓴 책이라는 점에서 신뢰감이 다르다. 3판은 자바 7, 8, 9의 변경 사항을 반영했고, 특히 람다와 스트림에 대한 장이 새로 추가됐다.

구성

책은 총 12장, 90개의 아이템으로 이루어져 있다.

  • 2장: 객체 생성과 파괴
  • 3장: 모든 객체의 공통 메서드
  • 4장: 클래스와 인터페이스
  • 5장: 제네릭
  • 6장: 열거 타입과 애너테이션
  • 7장: 람다와 스트림
  • 8장: 메서드
  • 9장: 일반 프로그래밍
  • 10장: 예외
  • 11장: 동시성
  • 12장: 직렬화

각 아이템은 “정적 팩터리 메서드를 고려하라”, “빌더를 고려하라”처럼 구체적인 권고사항 형태로 제목이 붙어 있다. 챕터 순서대로 읽지 않고 필요한 아이템만 골라 읽는 것도 가능한 구조다.

기억에 남는 아이템들

2장에서 정적 팩터리 메서드빌더 패턴을 소개하는 부분이 특히 인상 깊었다. 생성자 오버로딩을 남발하다 보면 어떤 매개변수가 어떤 의미인지 헷갈리기 쉬운데, 빌더 패턴이 이 문제를 얼마나 우아하게 해결하는지 다시금 실감했다.

7장 람다와 스트림 챕터는 자바 8 이후 코드를 작성하는 방식 자체를 바꿔놓는 내용이다.

람다는 익명 클래스보다 짧고 명확하다. 하지만 메서드 참조는 람다보다도 더 간결하게 표현할 수 있는 경우가 있다.

메서드 참조를 적극 활용하라는 아이템 43은 내가 평소에 익명 클래스나 람다를 습관적으로 쓰던 부분을 돌아보게 만들었다.

11장 동시성 챕터는 솔직히 말해서 쉽지 않았다. synchronized, volatile, wait/notify 같은 저수준 동시성 메커니즘을 다루는 내용은 여러 번 읽어야 제대로 이해할 것 같다. java.util.concurrent 패키지를 적극 활용하라는 조언은 현업에서도 공감이 간다.

내 생각

책을 읽으면서 계속 든 생각은 “나는 왜 이렇게 코드를 짜고 있었지?”였다. 아는 문법으로 돌아가는 코드를 짜는 것과, 왜 그렇게 짜야 하는지를 이해하고 짜는 것은 다르다는 걸 새삼 느꼈다.

물론 책의 모든 내용이 모든 상황에 정답은 아니다. 저자도 특정 패턴을 맹목적으로 따르라는 게 아니라 각 선택의 이유를 이해하라고 강조한다.

두꺼운 분량에 쉽지 않은 내용이지만, 자바를 주력으로 쓰는 개발자라면 한 번은 제대로 읽어둘 만하다. 특히 자바 8 이후를 기준으로 코드를 작성하고 있다면 3판으로 읽는 게 맞다.

References