🧐 똑같은 기능의 객체를 매번 생성하기 vs 객체 하나를 재사용하기
<aside>
👉
보통의 경우 **‘객체 하나를 재사용’**하는 방법이 더 낫다. 왜일까??
</aside>
예시 1: String은 문자열 리터럴 방식을 사용하여 초기화하자
String s = new String("bikini"); // bad 👎🏻
⇒ 똑같은 기능의 객체를 매번 생성
- 이 문장은 실행될 때마다 String 인스턴스를 새로 만듬. 이 문장이 반복문이나 빈번히 호출되는 메서드 안에 있다면 String 인스턴스가 수백만 개 만들어질 수도 있음
- 이는 완전히 쓸데없는 행위. 생성자에 넘겨진 “bikini” 자체가 이 생성자로 만들어내려는 String과 기능적으로 완전히 똑같기 때문
⇒ 개선을 해보자!
String s = "bikini";
- 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용함
- 이 방식을 사용한다면 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장됨
예시 2: 정적 팩터리 메서드 방식을 사용하자
- 생성자 방식:
Boolean(String)
- 정적 팩터리 메서드 방식:
Boolean.valueOf(String)
⇒ 불필요한 객체 생성을 피할 수 있음 ⭐️
예시 3: 생성 비용이 아주 비싼 객체를 반복해서 사용해야 한다면 캐싱해두고 재사용하자
static boolean isRomanNumeral(String s) {
return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}
- 이 코드의 문제점은?
- String.matches 메서드를 사용한다는 점
- 정확히는 그 안에 정규표현식에 집중해보자!