[책리뷰/Effective Java] 객체 생성과 파괴

OCTOBER 04, 2020

아이템6) 불필요한 객체 생성을 피해라

객체 재사용

String s = new String("data"); // bad
String s = "data"; // good
//bad
private static final String REGEX = ...;
static boolean isRomanNumeral(String s) {
  return s.matches(REGEX);
}

//caching - good
private static final String REGEX = ...;
private static final Pattern ROMAN = Pattern.compile(REGEX);
static boolean isRomanNumeral(String s) {
  return ROMAN.matcher(s).matches();
}

불필요한 객체를 만들어내는 예

1. Adapter (view)

  • 실제 작업은 뒷단 객체에 위임하고, 자신은 제2의 인터페이스 역할을 해주는 객체
  • Map 인터페이스의 keySet 메서드
Map<String, Integer> serviceSinceMap = new HashMap<>(); 
serviceSinceMap.put("Kakao", 2010); 
serviceSinceMap.put("Naver", 1999); 

Set<String> test1 = serviceSinceMap.keySet(); 
Set<String> test2 = serviceSinceMap.keySet(); 
test1.remove("Kakao"); 

System.out.println(test1 == test2); // true 
System.out.println(test1.size()); // 1 
System.out.println(test2.size()); // 1 
System.out.println(serviceSinceMap.size()); // 1

2. Auto Boxing

  • 프로그래머가 기본 타입과 박싱된 기본 타입을 섞어 쓸 때 자동으로 상호 변환해주는 기술
  • 박싱된 기본 타입(Long) 보다는 기본 타입(long) 을 사용한다.
Long sum = 0l; 
for (long i = 0 ; i <= Integer.MAX_VALUE ; i++) { 
  sum += i; // 불필요한 Long 인스턴스가 2^31개가 만들어짐 
} 

작업 기록 블로그