IT/Programming / / 2023. 4. 26. 13:37

<Effective Java> RULE 49 객체화된 기본 자료형 대신 기본 자료형을 이용하라

반응형

 

자바의 자료형 시스템

· 기본 자료형 : int, double, boolean..

· 참조 자료형 : String, List..

 

모든 자료형에는 대응되는 참조 자료형이 존재한다.

· int, double, boolean → Integer, Double, Boolean

이 둘 사이에는 실질적인 차이가 있으므로 신중하게 결정해야 한다.

 

차이점

· 기본 자료형은 값만 가지지만 객체화된 기본 자료형은 값외에 신원(identify)를 가진다.

· 기본 자료형에 저장되는 값은 전부 기능적으로 완전한 값이지만, 객체화된 기본 자료형에 저장되는 값에는 그 외에 아무기능도 없는 값, null이 하나 있다.

· 기본 자료형은 객체 표현형보다 시간이나 공간 요구량이 효율적이다.

 

예시 1

// 잘못된 반복자
Comparator<Integer> naturalOrder = new Comparator<Integer>(){
    public int compare(Integer first, Integer second)
        return first < second ? -1 : (first == second ? 0 : 1);
    }
}
 

naturalOrder.compare(new Integer(42), new Integer(42))를 출력할 시 0이 나와야하는데 1이 나오게 된다.

 

문제는 first == second에 있다.

연산자 == 는 두 객체의 신원(identity)를 비교하게 되고 서로다른 신원을 반환하는 Integer는 false값 즉 1을 반환하게 된다.

따라서 객체화된 자료형에 == 연산자를 사용하는 것은 거의 항상 오류라고 봐야 한다.

// 수정된 반복자
Comparator<Integer> naturalOrder = new Comparator<Integer>(){
    public int compare(Integer first, Integer second)
        int f = first; //Auto-unboxing
        int s = second; //Auto-unboxing
        return f < s ? -1 : (f == s ? 0 : 1); //No unboxing
    }
}
 

예시 2

//매우 느린 프로그램, 어디서 객체가 생성되는가?
public static void main(){
    Long sum = 0L;
    for (long i = 0 ; i < Integer.MAX_VALUE ; i++){
        sum += i;
    }
    system.out.pringln(sum);
}
 

변수가 계속해서 객체화와 비객체화를 반복하기 때문에 느려지게 된다.

 

언제 객체화된 기본 자료형을 사용해야 하나?

·컬렉션의 요소, 키, 값으로 사용할 때

·형인자 자료형의 형 인자

ㄴ ThreadLocal<int>와 같은형태는 안된다.

 

결론

·가능하다면 기본자료형을 사용하라.

·기본자료형이 더 단순하고 빠르다.

·객체화된 기본 자료형을 사용해야 한다면 주의해라!

·자동 객체화는 번거로운 일을 줄여주지만, 성능 및 오류가 발생하는건 개발자 책임이다.

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유