Java

[Effective Java] 2-6. 객체 생성과 파괴: 불필요한 객체 생성을 피하라

noahkim_ 2024. 12. 27. 03:41

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.


1. String

new
  • 실행될 때마다 인스턴스를 생성함

 

literal
  • 생성된 인스턴스를 재사용
  • 상수 풀에 캐싱됨 (interned된 문자열만 관리)

 

2. 정적 팩토리 메서드

  • 팩토리 메서드는 호출할 떄마다 객체를 생성하지 않음
  • 가변객체이더라도 사용중에 변경되지 않는다면, 재사용이 가능함
  • 불필요한 객체 생성을 피할 수 있음

 

3. 캐싱

  • 생성 비용이 비싼 객체인 경우 캐싱하여 재사용

 

Pattern

public class RomanNumerals {
    private static final Pattern ROMAN = Pattern.complie(
            "^(?-.)M*(C[MD]|D?C{0,3})"
            + "(X[CL]|L?X{0,3}) (I[XV]|V?I{0,3|)$");

    static boolean isRomanNumeral(String s) {
        return ROMAN.matcher(s).matches();
    }
}
  • 컴파일 시에 내부적으로 유한 상태 머신을 생성함
  • 인스턴스 생성 비용이 높음

 

4. 오토박싱

  • 기본 타입과 박싱된 래퍼 타입을 섞어 쓸 때, 자동으로 상호 변환해주는 기술
  • 특정 래퍼타입의 특정 범위내 값은 캐싱됨
    • 불필요한 객체 생성을 방지함

 

Integer

Integer a = 127; // 오토박싱으로 Integer.valueOf(127) 호출
Integer b = 127; // 동일한 캐싱된 객체 반환
System.out.println(a == b); // true (같은 객체 참조)

Integer x = 128; // 오토박싱으로 Integer.valueOf(128) 호출
Integer y = 128; // 새로운 Integer 객체 생성
System.out.println(x == y); // false (다른 객체 참조)
  • -128~127까지 캐싱된 객체 반환

 

Long

Long a = 100L; // 오토박싱: Long.valueOf(100)
Long b = 100L;
System.out.println(a == b); // true (캐싱된 객체)

Long x = 1000L; // 오토박싱: Long.valueOf(1000)
Long y = 1000L;
System.out.println(x == y); // false (새로운 객체)
  • -128~127까지 캐싱된 객체 반환