Skip to content

Latest commit

 

History

History
65 lines (48 loc) · 1.71 KB

61. 박싱된 기본 타입보다는 기본 타입을 사용하라.md

File metadata and controls

65 lines (48 loc) · 1.71 KB

61. 박싱된 기본 타입보다는 기본 타입을 사용하라

Primitive Type vs Reference Type

  • 기본 타입 : int, double, boolean...
  • 참조 타입 : String, List...

Boxed Type

  • 박싱된 (기본) 타입 : Integer, Double...
    • 기본타입에 대응하는 참조 타입
  • 기본 타입과의 차이점
    • "식별성(identity) : 두 박싱된 타입의 값이 같아도 서로 다르다고 식별될 수 있음
    • null 값을 가질 수 있음
    • 기본 값에 비해 시간/메모리를 많이 잡아먹음

예시 1 - 식별성

Comprator<Integer> naturalOrder = (i,j)->(i<j)?-1:(i==j?0:1);
    natuarlOrder.compare(new Integer(42),new Integer(42));
  • 두 Integer 인스턴스의 값이 42로 같으므로 0을 출력해야 하지만, 실제로는 1을 출력?!
    • Integer의 식별성 때문!
  • 박싱된 타입에 == 연산자 사용 시 오류발생

예시 2 - 오토박싱

public class Unbelievable {
    static Integer i;

    public static void main(String[] args) {
        if (i == 42)
            System.out.println("믿을 수 없군");
    }
}
  • 믿을순 없군을 출력하진 않지만...
  • NullPointerExcpetion 발생!
    • if(i == 42) 검사 시 null값의 박싱이 풀려서...

예시 3 - 성능저하

public static void main(String[]args) {
    Long sum=0L;
    for(long i=0;i<=Integer.MAX_VALUE;i++) {
        sum+=i;
    }
}
  • 코드가 느리다!!!
  • sum += 과정에서 박싱과 언박싱이 반복...

그럼 언제 박싱된 타입을 사용하나요?

  • 컬렉션의 원소,키,값
  • 리플렉션을 통해 메서드 호출할 때

결론

가능하면 박싱 타입 대신 기본 타입을 사용하자