[Java] 불필요한 객체 생성을 피하라

최대 1 분 소요

들어가며

불필요한 객체 생성을 알아보기 위한 포스팅이며 해당 게시글은 인프런 백기선 강사님의 이펙티브 자바 완벽 공략 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의 클래스 변수를 선언해서 재활용하는 방법을 고려해 볼 수 있다.

댓글남기기