본문 바로가기
Language/Java

Effective Java 2장 - Item6: 불필요한 객체 생성을 피하라

by limeeggpapa 2025. 6. 15.

아이템 6: 불필요한 객체 생성을 피하라

  • 핵심 개념

똑같은 기능의 객체를 매번 새로 생성하지 말고, 하나를 재사용하자는 원칙입니다. 특히 반복문 안에서 주의해야 합니다.

  • 장점
  1. 성능이 향상되고, 가비지 컬렉터의 부담을 줄여줍니다.
  • 단점

코드를 약간 더 신경 써야 하지만, 성능 향상 폭이 크다면 가치가 있습니다.

💡 예제 비교

❌ 잘못된 예

 

// 1. 비싼 객체를 반복해서 생성하는 경우
public boolean isRomanNumeral(String s) {
    // matches는 내부적으로 매번 Pattern 객체를 생성하고 버림. 매우 비효율적.
    return s.matches("^(?=.)M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}

// 2. 불필요한 오토박싱
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
    // 반복문이 돌 때마다 불필요한 Long 객체가 계속 생성됨
    sum += i;
}

⭕ 잘된 예

 

// 1. 비싼 객체는 한 번만 생성하여 재사용
public class RomanNumerals {
    // Pattern 객체는 비싸므로 static final로 캐싱하여 재사용
    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})$");

    public static boolean isRomanNumeral(String s) {
        return ROMAN.matcher(s).matches();
    }
}

// 2. 기본 타입을 사용하여 오토박싱 피하기
long sum = 0L; // Long 대신 long 사용
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
    sum += i;
}