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

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

by 돼지왕 왕돼지 2015. 4. 30.
반응형
불필요한 객체의 생성을 피하자.

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


-
불 필요한 객체 생성을 막기 위한 첫번째 좋은 방법은 static 팩토리 메소드를 사용하는 것이다.


-
불변객체가 아닌 가변객체더라도 상태가 변경되지 않는 것이 보장되면 재사용 가능하다.


-
재사용을 막기 위한 static 팩토리 메소드에서 늦 초기화 ( lazy initialization ) 을 하는 경우가 있는데,
후에 다루겠지만 두드러진 성능 개선이 나타나진 않고, 오히려 코드가 꼬일 가능성이 높다.


-
자바 1.5 이상 버전에서는 오토박싱( autoboxing ) 을 통해 불필요한 객체를 의도치 않게 생성하곤 한다.
기본형(primitive) 데이터를 박스화(boxed primitive) 클래스로 자동변환 하는 것을 오토박싱이라고 하며,
반대의 경우를 오토언박싱 ( autounboxing ) 이라고 한다.

오토박싱이나 오토언박싱이 생길 때는 성능 측면을 잘 고려해야 한다.
즉 의도하지 않은 오토박싱이 생기지 않도록 해야 한다.


-
우리가 직접 객체 풀 ( object pool ) 을 만들고 유지하여 객체 생성을 피하려는 방법은 좋지 않다.
풀에 유지할 객체들이 대단히 무거워 생성 비용이 많이 드는 것이 아니라면 복잡한 코드가 된다.
덧붙여 메모리 할당과 해지가 늘어나며 성능 저하가 나타나기 쉽다.
생성 비용이 많이 드는 대표적인 객체들은 데이터베이스 연결(connection)이다.


-
반대로 방어복사 ( defensive copying) 가 필요한 경우도 있다.
단, 방어복사를 잘못 사용했을 때 불이익은 중복 객체를 생성하여 받는 불이익보다 훨씬 크기 때문에 주의하자.


-
Summary
가급적 객체들을 불변객체로 만들어 재사용하라.
static 팩토리 메소드를 이용하여 쓸데없이 객체를 계속 만들지 말아라.
의도치 않은 오토박싱과 오토언박싱을 주의하라.
데이터베이스 연결과 같이 init 타임이 오래걸리는 경우를 제외하고는 가급적 object pool 을 스스로 만들고 관리하지 말아라.





반응형

댓글