실로 오랜만에 적는 독후감(?)이다. 그 동안 이런저런 책을 읽었지만, 독후감을 써야겠다는 생각을 가지게 되는 책이 오랜만에 나타났다.

Deview 2014에 참관하러 갔다가 부스에 계신 인사이트 대표님께 인사드리면서 이야기를 하다가 가판대에 놓여있는 이 책을 발견했다. 이미 대웅에서 나온 책을 가지고 있던 상태여서 잠시 망설였지만, SNS으로 알고 계신 이병준님이 번역(http://www.buggymind.com/559)하시기도 했고 Java 7, 8 주석도 수록했다는 문구에 혹해서 그 자리에서 바로 구매했다. 결코 강요에 의해 구매한 것은 아니다.

프로그래밍을 하게 되면, 자신이 사용하고 있는 프로그래밍 언어와 관련해서 기본을 되짚어 보는 의미로 일년에 한두번 정도 읽어줘야하는 책들이 있다.



자바 쪽에서는 ‘클린코드‘, ‘Effective Java‘, ‘토비의 스프링‘ 등이 있다. Effective Java는 OO출판사에서 나온 것이 있고, 인사이트에서 이번에 출간했다. 00출판사의 서적경우에는 번역이 워낙 거시기해서 원서를 보는 것이 낫다는 평이 많은 편이다. 나 역시 읽어도 내가 읽고 있는 것이 글인지 싶을 만큼 몇줄 읽어내려가다보면 어디를 읽었는지 되짚어야할 만큼 집중도가 뚜욱 떨어진다.

인사이트에서 나온 ‘Effective Java 2nd’는 읽으면서 여러모로 흡족했다. 책크기나 종이재질도 그렇고 폰트도 그렇고.
나는 책에 줄을 치면서 책을 보는데, 책의 본문에 중요하다고 생각되는 문장마다 굵은 글씨 처리가 되어 있어서 줄을 치는 횟수가 많이 줄었다.



어쩌면 내가 허투로 보면서 넘어갈만한 요소들에도 굵은 글씨 처리가 되어 집중하게 된다. 사실 이렇게 책의 중요부분마다 굵은 글씨처리 해주는 것이 사소한듯 하지만 손이 많이 가고 번거로운 작업을 요구한다. 번역자가 그 책을 읽는 분들에게 중요하다고 알려주고 있는 것이다. 내 스타일에는 잘 어울린다.



자바 코딩과 관련된 규칙의 끝날 즈음에는 ‘요약하자면’ 으로 규칙의 내용을 간결하게 한단락으로 정리해주는 부분이 있다. 규칙을 읽어가다보면 이해가 어려웠던 부분도 ‘요약하자면’ 단락을 읽으면서 정리할 수가 있다. 쪽집게 과외 선생님이 콕하고 찝어주는 느낌이랄까?

프로그래밍을 처음 시작하면 예제를 따라서, 다른 사람의 코드를 따라서 혹은 자신만의 방법으로 코딩을 익히고 배우면서 프로그래밍을 익혀나가게 된다. 이러다보면 우리는 종종 그 프로그래밍 언어가 가지고 있는 장점과 단점, 권고사항 등을 제대로 따르지 않게되는 나쁜 습관을 가지게 되는 경우가 있다. 프로그래밍 언어에서 별다른 오류없이 컴파일되고 실행되니까 자기만의 방법으로 코딩하게 된다. 그러다보면 나쁜 냄새를 뿜어내는 프로그램이 만들어지게 될 것이다.

자바 프로그래밍을 하면서 빠지기 쉬운 착오나 자주하게 되는 실수를 짚어준다. hashCode() 메서드를 오버라이딩하면 equals() 메서드도 함께 오버라이딩 해야한다는 규칙(IDE를 사용하면 동시에 생성하도록 강제되어 있다)이라던지 등의 자바 프로그래밍과 관련된 다양한 이야기와 지식이 담겨 있다.

요약하자면, 자바 프로그래밍을 하는 이라면 책장에 꽂아두고 일년에 두번씩은 읽어줘야할 그런 책이다. 책 여기저기에 스며있는 역자의 풍부한 프로그래밍 지식이 잘 스며든 명작이 탄생했다.

꼭 사라~ 반드시 사라~




이펙티브 자바(EFFECTIVE JAVA)

저자
JOSHUA BLOCH 지음
출판사
대웅 | 2009-04-13 출간
카테고리
컴퓨터/IT
책소개
더 명쾌하고, 더 정확하고, 더 강력하고, 재사용 가능한 코드를...
가격비교 글쓴이 평점  


이펙티브 자바를 읽다가

static 팩토리 메소드의 네 번쨰 장점 중 하나인, 매개변수화 타입parameterized type의 인스턴스를 생성하는 코드를 간결하게 해준다.

는 내용을 보고, 문득 구글 Guava Library의 Maps, Lists 클래스를 떠올렸다. 아무런 생각없이 무심코 사용하던 녀석들이었는데…


자바에서는 인스턴스를 생성할 때 클래스의 생성자를 호출해주어야 한다.

Map<String, Object> map = new HashMap<String, Object>();

위의 map 인스턴스를 생성하는 코드를 guava 에서는 아래와 같은 형태로 선언하여 사용가능하다.

Map<String, Object> map = Maps.newHashMap()

앞선 기존 방식의 인스턴스에 비해 guava의 Maps를 통해 얻을 수 있는 이점은 <String, Object> 매개변수화 타입을 선언하지 않아도 된다는 것이다. 어떻게 보면 미묘한 차이지만, 번거로운 타이핑을 줄일 수 있다는 것만으로도 큰 이득이다. 아마 Maps.newHashMap() static 메소드는 다음과 같은 형태를 띄고 있을 것이다.

public static <K, V> HashMap<K,V> newHashMap() {
    return new HashMap<K, V>();
}


실제코드는 Maps.java - guava-library 에서 살펴볼 수 있는데, 실제코드를 살펴보면

 /**
   * Creates a <i>mutable</i>, empty {@code HashMap} instance.
   *
   * <p><b>Note:</b> if mutability is not required, use {@link
   * ImmutableMap#of()} instead.
   *
   * <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link
   * #newEnumMap} instead.
   *
   * @return a new, empty {@code HashMap}
   */
  public static <K, V> HashMap<K, V> newHashMap() {
    return new HashMap<K, V>();
  }

으로 되어 있는 것을 볼 수 있다. 아직까지 JDK7(HashMap - openjdk 7) 까지도 이런 형태의 static 팩토리 메소드를 가지고 있지 않다. 딱히 나올 것 같아보이지도 않긴 하다. static 팩토리 메소드는 개발자의 몫이니까…

편하게 Guava를 가져다 사용하던가, 필요한 부분만 개발자가 구현해서 사용하던가…


참고

  • Google guava

    The Guava project contains several of Google’s core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth.

    구글에서 제공하는 라이브러리로, 나는 collections 에 대한 처리용도로만 사용을 했었는데… 생각보다 지원하는 기능이 다양하다…!


+ Recent posts