Yomni's TIL Help

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

객체 생성은 많은 비용이 든다. 때문에 가능한 한 불필요한 객체 생성을 피하고, 재사용 할 수 있는 객체를 활용해야 한다.

1. 불필요한 객체 생성을 피하는 이유

  • 메모리 절약 : 불필요한 객체를 생성하지 않으면 메모리 사용을 최적화 할 수 있다.

  • 성능 향상 : 객체 생성과 가비지 컬렉션의 비용을 줄여 성능을 향상시킬 수 있다.

2. 기존 객체의 재사용

필요할 때마다 객체를 새로 생성하지 말고, 이미 존재하는 객체를 재사용하는 것이 좋다.

// ex : 자주 사용되는 문자열을 상수로 선언하여 재사용 public class Example { public static final String CONSTANT_STRING = "This is a constant string"; public void printString() { String str = CONSTANT_STRING; // 객체 재사용 System.out.println(str); } }

3. 불변 객체의 활용

불변 객체(immutable object)는 재사용이 안전하므로, 가능하면 불변 객체를 사용하여 객체 생성 횟수를 줄일 수 있다.

// ex : Boolean 클래스의 valueOf 메서드 --> 새로운 객체를 생성하지 않고 기존 객체를 재사용한다. Boolean trueValue = Boolean.valueOf(true); Boolean falseValue = Boolean.valueOf(false);

4. 생성 비용이 큰 객체의 캐싱

생성 비용이 큰 객체는 캐싱을 통해 재사용 할 수 있다.

import java.util.regex.Pattern; public class RegexExample { private static final Pattern PATTERN = Pattern.compile("a*b"); public boolean matches(String input) { return PATTERN.matcher(input).mathces(); // 새로운 객체를 생성하지 않고 재사용 } }

5. 오토박싱(auto-boxing) 주의

원시 타입(Primitive type) 과 박싱된 기본 타입간의 자동변환(오토박싱)을 사용할 때 불필요한 객체가 생성 될 수 있다.
가능한 한 기본 타입을 사용하여 불필요한 객체 생성을 피한다.

// ex : 오토 박싱으로 불필요한 객체 생성 public class AutoBoxingExample { public static void main(String[] args) { Long sum = 0L; for (long i = 0; i < Integer.MAX_VALUE; i++) { sum += i; // 매 반복마다 Long 타입으로 객체가 생성된다. } System.out.println(sum); } } // 개선하기 public class AutoBoxingExample { public static void main(String[] args) { long sum = 0L; for (long i = 0; i < Integer.MAX_VALUE; i++) { sum += i; // 불필요한 객체 생성 없이 기본 타입으로 연산 } System.out.println(sum); } }

요약

  • 객체 생성을 기계적으로 피하자는 것은 아님

    • 최근 JVM 에서는 객체 생성과 파괴가 크게 부담은 아님

  • 프로그램의 명확성, 간결성, 기능을 위해서 객체를 추가로 생성하는 것이라면 이는 지양

  • 객체 풀(pool)을 만드는 것은 지양

    • 스레드 풀 / 커넥션 풀 등은 논외

  • 아이템 50 프리뷰

    • 기존 객체를 재사용해야 한다면 새로운 객체를 만들지 마라

    • 새로운 객체를 만들어야 한다면, 기존 객체를 재사용하지 마라

Last modified: 14 October 2024