자바 성능을 결정짓는 코딩 습관과 튜닝 이야기 오류 프로그래밍

가볍게 읽을 수 있는 자바 튜닝 이야기 이다.
생각보다 깊이는 없다. 그리고 매우 술술 읽히는 책이다.
하지만 자바 개발자들이 꼭 알아야할 내용을 포함하고 있으므로 한번쯤은 읽어봐야 한다.

이 책에 나온 오류 몇 가지를 짚어보았다.

  • 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기

    자바 성능을 결정짓는 코딩 습관과 튜닝 이야기 - Blog2Book 시리즈 03

    • 저자 : 이상민 지음
    • 출판사 : 한빛미디어
    • 발행일 : Thu, 28 Feb 2008 15:00:00 GMT
    • ISBN : ISBN8979145225

  • 204쪽 close 예제

    204쪽의 잘만들어진 close 예제라고 나온 소스는 사실 잘못된 것이다. 물론 그정도만 해도 일반적으로는 문제되는 경우가 거의 없다. 그러나 어쨌든 오류의 가능성이 있다. Java 리소스 닫기(Resource Close)를 제대로 하려면..을 참조하여 제대로 사용하기 바란다. 그리고, 이 책에 나온 방식으로 리소스를 close() 했다가 리소스 누수가 발생한 예를 Release It! 책에서 볼 수 있다.

  • static과 유사한 문제가 있는 Servlet/JSP의 싱글턴 인스턴스 문제

    그리고 안타까운 점 하나가 더 있다. Servlet/JSP 관련한 내용에서 Servlet과 JSP가 싱글턴으로 생성됨으로 인해 static을 사용할 때와 유사한 문제가 발생한다. 이것도 자바 웹 개발자들은 꼭 알아야 하는데, static에 관해서만 다루고 이 문제는 다루지 않고 있다. 꼭, 이원영님이 쓰신 서블렛 + JDBC 연동시 코딩 고려사항 시리즈를 읽고 숙지해야만 한다.

  • 304쪽 if 문 연속

    304쪽의 안쪽 if 문은 if {} else if {} 로 바꾸어야 불필요한 if 조건 비교가 일어나지 않는다. 안쪽 if 의 첫번째 조건이 만족되면 두 번째 조건은 절대로 만족될 수 없는데도 불구하고, else 를 안써서 쓸데없는 비교를 하게 만든 코드이다.
    즉, 다음과 같이 변경한다.
    if (arrObj[i][0].equals("AAA")) {
    } else if (arrObj[i][0].equals("BBB")) {
    }

  • 308쪽 생성자를 통한 초기화 보다는 static 초기화로

    308쪽, 생성자에서 하는 일을 사실은 static {} 초기화 구문으로 해야한다. 생성자에서 사용하는 변수들을 살펴보면 모두 static 이거나 static final 인것을 알 수 있다. 이런 값들에 대한 처리를 생성자에서 할 필요는 전혀 없다. static 초기화 구문을 사용하면 JVM이 이 클래스를 인지하는 그 순간 단 한 번만 실행되므로 더욱 성능이 향상된다.
    생성자를 없애고, 생성자에 있는 내용을 다음과 같이 변경한다. 물론 static {} 안에서 호출하는 메소드들도 모두 static으로 바꿔야 한다.
    static {
    loggerMap = new HashMap();
    setLoggerMap(defaultLoggerCategoryNm);
    }

    그리고 근본적으로 불필요하게 Log 관련 클래스를 만들지 말라.
    Log4JCommons Logging 같은 이미 너무도 훌륭한 것들이 잔뜩 나와있는데 불필요한 삽질을 반폭할 필요가 없다.

  • 314쪽 Vector는 되도록 사용하지 말 것

    314쪽, Vector는 Java 1.0 대에서도 있던 것이다. Vector와 Hashtable, Enumeration등은 Collection API가 나온 이후로는 사용해서는 안되는 기피 대상 클래스들이다. Java 1.2 이후부터는 무조건 Vector 대신 ArrayList, Hashtable 대신 HashMap, Enumeration 대신 Iterator를 사용해야 한다고 보면 된다.

이 리스트는 롤링리스트에서 작성되었습니다.


덧글

  • 2008/05/07 16:59 # 삭제 비공개

    비공개 덧글입니다.
  • 권남 2008/05/07 22:24 #

    Vector와 Hashtable은 동기화가되어있는 클래스입니다. 하지만 웹 애플리케이션을 작성하면서 여러 쓰레드에서 일반적인 객체(특히 프레임워크가 아닌 개발자가 쿼리등을 통해 생성한 객체)에 접근할 일은 거의 없습니다. 만약, 의도하지 않게 그런일이 있다면, 그것은 객체가 동기화가 되어있든 안되어 있든 상관없이 버그일 확률이 높습니다.

    따라서, 웹 개발을 하면서 불필요하게 객체를 여러 쓰레드에서 사용하지 말아야하며,(이는 위에 있는 링크 http://www.javaservice.net/%7Ejava/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=968185187&k=JDBC&d=tb#968185187 참조) 설혹 있더라도 java.util.Collectioins.synchronizedList 등을 사용해서 동기화된 Map,List 등을 생성하는 것이 좋습니다. ( http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#synchronizedCollection(java.util.Collection) 참조)

    그리고, 이 책에도 계속 나오지만 불필요한 동기화(synchronized)를 하는 것은 속도를 떨어뜨리는 행위 입니다. Vector와 Hashtable은 필요여부와 상관없이 동기화를 하기 때문에 조금 느리지 않을까요? - Thinking in Java 에서 보면 Vector/Hashtable이 실제로는 그다지 느리지는 않다고 그러나 사용해서는 안된다고 나옵니다.
  • 2008/05/07 23:01 # 삭제 비공개

    비공개 덧글입니다.
  • 2013/01/12 23:40 # 비공개

    비공개 덧글입니다.
  • 2013/01/13 17:23 # 비공개

    비공개 답글입니다.
※ 로그인 사용자만 덧글을 남길 수 있습니다.