[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
의 클래스 변수를 선언해서 재활용하는 방법을 고려해 볼 수 있다.
댓글남기기