본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Design Pattern/Java] 불필요한 객체의 생성을 피하자.

by 돼지왕 왕돼지 2012. 2. 10.
반응형


안녕하세요 돼지왕왕돼지입니다.
오늘은 불필요한 객체의 생성을 피하자. 라는 주제를 함께 알아보고자 합니다.
이 글은 "Effective Java" 내용을 기반으로 합니다.


불필요한 객체 생성을 왜 피하는가?


 기능적으로 동일한 객체를, 필요한 때마다 매번 새로 생성하기보다는 하나의 객체를 재사용하는 것이 좋을 때가 많습니다. 재사용을 하면 객체 생성에 소요되는 비용( 시간과 자원)이 절감되므로 실행 속도가 더 빨라지고 코드도 보기 좋게 작성할 수 있습니다.



불변 객체 ( Immutable object )

 
- 불변객체는 생성 후에는 변하지 않는 object 로, 언제든 재사용이 가능합니다.

- 불변객체의 불필요한 객체 생성을 막으려면 생성자보다는 static 팩토리 메소드를 사용하는 것이 좋습니다. ( Factory 에서 관리 )

- 가변객체 ( Mutable object ) 도 객체의 상태가 변경되지 않는다면 재사용 가능합니다.



오토박싱 ( Autoboxking ) 과 오토언박싱 ( Autounboxing )


- 오토박싱primitive type 을 박스화 기본형( boxed primitive ) 클래스 객체로 자동 변환해주는 기능을 말합니다. ( 예를 들면 boolean 을 Boolean 으로 )

- 오토언박싱은 반대로 박스화 기본형 클래스를 primitive 타입으로 자동 변환해주는 것입니다.

- 의도하지 않은 오토박싱은 엄청난 성능저하를 가져올 수 있습니다.

[성능저하를 가져오는 오토박싱이 잘못 사용된 예] 

   Long sum = 0L;
   for( long i=0; i < Integer.MAX_VALUE; i++ ){
        sum += i;
   }
   System.out.println( sum );


오토박싱으로 인해 Integer.MAX_VALUE 만큼 Long 객체를 만듭니다.



객체 풀 ( Object pool )


- 풀에 유지할 객체들이 대단히 무거워서 생성 비용이 많이 드는 것이라면 객체 풀을 생성하는 것을 고려할만 합니다.
  ( 예를 들면 Database Connection )

- 그렇지 않다면 피하는 것이 좋습니다. ( 코드 작성이 어렵고, 메모리 할당과 해지가 늘어나고, 성능을 저하시킬 수 있습니다. )



방어복사 ( defensive copying )


- 방어복사는 '불필요한 객체 생성을 피하자' 와 반대로, '새로운 것을 생성해야 한다면 기존 객체를 사용하지 말자' 입니다.

- 기존의 객체를 재사용함으로써 생기는 불이익보다는 중복 객체를 생성하는 것이 안전할 수 있다는 말입니다.
   객체 재사용은 잠재적 결함이 생길 수 있고, 보안에도 구멍이 뚫릴 수 있는 반면 defensive copying 은 코드 구성 형태나 성능에만 영향을 주죠.


로그인 없이 추천 가능합니다. 손가락 꾸욱~

반응형

댓글