[Java] 불필요한 객체 생성을 피하라
들어가며
불필요한 객체 생성을 알아보기 위한 포스팅이며 해당 게시글은 인프런 백기선 강사님의 이펙티브 자바 완벽 공략 1부 강의를 바탕으로 쓰였음을 미리 밝힙니다.
기존 객체의 재활용
- String클래스의 경우- new연산은 객체를 생성할 때마다 새로운 메모리가 할당되지만 문자열 리터럴은 여러 개의 참조 변수가 같은 객체를 가리킨다.
- class파일이 클래스 로더에 의해 JVM에 올라갈 때 해당 클래스에 존재하는 리터럴이 JVM의 Heap 내 constant pool에 저장된다.
- 클래스 변수를 이용하여 불필요한 객체 생성을 줄일 수 있다. 예를 들어 같은 정규식을 적용하는 Pattern객체가 여러 번 사용되는 경우 클래스 변수로 사용하여 재활용할 수 있다.
- Wrapper class와 Primitive type의 연산의 경우 계산된 결과를 오토 박싱하여 참조 변수에 해당 객체를 할당한다. 여러 번의 불필요한 오토 박싱과 오토 언박싱은 성능을 저하시킬 수 있다.
정규 표현식
- String클래스의- matches(),- replaceAll(),- replaceFirst(),- split()메서드에서 정규식을 매개변수로 받는다.
- 모두 내부적으로 Pattern의 메서드를 이용한다. 따라서 자주 사용되는 메서드의 경우Pattern의 클래스 변수를 선언해서 재활용하는 방법을 고려해 볼 수 있다.
- split()의 경우 길이가 1이고 정규 표현식의 메타 문자가 아니거나 길이가 2이고 첫 번째 문자는 백슬래시이고 두 번째 문자가 문자, 숫자가 아닌 경우 fastpath가 존재한다고 한다. 이를 제외하고는 마찬가지로- Pattern의 클래스 변수를 선언해서 재활용하는 방법을 고려해 볼 수 있다.
 
      
    
댓글남기기