스터디/이펙티브 자바

[Effective Java] Item 6. 불필요한 객체 생성을 피하라

📝 작성 : 2022.05.15  ⏱ 수정 : 
728x90
String str = new String("Hello");
String str2 = "Hello";

String str = new String("Hello");가 실행될 때 마다 새로운 String 인스턴스를 만듭니다.
반면, String str2 = "Hello";는 여러번 실행되어도 새로운 인스턴스를 만들지 않고 오직 하나의 String 인스턴스를 만듭니다.

위와 같은 이유로 자바9부터는 Boolean의 생성자가 deprecated되었습니다.

자바9버전(생성자 대신 valueOf메서드를 사용하라고 합니다.)

이는 불변객체 뿐 아니라 가변객체라고 하더라도 사용중에 변경되지 않는다는 것이 확실하다면 재사용 할 수 있습니다.
객체 생성 비용이 비싼경우 매번 생성하는 것 보다는 재사용하는 것이 더 좋을 수 있습니다.

static boolean isRomanNumeral(String s) {
    return s.matches("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$");
}

//개선
private static final Pattern ROMAN = Pattern.compile("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$");

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

오토박싱도 불필요한 객체를 만들어내는 또다른 예 입니다.

Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
    sum += i;
}
System.out.println("sum = " + sum);

약 5.5초가 걸립니다. 여기서 sum을 long으로 바꾸면 0.85초가 걸립니다.

결론

무작정 "객체 생성은 비싸닌 피해야 한다."가 아닙니다. 프로그램의 명확성, 간결성, 기능을 위해서 객체를 추가로 생성하는 것은 일반적으로 좋은 일 입니다.
객체의 무작정적인 재사용은 프로그램의 버그와 보안구멍으로 이어지지만 불필요한 객체 생성은 성능에만 영향을 주므로 객체의 재사용은 매우 신중하게 사용해야 합니다.

반응형