Intro::
이펙티브 자바 정리본입니다.
String s = new String("bikini");
이 문장은 실행될 때마다 새로운 객체를 생성합니다.
String s = "bikini";
이 코드는 새로운 인스턴스를 만드는 대신 하나의 String 인스턴스를 사용합니다. 나아가 이 방식을 사용한다면 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장됩니다.
마찬가지로 생성자 대신 정적 팩토리 메서드를 제공하는 불변 클래스에서는 정적 펙터리 메서드를 사용해 불필요한 객체 생성을 피할 수 있습니다.
Boolean(String)// 대신 Boolean.valueOf(String)// 과 같이
생성자는 호출할 때 마다 새로운 객체를 만들지만, 정적 펙토리 메서드는 그렇지 않습니다.
종종 생성 비용이 비싼 객체도 더러 존재합니다. 이런 비싼 객체가 반복해서 필요한 경우 캐싱 통해 재사용하길 권장합니다.
불피요한 객체를 만들어내는 다른 예시로 오토박싱(auto boxing)이 있습니다. 오토박싱은 기본 타입과 그에 대응하는 박싱된 기본 타입의 구분을 흐려주지만, 완전히 없애주는 것이 아닙니다.
public class Sum { private static long sum() { Long sum = 0L; for (long i = 0; i <= Integer.MAX_VALUE; i++) sum += i; return sum; } }
위의 코드에서 sum 변수가 Long이어서 불필요한 인스턴스가 2^31만큼 만들어지게 됩니다.
정리
객체 생성은 비싸니 피해야 한다는것 이 아니다. 불필요한 객체 생성에 대해 주의하자는 의미이다. 또한 아주 무거운 객테가 아닌 다음에야 단순히 객체 생성을 피하고자 개인의 객체 풀을 만들지는 말자. 일반적으로 자체 객체 풀은 코드를 헷갈리게 만들고 메모리 사용량을 늘리며, 성능을 떨어뜨리기 때문이다…
References::
이펙티브 자바 / 조슈아 블로크 지음 (프로그래밍 인사이트)
Loading Comments...