Effective Java - item 6
불필요한 객체 생성을 피하라
Effective Java - item 6
불필요한 객체 생성을 피하라
똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 방법이 효율적이다. 우리가 썼을지도 모르는 안티 패턴의 한계와 개선점을 예를 들어 설명해보고자한다.
1. 문자열 객체 생성
1
2
3
4
5
6
7
8
9
//방법 1
String s = new String("hello");
String s2 = new String("hello");
System.out.println(s == s2);
//방법 2
String s = "hello";
String s2 = "hello";
System.out.println(s == s2);
1번의 방법은 새로운 String를 매번 생성하는 방법이기때문에 다른 문자열이 생성되어 똑같은 기능을 하더라도 다른 객체로 취급된다. 따라서 같은 기능을 가진 문자열은 리터럴로 작성하여 기존 객체를 재사용해야한다.
2. 정적 팩터리 메서드 활용
1
2
3
4
5
6
7
Boolean b1 = new Boolean("true");
Boolean b2 = new Boolean("true");
System.out.println(b1 == b2);
Boolean b1 = Boolean.valueOf("true");
Boolean b2 = Boolean.valueOf("true");
System.out.println(b1 == b2);
정적 팩터리 메서드를 활용하면 캐시된 객체를 재 사용할 수 있다.
3. 비싼 객체는 캐싱해서 재사용
1
2
3
4
5
6
7
8
9
public class EmailValidator {
public static boolean isValidEmail(String email) {
return email.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}");
}
}
for (int i = 0; i < 1000000; i++) {
EmailValidator.isValidEmail("test@example.com");
}
정규표현식과 같은 비용이 큰 Pattern 객체를 유효성 검증 때마다 생성하게 되면 성능이 매우 저하된다.
1
2
3
4
5
6
7
8
9
10
11
12
public class EmailValidator {
private static final Pattern EMAIL_PATTERN =
Pattern.compile("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}");
public static boolean isValidEmail(String email) {
return EMAIL_PATTERN.matcher(email).matches();
}
}
for (int i = 0; i < 1000000; i++) {
EmailValidator.isValidEmail("test@example.com");
}
따라서 Pattern.complile을 통해 비용이 큰 객체를 캐시해두고 이를 재 사용해야한다.
4. 오토박싱 주의하기
1
2
3
4
5
6
7
8
9
public static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
return sum;
}
1
2
3
4
5
6
7
8
9
public static long sum() {
long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
return sum;
}
박싱 클래스로 인해서 불필요한 객체가 생성되기떄문에 기본 타입을 사용해서 불필요한 객체의 생성을 방지해야한다.
마치며
이번 아이템은 객체 생성은 비싸니 피해야한다가 아니라 프로그램의 명확성, 간결성, 기능을 위해서 객체를 추가로 생성하는 것이 아니라면 지양하자는 이야기 이다. 데이터베이스의 연결 같은 경우 생성 비용이 워낙 비싸니 재사용하는 편이 낫다. 하지만 일반적으로 우리만의 풀을 만드는 것은 성능을 떨어뜨린다.
This post is licensed under CC BY 4.0 by the author.