기능적으로 동일한 객체는 필요한 때마다 만드는 것보다 재사용하는 편이 낫다. 절대로 피해야 하는 극단적인 예.

 위의 문장은 실행될 떄마다 String 객체를 만드는데, 쓸데없는 짓이다. String 생성자에 전달되는 "test"는 그 자체로 String객체이기 때문인데, 이러한 문장이 반복문안에서 실행될 경우 쓸데없는 String객체가 생성되게 되는 것이다. 아래와 같이 고치는 것이 옳다.

생성자 대신 정적 팩터리 메서드를 이용하면 불필요한 객체 생성을 피할 수 있을 경우가 많다. 생성자는 호출할 때마다 새 객체를 만들지만, 정적 팩터리 메서드는 그럴 필요도 없고 실제로 그러지도 않을 것이기 때문이다.

 또 한가지 예를들면, 아래와 같은 베이비붐 세대의 사람인지 판별하는 메서드가 있다고 치자. 

 위의 보인 isBabyBoomer 메서드는 호출될 때마다 Calendar 객체 하나, TimeZone 객체 하나, 그리고 Date 객체 두 개를 쓸데없이 만들어 댄다. 이렇게 비효율적인 코든느 정적 초기화 블록을 통해 개선하는 것이 좋다. isBabyBoomer가 자주 호출되는 메서드였다면 성능은 크게 향상될 것이다.


또한 자동 객체화(AutoBoxing)에 대해서도 조심하여 사용하여야 한다.

 위 코드의 문제점은 무엇일까? sum이 long이 아니라 Long으로 선언되어 있는데 , 그 덕에 Integer.MAX_VALUE의 수만큼 Long객체가 생성되는 문제점이다. 객체 표현형 대신 기본 자료형을 사용하고, 생각지도 못한 자동객체화가 발생하지 않도록 유의해야 한다.

 그러나 객체를 만드는 비용이 높으니 무조건 피하라는 것이 아니고, 객체를 만들어서 코드의 명확성과 단순성을 높이고 프로그램의 능력을 향상시킬 수 있다면, 일반적으로는 만드는 것이 좋다.

 마찬가지로, 직접 관리하는 객체 풀을 만들어서 객체 생성을 피하는 기법은 객체 생성 비용이 극단적으로 높지 않다면 사용하지 않는 것이 좋다. 객체 풀을 만드는 비용이 정당화 될 만한 객체의 예로 가장 고전적인 것은 데이터베이스 연결이다.

+ Recent posts