카테고리 없음

| 불필요한 객체 생성을 피하라.

cozynow 2020. 7. 27. 22:34

1. 인스턴스를 사용하는 객체와 그렇지 않은 객체 생성방법 차이

//#1
String s = new String("Hello, World");

//#2
String s = "Hello, World"

1번 코드와 2번 코드의 역할은 같지만, 성능상의 차이는 존재한다.

String 은 immutable 객체 즉, 한번 선언되면 변할 수 없다.

 

이때, 1번 코드로 for 문을 여러번 돌리면 인스턴스가 그 수만큼 발생한다.

그러나 2번의 코드는 해당 인스턴스 값을 그대로 사용한다.

 

2. 때로는 값비싼 객체를 재사용해 선능을 개선할 수 있다.

//#1
static boolean isRomanNumber(String s){
	return s.matches("^(?=.)M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]V?I{0,3})$");
    
//#2
public class RomanNumber{
	private static final Pattern ROMAN = Pattern.compile("^(?=.)M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]V?I{0,3})$");
    
    static boolean isRomanNumber(String s){
    	return ROMAN.matcher(s).matches();
    }
 }

 

3. 의도하지 않은 Auto boxing 성능저하 발생

private static long sum(){
	Long sum = 0L;
    for(long i = 0 ; i <= Integer.MAX_VALUE ; i++)
    	sum += i;
        
       return sum;
  }

Long 과 long 객체의 사용 혼용으로 의도치 않은 오토박싱이 숨어져 있어 성능저하가  발생한다.

long i가 sum 에 더해질때마다, 오토박싱이 발생한다.

 

from 도서 이펙티브 자바, Item 6