Effective Java | #6. 불필요한 객체 생성을 피하라

보람·2022년 5월 8일
0

Effective-Java

목록 보기
7/25

new String("")

String s = new String("따라하지마세요");
  • 실행될 때마다 String 인스턴스를 새로 만드는 최악의 코드다.
  • String s = "good"; 와 같이 고쳐 사용한다.

비싼 객체 반복 생성보다는 재사용

  • String.matches는 정규표현식으로 문자열 형태를 확인하는 가장 쉬운 방법이지만, 성능이 중요한 상황에서 반복해 사용하기엔 적합하지 않다.
  • private static final 로 패턴 인스턴스를 선언하고 캐싱하여 사용하면 반복 사용시 큰 효과를 볼 수 있음
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 isRomanNumeralFast(String s) {
    return ROMAN.matcher(s).matches();
}

오토박싱

  • 프로그래머가 기본 타입과 박싱된 기본 타입을 섞어 쓸때 자동으로 상호 변환해주는 기술
  • 기본 타입과 그에 대응하는 박싱된 기본 타입의 구분을 흐려주지만, 완전히 없애주는 것은 아님
private static long sum() {
    Long sum = 0L;
    for (long i = 0; i <= Integer.MAX_VALUE; i++)
        sum += i;
    return sum;
}

위 예제를 잘 보면..
Long 인 sum에 long인 i를 더해주면서 계속해서 오토박싱이 일어나 심각한 성능저하를 일으킨다.😩

  • 박싱된 기본 타입보다는 기본 타입을 사용하고, 의도치 않은 오토박싱이 숨어들지 않도록 주의하자.

대조적인 모습

  • 방어적복사(item-50) : "새로운 객체를 만들어야 한다면 기존 객체를 재사용하지 마라"
  • 불필요한 객체 생성 피하기 : "기존 객체를 재사용해야 한다면 새로운 객체를 만들지 마라"
    위 두 개의 아이템은 대조적이다.

하지만 필요한 상황에서 객체를 재사용했을 때의 피해가 필요 없는 객체를 반복 생성했을 때의 피해보다 훨씬 크다. 즉, 방어적복사에 실패하여 발생되는 보안 이슈나 버그보다는 불필요한 객체를 재사용하는 것은 그저 코드 형태나 성능에만 영향을 줄 뿐이다.

profile
백엔드 개발자

0개의 댓글