본문 바로가기

programming/java

Item 6. 불필요한 객체 생성을 피하라

[Why]

  • 객체의 생성 비용이 비싸기 때문에.

[When]

  • 객체의 생성 비용이 어플리케이션의 성능에 큰 영향을 미칠 때
  • 객체 재사용의 이득이 객체 재생산의 이점(유지보수성, jvm 최적화된 객체 생성 시간)보다 큰 경우

[How]

  • 객체 풀에 객체를 등록하고 사용할 때 객체 풀에 객체를 꺼내서 사용한다.

[Example]

  1. Pattern
    Pattern 객체 생성 비용이 크기 때문에 이점이 있다.
  • before
static boolean isRomanNumeral(String s){
    return s.matches("^(?=.)M*(C[MD]|D?C{0,3}" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}
  • after

    public class RomanNumerals{
      private static final Pattern ROMAN = Pattern.compile("^(?=.)M*(C[MD]|D?C{0,3}" 
              + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
    
      static boolean isRomanNumeral(String s){
          return ROMAN.matcher(s).matches();
      }
    }
  1. Wrapper class
    오토박싱으로 인해서 Long 객체가 불필요하게 재생산되어 성능이 저하된 경우
  • before
    private static long sum(){
      Long sum = 0L;
      for (long i = 0; i <= Integer.MAX_VALUE; i++){
          sum += 1;
      }
      return sum;
    }
  • after
    private static long sum(){
      long sum = 0L;
      for (long i = 0; i <= Integer.MAX_VALUE; i++){
          sum += 1;
      }
      return sum;
    }