매번 객체를 생성하는 것보단 미리 만들어놓은 객체를 사용하는 것이 좋다
- 재사용은 빠르고 세련되다
- 불변 객체는 언제든 재사용이 가능하다.
1. 객체를 계속 생성하는 안좋은 예시
String badThing1 = new String("hello world");
String badThing2 = new String("hello world");
System.out.println(System.identityHashCode(badThing1));
System.out.println(System.identityHashCode(badThing2));
2. 만들어 놓은 객체를 다시 사용하는 예시
- 같은 가상머신내에서는 똑같은 문자열을 사용하는 모든 객체가 같은 객체를 공유한다.
String goodThing1 = "hello world";
String goodThing2 = "hello world";
System.out.println(System.identityHashCode(goodThing1));
System.out.println(System.identityHashCode(goodThing2));
3. 불변 클래스
- 생성자 대신 정적 팩터리 메서드를 통해 객체를 전달하는 불변 클래스
(불변 클래스 : 한번 생성되면 변하지 않는 클래스)
- 불필요한 객체 생성을 막는다.
// 생성자 사용해 객체 생성
Boolean value1 = new Boolean("true");
Boolean value2 = new Boolean("true");
System.out.println(System.identityHashCode(value1));
System.out.println(System.identityHashCode(value2));
// 정적 팩터리 메서드를 통해 기존에 생성된 객체 반환
Boolean value3 = Boolean.valueOf("true");
Boolean value4 = Boolean.valueOf("true");
System.out.println(System.identityHashCode(value3));
System.out.println(System.identityHashCode(value4));
4. 가변 클래스
- 가변 클래스라 하더라도 사용 중에 변경되지 않을 것이라는 것을 안다면 재사용이 가능하다.
- 특히나 생성비용이 큰 객체가 반복적으로 자주 사용되는 경우 캐싱해서 재사용하는 것이 좋다.
예시 1 : Pattern 클래스
- 생성비용이 커서 사용시마다 생성하는 것보다는 미리 만들어 놓고 재사용하는 것이 효율적
장점 : 속도 향상, 코드 명확
단점 : static으로 정의해두고 사용하지 않는다면 의미가 없다. -> null이라면 객체 생성으로 해결
예시 2 : 어댑터
- 실제 작업은 뒷단 객체에 위임하고 자신은 제 2의 인터페이스 역할을 하는 객체를 의미
- 가변 객체이지만 인스턴스를 하나만 두고 사용하는 경우
- map의 keySet() -> 항상 같은 인스턴스 반환
(+) 오토박싱 -> 불필요한 객체를 만드는 예시
- 프로그래머가 기본타입과 박싱된 기본타입을 섞어쓸 때, 자동으로 상호 변환해주는 기술을 의미
- 오토박싱은 기본 타입과 그에 대응하는 박싱 타입긔 구분을 흐려주지만 완전히 없애주는 것은 아니다.
- Long에 long을 더하면 시간이 굉장히 오래걸리는데 이유는 계속 Long 객체를 생성하기 때문이다.
결론
" 기존 객체를 재사용 해야한다면 새로운 객체를 만들지 마라 "
코드 정리
https://github.com/mokjaemin/EffectiveJAVA
'Language > Java Plus' 카테고리의 다른 글
Effective JAVA - Item8 : finalizer와 cleaner 사용을 피하라 (0) | 2023.09.13 |
---|---|
Effective JAVA - Item7 : 다 쓴 객체 참조를 해제하라 (0) | 2023.09.12 |
Effective JAVA - Item5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. (0) | 2023.06.22 |
Effective JAVA - Item4 : 인스턴스화를 막으려거든 private 생성자를 사용하라. (0) | 2023.06.10 |
Effective JAVA - Item3 : private 생성자나 열거 타입으로 싱클턴임을 보증하라. (0) | 2023.06.07 |