String str = new String("Hello");
String str2 = "Hello";
String str = new String("Hello");
가 실행될 때 마다 새로운 String 인스턴스를 만듭니다.
반면, String str2 = "Hello";
는 여러번 실행되어도 새로운 인스턴스를 만들지 않고 오직 하나의 String 인스턴스를 만듭니다.
위와 같은 이유로 자바9부터는 Boolean의 생성자가 deprecated되었습니다.
이는 불변객체 뿐 아니라 가변객체라고 하더라도 사용중에 변경되지 않는다는 것이 확실하다면 재사용 할 수 있습니다.
객체 생성 비용이 비싼경우 매번 생성하는 것 보다는 재사용하는 것이 더 좋을 수 있습니다.
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초가 걸립니다.
결론
무작정 "객체 생성은 비싸닌 피해야 한다."가 아닙니다. 프로그램의 명확성, 간결성, 기능을 위해서 객체를 추가로 생성하는 것은 일반적으로 좋은 일 입니다.
객체의 무작정적인 재사용은 프로그램의 버그와 보안구멍으로 이어지지만 불필요한 객체 생성은 성능에만 영향을 주므로 객체의 재사용은 매우 신중하게 사용해야 합니다.
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] Item 8. finalizer와 cleaner 사용을 피하라. (0) | 2022.05.15 |
---|---|
[Effective Java] Item 7. 다 쓴 객체를 참조 해제하라. (0) | 2022.05.15 |
[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용 (0) | 2022.05.14 |
[Effective Java] Item 4. 인스턴스화를 막으려면 private 생성자를 사용 (0) | 2022.05.14 |
[Effective Java] Item 3. private 생성자나 Enum타입으로 싱글턴임을 보증하라 (3) | 2022.05.13 |