본문 바로가기

Language/Java Plus

Effective JAVA - Item6 : 불필요한 객체 생성을 피하라.

 

 

 

매번 객체를 생성하는 것보단 미리 만들어놓은 객체를 사용하는 것이 좋다

- 재사용은 빠르고 세련되다

- 불변 객체는 언제든 재사용이 가능하다.

 

 

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

 

GitHub - mokjaemin/EffectiveJAVA: Study Files Of Effective JAVA

Study Files Of Effective JAVA. Contribute to mokjaemin/EffectiveJAVA development by creating an account on GitHub.

github.com