불필요한 객체 생성 피하기

똑같은 기능의 객체를 매번 생성하는 건 굉장히 비효율이다. 예를 들어서 String s = new String("HELLO");와 같은 경우는 String s = "HELLO";와 사실 똑같다. 차이점이라면 전자는 매 번 객체를 만들고 후자는 가상 머신 안에서 같은 문자열 리터럴을 사용할 경우 모든 코드가 같은 객체를 사용할 것을 보장한다.

다른 예로 정규표현식으로 검색하는 경우를 들 수 있는데 Pattern.compile()로 매 번 만들어 쓰는건 문제가 있다. 이 경우 패턴을 static으로 두고 사용하거나 하는 방법이 있다. 여기에 머리를 더 쓰면 lazy init을 할 수도 있긴 하지만 대부분의 경우 lazy initialization은 성능상 크게 개선되지 않고 코드는 복잡하게 할 가능성이 농후하므로 지양하는 것이 좋다.

알게 모르게 객체를 재생성할 수도 있다.

private static long sum () {
    Long sum = 0L;
    
    for ( long i = 0; i <= Integer.MAX_VALUE; i ++ ) sum += i;
    //이러면 += 1; 마다 인스턴스를 계속 생성한다.
    
    return sum;
}

이런 어이 없는 경우가 발생할 수도 있으니 주의하자.

불필요하게 객체를 낭비하는 것은 좋지 않다. 그렇다고 객체 생성을 지양하는 것이 좋다는 것이 아니다. JVM 발전으로 작은 객체 생성은 크게 부담되는 작업이 아니다. 따라서 코드 퀄리티를 높이기 위해서 하는 trade-off는 가치 있는 일이다.

반대로 너무 오버해서 Pool 등을 구성하는 극단적인 일도 지양하자. DB 커넥션의 경우 풀로 유지하는 것이 좋은게 맞다. 생성에 리소스가 어마무시하게 드니까. 그러나 비용이 작은 경우는 오히려 독이 된다.