Java ‐ 불필요한 객체 생성을 피하라[Effective Java Item 6] - dnwls16071/Backend_Summary GitHub Wiki
불필요한 객체 생성을 피하라.
- 똑같은 기능의 객체를 매번 생성하기보다 객체 하나를 재사용하는 편이 나을 때가 있다.
- 재사용은 빠르고 세련되다. 불변 객체의 경우 언제든 재사용할 수 있다.
// Bad
String s = new String("test");
- 위의 코드는 매번 String 인스턴스를 새로 만든다.
// Good
String s = "test";
- 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다.
- 이 방식을 사용하면 같은 가상 머신 안에서 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함을 보장한다.
- 생성자 대신 정적 팩토리 메서드를 제공하는 불변 클래스에서는 정적 팩토리 메서드를 사용해 불필요한 객체 생성을 피할 수 있다.
- 생성자는 호출할 때마다 새로운 객체를 만들지만, 팩터리 메서드는 전혀 그렇지 않다.
- 생성 비용이 아주 비싼 객체도 있는데 이런 비싼 객체의 경우 캐싱하여 재사용하길 권한다.
// Bad
static boolean isRomanNumberal(String s) {
return s.matches();
}
// Good
public class RomanNumerals {
private static final Pattern ROMAN = Pattern.compile(); // static으로 선언해 클래스 영역에 단 하나만 생성됨을 보장하도록
static boolean isRomanNumeral(String s) {
return ROMAN.matcher(s).matches();
}
}
// Ex
RomanNumerals.isRomanNumeral("test");
- 불필요한 객체를 만들어내는 또 다른 예로 오토박싱(Auto Boxing)을 들 수 있다.
- 오토 박싱은 프로그래머가 기본 타입과 박싱된 기본 타입을 섞어 쓸 때 자동으로 변환해주는 기술이다.
- 오토 박싱은 기본 타입과 박싱된 기본 타입을 섞어 쓸 때 자동으로 상호 변환해주는 기술이다.
- 오토 박싱은 기본 타입과 그에 대응하는 박싱된 기본 타입 구분을 흐려주나 완전히 없애주는 것이 아니다. 의미상으로는 다른 것이 없지만 성능에서는 그렇지 않다는 것을 기억해야 한다.
- 박싱된 기본 타입보다는 기본 타입을 사용하고 의도치 않은 오토박싱이 숨어들지 않도록 주의하자.