[Effective Java]일반적인 프로그래밍 원칙들_4

Kim Ji Yun·2021년 11월 28일
0

Effective Java

목록 보기
4/9
post-thumbnail

4. 객체화된 기본 자료형 대신 기본 자료형을 이용하라

  • 기본 자료형과 객체화된 기본 자료형 사이의 차이점
  1. 기본 지료형은 값만 가지지만 객체화된 기본 자료형은 값 외에도 신원(identity)을 가짐
  2. 기본 자료형에 저장되는 값은 전부 기능적으로 완전한 값(fully functional value)이지만, 객체화
    된 기본 자료형에 저장되는 값에는 그 이외에도 이무 기능도 없는 값, 즉 null 존재
  3. 기본 자료형은 시간이나 공간 요구량 측면에서 일반적으로 객체 표현형보다 효율적
  • 객체화된 기본 자료형에 == 연산자를 사용하는 것은 오류

ex14) 비교자(comparator) 오류 예제

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))의 값을 찍어보면 1을 반환함
  • ==는 false를 반환하였으므로 잘못된 값이라는 것을 알 수 있음

ex15) 비교자(comparator) 오류 해결 예제

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
  	}
 };
  • first와 second의 실제 값을 담을 두 개의 지역 int변수를 추가하여, 이 두 변수를 이용해 값을 비교

객체화된 기본 자료형과 기본 자료형을 한 표현식 안에 뒤섞으면 비객체화가 자동으로 일어나며, 그 과정에서 NullPointerException이 발생

ex16) 객체화된 기본자료형 비교시 오류

public class Unbelievable {
    static Integer i;
    public static void main(String[] args) {
        if (i == 42)
        	System.out.println("Unbelievable");
	}
}
  • Integer 객체 i와 int값 42가 비교되기 때문에 (i == 42)를 계산할 때 NullPointException 발생
  • Integer를 int로 고쳐주면 문제 해결 가능

기본 자료형 값을 객체화하는 과정에서 불필요한 객체들이 만들어지면 프로그램 성능이 저하됨

ex17) 객체화된 기본자료형 성능이슈 예제

// 무시무시할 정도로 느린 프로그램. 어디서 객체가 생성되는지 알겠는가?
public static void main(String[] args) {
    Long sum = 0L;
    for (long i = 0; i < Integer.MAX_VALUE; i++) {
		sum += i; 
    }
    System.out.println(sum);
}
  • 지역변수 sum을 long이 아닌 Long으로 선언
  • 오류나 경고없이 컴파일 되지만 변수가 계속 객체화와 비객체화를 반복하기 때문에 성능이 느려짐

0개의 댓글