[Item6] 불필요한 객체 생성을 피하라

Sera Lee·2022년 2월 21일
0

EffactiveJava

목록 보기
5/9
post-thumbnail

개요

  • 똑같은 기능의 객체를 여러번 생성하기보다는 객체 하나를 재사용하는 편이 낫다.

잘못 사용한 예시

String s = new String("bikini");

==================================
// 하나의 String 인스턴스를 사용하는 방식으로 바꾼 올바른 예시
String s = "bikini";
  • String 인스턴스를 매번 새로 만드는 코드 이므로, 앱 내부에서 String 인스턴스가 수백만 개 가 만들어질 수 있다.

정적팩터리 메서드의 이점

[Item1] Constructor 대신 Static Factory Method를 고려하라 에서 정적 팩터리 메서드는

  • 인스턴스를 매번 생성할 필요가 없다
    • 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다.
    • 클래스 생성 통제가 가능하다(싱글톤)

위의 이점을 가진다.

Boolean(String) 의 생성자 대신 Boolean.valueOf(String) 팩터리 메서드를 사용하는 것이 좋다.

Box type 보다는 primitive type 을 권장한다

public static long sum() {
	Long sum = 0L;
	for(long i = 0;
			i<Integer.MAX_VALUE; i++) {
		sum += i;
	}
	return sum;
}
public static long sum() {
	long sum = 0L;
	for(long i = 0;
			i<Integer.MAX_VALUE; i++){
		sum += i;
	}
	return sum;
}
  • 하위 메서드가 상위 메서드에 비해 약 10배정도 빠르다.
  • 좌측 코드는 매번 sum에 더해질 때 마다 새로운 Long 객체가 생성이 된다.

Util Class 에서 또한 primitive type 을 권장한다.

public class PhonePatternUtil {
	...
	public boolean isValid(String phone) {
	}
}
  • 위 코드에서 굳이 참/거짓을 리턴하는데 Boxing type 을 리턴할 필요는 없다.
  • null 을 굳이 리턴할 일은 없으니까?

Boxing type 을 써야할 때

null 을 표현하고 싶을 때는 Boxing type 을 쓰는 것이 좋다.

int prive;

  • price 가 0 인 것과 null 인 것의 의미는 다르다.
  • null 의 경우 아직 가격이 정해지지 않았다고 생각 될 수도 있다.

주의해야 할 내장 Method

잘못된 예시

static boolean isEmailValid(String s) {
	return s.matches("[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}");
}

  • isEmailValid("lydia@gmail.com") 은 내부적으로 Patten.javamatches 를 수행하게 되는데, Pattern.complie(regex) 를 통해 매번 패턴에 대한 객체를 생성하게 된다.
  • isEmailValid 를 수행할 때마다 계속 똑같은 패턴의 인스턴스를 만들게 되는 것이다.

최적화된 Email 체크 예시

public class EmailUtil {
	private static fimal Pattern EMAIL =
		Pattern.complie("[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}");

	static boolean isEmilValid(String s){
		return EMAIL.matcher(s).matches():
	}
}
  • 내부적으로 Pattern instance 가 한번만 생성되도록 변경 되었다.

0개의 댓글