본문 바로가기
책 정리/이펙티브 자바

[이펙티브 자바] 불필요한 객체 생성을 피하라 - item 6

by chanwoodev 2023. 6. 20.

new String("Something")의 문제점

새로운 String 인스턴스를 만든다

이 문장이 수백 번 호출되면 수백 개의 인스턴스를 생성한다

 

String s = "Something";

위 방식은 하나의 String 인스턴스를 사용한다

참고: String pool - baeldung

 

String.matches의 문제점

static boolean isRomanNumeral(String s) {
	return s.matches("정규표한식");
}

String.matches 내부에서 Pattern 인스턴스를 생성 후 바로 버림

-> Pattern은 생성 비용이 높음

 

 해당 Pattern 인스턴스를 재활용한다면?

public class RomanNumerals {
	private static final Pattern ROMAN = Pattern.compile(
    	"정규표현식"
    );
    
    static boolean isRomanNumeral(String s) {
    	return ROMAN.matcher(s).matches();
    }
}

위 방식은 6.5배성능 개선이 있었다고 함 (출처: 이펙티브 자바)

 

오토 박싱

 

기본 타입과 boxing 타입을 섞어 쓸 때 자동으로 상호 변환해줌

 

성능상 문제 발생 상황

private static long sum() {
    Long sum = 0L;
    for (long i = 0; i <= Integer.MAX_VALUE; i++)
    	sum += i;
        
	return sum;
}

 

위 상황에서는 불필요한 Long 인스턴스가 231개 만들어짐

Long을 long으로 바꿀 시 6.3초 -> 0.59초로 빨라짐 (출처: 이펙티브 자바)

 

박싱된 기본 타입보다 기본 타입을 사용하고, 의도치 않은 오토 박싱이 숨어들지 않도록 해야함

 

주의! : "객체 생성은 비싸니 피해야 한다"가 아님

  • 객체 풀은 코드를 햇갈리게 만들고 메모리 사용량을 늘리고 성능을 떨어뜨리므로 꼭 필요할 때 사용할 것
  • JVM의 GC의 최적화가 잘 되어있음

예외 케이스: 생성 비용이 비싼 DB connection pool