반응형
안녕하세요 돼지왕왕돼지입니다.
오늘은 불필요한 객체의 생성을 피하자. 라는 주제를 함께 알아보고자 합니다.
이 글은 "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 은 코드 구성 형태나 성능에만 영향을 주죠.
로그인 없이 추천 가능합니다. 손가락 꾸욱~
반응형
'프로그래밍 놀이터 > 디자인 패턴, 리펙토링' 카테고리의 다른 글
[Design Pattern/Java] finalizer ( 파이널라이저 ) 사용을 피하자. (0) | 2012.02.13 |
---|---|
[Design Pattern/Java] 쓸모 없는 객체 참조를 제거하자. (0) | 2012.02.10 |
[Design Pattern/Java] private 생성자를 사용해서 인스턴스 생성을 못하게 하자. (0) | 2012.02.10 |
[Design Pattern/Java] private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. (0) | 2012.02.10 |
[Design Pattern/Java] 생성자의 매개변수가 많을 때는 빌더(Builder) 를 고려하자. (1) | 2012.02.10 |
댓글