new String(“자바”) 을 사용하지 않고 문자열 리터럴 (“자바”)을 사용해 기존에 동일한 문자열을 재사용하 는 것이 좋다.
JVM은 문자열들을 constanct pool에서 caching하고 있다.
한번 만들어진 문자열들을 담아두고, 동일한 문자열을 참고할 때는 이미 만들어진 문자열을 참조해 재사용하게 한다.
정규식, Pattern
생성 비용이 비싼 객체(CPU resource)라서 반복해서 생성하기 보다, 캐싱하여 재사용하는 것이 좋다.
패턴을 컴파일해서 패턴 인스턴스를 만드는 과정이 비싼 과정
여러 번 사용될 패턴이라면 필드로 선언해두고 사용하는게 효율적이다.
오토박싱 (auto boxing)
기본 타입(int)을 그게 상응하는 박싱된 기본 타입(Integer)으로 상호 변환해주는 기술.
기본 타입과 박싱된 기본 타입을 섞어서 사용하면 변환하는 과정에서 불필요한 객체가 생성될 수 있다.
“객체 생성은 비싸니 피하라.”는 뜻으로 오해하면 안 된다.
일반적인 경우를 상정한 이야기가 아니다.
예시 코드
문자열
문자열 자체를 비교할 때는 equals 사용해서 문자열 자체가 같은지 확인 필요
public class Strings {
public static void main(String[] args) {
String hello = "hello";
// 권장하지 않는 방법
String hello2 = new String("hello");
String hello3 = "hello";
System.out.println(hello == hello2); // false
System.out.println(hello.equals(hello2)); // true
System.out.println(hello == hello3); // true
System.out.println(hello.equals(hello3)); // true
}
}
Auto Boxing
JVM이 runtime에 자동으로 진행
public class Sum {
private static long sum() {
// Long을 primitive type의 long을 사용하면 불필요한 객체 생성을 피할 수 있다.
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
public static void main(String[] args) {
long start = System.nanoTime();
long x = sum();
long end = System.nanoTime();
System.out.println((end - start) / 1_000_000. + " ms.");
System.out.println(x);
}
}
완전 공략
p31, 사용 자제 API (Deprecation)
p32, 정규 표현식
p32, 한 번 쓰고 버려져서 가비지 컬렉션 대상이 된다.
p33, 초기화 지연 기법 (아이템 83에서 다룸)
유효한 경우가 많지는 않지만, 인스턴스를 사용하는 시점 직전까지 인스턴스의 생성을 지연하는 기법 (조삼모사)
생성이 아주 무겁거나, 사용의 빈도가 매우 낮은 경우
p34, 방어적 복사 (아이템 50에서 다룸)
새로운 객체를 만들어야 한다면 기존 객체를 복사해서 사용하지 말고, 아예 새로운 객체를 만들라는 의미.
사용 자제 API (Deprecation)
클라이언트가 사용하지 않길 바라는 코드가 있다면...
사용 자제를 권장하고 대안을 제시하는 방법이 있다.
피치 못하게 API를 변경해야하는 경우가 발생할 수 있고, 그 때 사용자에게 전환의 시간을 주어야 할 필요가 있을 때 사용한다.
@Deprecated
컴파일시 경고 메시지를 통해 사용 자제를 권장하는 API라는 것을 클라이언트에 알려줄 수 있다.
forRemoval
@deprecated
문서화(Javadoc)에 사용해, 왜 해당 API 사용을 지양하며, 그 대신 권장하는 API가 어떤 것인지 표기할 수 있다.
정규 표현식
내부적으로 Pattern이 쓰이는 곳에 사용할 수 있다.
String.matches(String regex)
String.split(String regex)
대안, Pattern.compile(regex).split(str)
물론 "," 등의 간단한 split이라면 직접 입력하는 것이 성능이 동등하거나 더 빠르다.
아이템 6. 불필요한 객체 생성을 피하라
e.g. 동일한 일을 하는 녀석임에도 불구하고 사용할 때마다 객체를 생성하는 경우
예시 코드
문자열
문자열 자체를 비교할 때는 equals 사용해서 문자열 자체가 같은지 확인 필요
Auto Boxing
JVM이 runtime에 자동으로 진행
완전 공략
사용 자제 API (Deprecation)
클라이언트가 사용하지 않길 바라는 코드가 있다면...
정규 표현식
내부적으로 Pattern이 쓰이는 곳에 사용할 수 있다.
가비지 컬렉션
개념은 명확하게 알되, 더 깊게 공부할 필요가 있을 때 무얼 보아야할지 알아야한다.