이펙티브 자바 6

참치돌고래·2021년 9월 1일
0

이펙티브 자바

목록 보기
6/21
post-custom-banner

불필요한 객체 생성 지양


기능적으로 동일한 객체를 새로 만드는 대신 객체를 재사용하자. 불변 객체는 항상 재사용할 수 있다.

1. 문자열 객체 생성


String s = "bikini";

String 객체를 new를 통해 생성하면 항상 새로운 객체가 생성된다. 따라서 위와 같이 코드를 작성하여 String 객체를 작성하면, JVM은 동일한 객체를 불러 재사용할 수 있게 된다.


2. static 팩토리 메소드 사용


Boolean b = Boolean.valueOf("true");

Boolean.valueOf(String) 같은 static 팩토리 메소드를 사용할 수 있다.


3. 무거운 객체의 경우

만드는데 메모리나 시간이 오래 걸리는 객체는 캐시해두고 재사용할 수 있는지 고려하는 것이 좋다.

static boolean isRomanNumeral(String s){
	return s.matches("^(=?.)M(C[MD]|D?C{0,3})(X[CL]|L>X{0,3})(I[IX]|V?{0,3})$");
}

String.matches는 내부적으로 Pattern 객체를 만들어 쓰는데 이 객체를 만들려면 정규 표현식으로 유한 상태 기계로 컴파일 하는 과정이 필요해 무거운 객체이다.

성능을 개선하기 위해서 Pattern 객채를 만들어 재사용하는 것이 좋다.

public class RomanNumber{
	private static final Pattern Roman = Pattern.compile("^(=?.)M(C[MD]|D?C{0,3})(X[CL]|L>X{0,3})(I[IX]|V?{0,3})$");
    
    	static boolean isRomanNumeral(String s){
        	return ROMAN.matcher(s).matches();
        }
}

하지만, isRomanNumeral이라는 메소드가 호출되지 않는다면, ROMAN이라는 객체를 쓸데없이 만든 경우가 된다.


4. 어댑터

어댑터는 인터페이스를 통해서 뒤에 숨어있는 객체로 연결해주는 객체이기 때문에 여러개를 만들 필요가 없다.

Map 인터페이스가 제공하는 keySet은 Map 뒤에 있는 Set 인터페이스의 뷰를 제공한다. KeySet을 호출할 때마다 같은 객체를 리턴한다.

public class UsingKeySet{
	public static void main(String[] args){
    	Map<String, Integer> menu = new HashMap<>();
        menu.put("Burger", 8);
        menu.put("Pizza", 9);
        
        Set<String> names1 = menu.KeySet();
        Set<String> names2 = menu.KeySet();
        
        names.remove("Burger");
        System.out.println(names.size()); 
        // 1 
        
        System.out.println(names2.size());
        // 1
    }

}

5. 오토박싱

오토박싱은 프로그래머가 primitive 타입과 box타입을 섞어 쓸 수 있게 해준다.

오토 박싱은 primitive 타입과 box타입의 경계가 안보이게 해주지만, 그 경계를 없애 주지는 않는다.

public class AutoBoxingExapmle{
	public static void main(String[] args){
    	long start = System.currentTimeMillis();
        Long sum = 0l;
        for( long i = 0; i <=Integer.MAX_VALUE; i++){
        	sum += i;
        }
        System.out.println("sum");
        System.out.println("System.currentTimeMillis() - start");
    }
}

박스 타입보다는 프리미티브 타입을 사용하는 것이 좋다.

하지만, 객체를 재사용하게 되면 보안에 심각한 문제가 생길수 도 있다.

profile
안녕하세요
post-custom-banner

0개의 댓글