조슈아 블로크 님의 "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까지 캐싱된 객체 반환
'Java' 카테고리의 다른 글
[Effective Java] 2-8. 객체 생성과 파괴: 소멸자 사용을 피하라 (3) | 2024.12.27 |
---|---|
[Effective Java] 2-7. 객체 생성과 파괴: 다 쓴 객체의 참조를 해제하라 (0) | 2024.12.27 |
[Effective Java] 2-5. 객체 생성과 파괴: 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (2) | 2024.12.27 |
[Effective Java] 2-4. 객체 생성과 파괴: 인스턴스화를 막으려거든 private 생성자를 사용하라 (1) | 2024.12.27 |
[Effective Java] 2-3. 객체 생성과 파괴: private 생성자나 열거 타입으로 싱글턴임을 보장하라 (0) | 2024.12.27 |