재사용성을 고려하자

재사용은 빠르고 세련되다. 특히 불변 객체는 언제든 재사용할 수 있다.

예로, 아래와 같은 생성자가 있다고 해보자.

String str = new String("hello");

→ 이 코드가 만약 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없는 String 인스턴스가 수백만개 만들어질 것이다.

String str = "hello";

→ 이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용함으로써 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다.

비싼 객체는 캐싱해라

생성 비용이 아주 비싼 객체도 더러 있다. 문제는 자신이 만든 객체가 비싼 객체인지 매번 명확히 알 수 없다는 것이다!

예로, 문자열을 유효한 로마 숫자인지 확인하는 메서드를 작성한다고 해보자.

String.matches 는 문자열 형태를 확인하는 가장 쉬운 방법이지만, 성능이 중요한 상황에서 반복해 사용하기엔 적합하지 않다. 메서드 내부에서 생성하는 Pattern 인스턴스는 한 번 쓰고 버려져서 곧바로 가비지 대상이 된다. 무엇보다 유한 상태 머신(finite state machine) 을 만들기 때문에 인스턴스 생성 비용이 높다.

static boolean isRomanNumeral(String str) {
		return str.matches("~~~~");
}

<aside> <img src="/icons/checkmark_brown.svg" alt="/icons/checkmark_brown.svg" width="40px" />

유한 상태 머신; finite state machine, FSM