IT 관련 책 정리 및 후기/Java Effective E3

[ITEM 6] 불필요한 객체 생성을 피해라

JUN0126 2022. 5. 19. 01:17

똑같은 기능의 객체 생성

- 똑같은 기능의 객체를 매번 생성하기 보다는 객체 하나를 재사용 하는 편이 나은 경우가 많다.

 

EX)

 String s = new String("lee");

 -> 실행될 떄마다 String 인스턴스를 새로 만든다. 단순 lee라는 문자열을 반환하는 것임에도 불구하고 불필요한 인스턴스 생성이 일어남

 String s = "lee";

 - 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다.

 

생성비용이 비싼 객체 

- 반복이 필요하다면 캐싱하여 재사용 권장

- 객체 생성 비용이 비싼 객체의 인스턴스를 사용하는 클래스의 초기화 과정에서 직접 생성하여 캐싱함

private static final Pattern ROMAN = Pattern.compile("정규식")

static boolean isRomanNumeral(String s){
	return ROMAN.mathcher(s).matches();
}

 위 코드에서 Pattern객체는 성성 비용이 비쌈으로 최초에 생성한 후 isRomanNumeral을 호출할때 캐싱해놓은

인스턴스를 사용하여 메소드를 작성하여 해당 메소드를 호출하여 사용한다.

 

 

객체가 불변이라면 재사용해도 안전함이 명백하다.

 

 

오토박싱 (AutoBoxing)

- 프로그래머가 기본 타입과 박싱된 기본 타입을 섞어 쓸 떄 자동으로 상호 변환해주는 기술이다.

- 박싱되었다는 래핑(Wrapping) 되어 선언된 변수와 같은 의미라고 생각함 맞나?

- 기본 원시 타입과 박싱된 타입을 같이 사용하면 불필요한 오토 박싱이 일어나므로 박싱된 기본타입보다는

  일반적인 원시 기본 타입을 사용하고, 의도치않은 오토박싱이 숨어들지 않게 주의하라

 

객체를 추가로 생성하는 경우

 - 프로그램의 명확성, 간결성, 기능을 위해서 객체를 추가로 생성하는 것이라면 일반적으로 좋은 일

 - 단순히 객체 생성을 피하고자 본인만의 객체 풀을 만들지는 말자

 

객체 풀(Object pool)

 - 객체를 매번 할당, 해제하지 않고 고정 크기 풀에 들어있는 객체를 재사용함으로써 메모리 사용 성능을 개선

 

방어적 복사가 필요한 상황에서 객체를 재사용했을 때의 피해가, 필요없는 객체를 반복 생성했을 때의 피해보다

훨씬 크다.

 

참조된 Item

- 정적 팩터리 메서드 [Item 1]

- 방어적 복사 [Item 50]

- 지연 초기화 [Item 67]

- 오토박싱 [Item 61]