반응형
스프링 컨테이너는 기본적으로 싱글톤 패턴이기 때문에 불필요한 객체 생성을 피하도록 구현되어 있다.
다만 개발자가 임의적으로 만드는 bean이 아닌 클래스에서는 싱글톤임을 보증하지 못하는 클래스로 구현할 때가 많은데 이런 부분은 클라이언트 쓰레드마다 무분별하게 객체 생성이 이루어진다(자바 엔터프라이즈 개발에서 스프링 프레임워크가 만들어진 이유이기도 하다.)
한번 쓰고 버려진 객체들은 가비지 컬렉션 대상이 된다.
public class RomanNumerals{
private static final Pattern ROMAN =
Pattern.compile("^(?=[MDCLXVI])M*D?C{0,4}L?X{0,4}V?I{0,4}$");
public static boolean isRomanNumeral(String s){
return ROMAN.matcher(s).matches();
}
}
위처럼 static을 이용해 변수를 설정하는 것도 무분별한 객체 생성의 속도를 막는 역할을 한다. 객체를 아무리 생성한들 static은 메모리에 올라갈 때 한번 올라가기 때문에 초기화가 한번만 이루어진다. 책에서는 static을 쓰고 안쓰고의 차이의 속도를 무려 6배라고 표현하고 있다.
원시 타입과 Wrapper 클래스
자바를 배울 때 초기에 int과 Integer를 본 적이 있을 것이다. 이해가 안된 상태로 넘어가기도 한다. 기본적으로 int는 원시타입 Integer는 Wrapper 클래스로 박싱된 래퍼 클래스라고 불린다.
클래스는 기본적으로 이용할 수 있는 메소드가 많은 장점이 있다.
private static long sum(){
Long sum = 0L;
for(long i = 0;i<=Integer.MAX_VALUE;i++){
sum += i;
}
return sum;
}
Long은 long과 다르게 래퍼 클래스를 이용한다. 클래스의 메소드를 이용하는게 아닌 불필요한 객체 생성의 대표적인 예이다. 문자 하나로 속도 차이가 심하게 날 수 있으므로 유의해서 사용하자.
728x90
'📘 Effective Java' 카테고리의 다른 글
[Item 9] try-finally보다는 try-with-resources를 사용하라 (0) | 2022.09.03 |
---|---|
[Item 7~8] 다 쓴 객체 참조를 해제하라, finalizer와 cleaner 사용을 피하라. (0) | 2022.09.03 |
[Item 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2022.09.02 |
[Item 4] 인스턴스화를 막으려거든 private 생성자를 사용하라. (0) | 2022.09.02 |
[Item 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2022.09.02 |