티스토리 뷰

Item61에서는 wrapper 타입보다 primtivie 타입을 사용하라 말한다

책에 나온 아래 예시보다 눈에 확 들어오게 간단한 예시로 박싱 된 기본 타입을 쓰지 말아야 할 이유를 살펴보자

Comparator<Integer> naturalOrder = (i, j) -> (i, j) ? -1 : (i == j ? 0 : 1);

 

자바에서 범용성을 높이기 위해 Generic type으로 다루려면 반드시 reference type이어야 한다

이 것이 wrapper 타입의 존재 이유다

그렇다면 wrapper만 두고 모든 것을 객체로 다뤄버리면 되지 않을까 싶지만 성능 상의 이유로 그러기는 또 쉽지 않단다

아래는 int의 wrapper type인 Integer로 값을 비교하는 경우를 나타낸 예시다

  public static void main(String[] args) {
    Integer five = new Integer(5);
    Integer secondFive = new Integer(5);
    Integer thirdFive = Integer.valueOf(5);
    Integer fourthFive = Integer.valueOf(5);

    System.out.println("(five == secondFive) = " + (five == secondFive));
    System.out.println("(five equals secondFive) = " + (five.equals(secondFive)));
    System.out.println("(thirdFive == fourthFive) = " + (thirdFive == fourthFive));
    System.out.println("(thirdFive.equals(fourthFive)) = " + (thirdFive.equals(fourthFive)));
  }

 

결과는 순서대로 false, true, true, true가 나온다

equals()의 경우 Integer에서 재정의 해놨고 값으로 비교하게 만들어놨기 때문에 둘 다 true가 나온다

주목할 점은 new Integer() 값으로 == 비교 시 false가 나오는데 Integer.valueOf() 값은 true가 나온다는 것이다

reference type의 경우 == 비교는 동일성 비교로 참조하는 메모리 주소가 같은지 비교하기 때문에

new Integer() 비교의 값이 false인 건 쉽게 이해가 가는데 Integer.valueOf()는 어째서 true가 나오는가?

 

Integer.valueOf()

 

Integer 안에 private static class로 가지고 있는 IntegerCache를 사용하기 때문이다

요놈에서 주의해야 할 점은 -128 부터 127까지만 캐싱하고 있다는 점이다

따라서 Integer.valueOf(128)로 두 개 만들고 비교하면 결과는 false가 된다

사용하는 값에 따라 비교 결과가 바뀔 수 있다는 점에서 박싱 타입을 피해야 하는 첫 번째 이유가 된다

 

두 번째 이유는 오토 박싱, 언박싱에 의한 성능 저하인데 책에 나온 예제만 살펴봐도 이해할 수 있다

sum을 Long 타입으로 캐스팅해놨기 때문에 성능 저하를 거하게 먹는데 단순히 long으로만 선언해도 3~4배 빨라진다

내 컴퓨터에서는 Integer.MAX_VALUE 계산에 Long은 2907ms, long은 726ms가 나온다

private static void terriblySlow() {
    Long sum = 0L;
    for (int i = 0; i < Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println("sum = " + sum);
}

 

제네릭을 반드시 사용해야 하는 경우 wrapper 타입 쓰고 그 외에 나머지 부분에는 primitive 타입을 쓰자

특히나 stream으로 대량 처리를 해야할 때는 parallel() 사용과 일반 for문으로 primtivie 사용의 성능을 반드시 비교해보자

댓글
링크
글 보관함
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday