자바의 자료형 시스템은 두 부분으로 나뉜다. 하나는 int,double,boolean 등의 기본 자료형이고, 다른 하나는 String과 List 등의 참조 자료형이다. 모든 자료형에는 대응되는 참조 자료형이 있는데 , 이를 객체화된 기본 자료형이라 부른다.
자동 객체화와 자동 비객체화가 추가되면서, 기본 자료형과 그 객체 표현형 간의 차이를 희미하게 만들었다. 그런데 그 둘 사이에는 실질적인 차이가 있으므로, 사용할 때 주의해야 한다.
기본 자료형과 객체화된 기본 자료형의 차이
- 기본 자료형은 값만 가지지만 객체화된 기본 자료형은 값 외에도 신원을 가진다. 따라서 객체화된 기본 자료형 객체가 두 개 있을 때, 그 값은 같더라도 신원은 다를 수 있다.
- 기본 자료형에 저장되는 값은 전부 기능적으로 완전한 값이지만, 객체화된 기본 자료형에는 저장되는 값에는 그 외에 null이 저장될 수도 있다. 객체이기 때문이다.
- 기본 자료형은 시간이나 공간 요구량 측면에서 일반적으로 객체 표현형보다 효율적이다.
위의 코드에는 심각한 문제가 있다. naturalOrder.compare(new Integer(42),new Integer(42))의 값을 테스트해보면 문제점이 발견된다. compare메소드에서 first < second 를 할때 Integer 자료형은 int로 자동 형변환이 된다. 두 비교되는 숫자가 같거나, second가 더 작을경우 , (first == second ) 를 실행하게 되고 , 여기서 비교되는 두 객체는 객체화된 기본 자료형이다. 객체화 된 기본자료형을 ==으로 비교하니 false가 반환되고 결과값이 1이 발생되게 되는 것이다. 즉 객체화된 기본 자료형에 == 연산자를 사용하는 것은 거의 항상 오류라고 봐야 한다는 것이다.
위의 프로그램은 "Unbelievable"을 출력하지는 않는데, (i == 42 )를 실행할 때 NullPointerException이 발생한다. 기본 자료형과 객체화된 기본 자료형을 한 연산 안에 엮어 놓으면 객체화된 기본 자료형은 자동으로 기본 자료형으로 변환된다. 기본 자료형으로 변환되는 과정에서 객체멤버는 기본값이 null이므로 NullPoniterException이 발생하는 것이다.
그렇다면 객체화된 기본 자료형은 언제 사용해야 하나?
- 컬렉션의 요소,키,값으로 사용할 때다. 컬렉션에는 기본 자료형을 넣을 수 없으므로 객체화된 자료형을 써야 한다.
- 형인자 자료형의 형인자로는 객체화된 기본 자료형을 써야한다.
요약
가능하다면 기본 자료형을 사용하라는 것이다. 기본 자료형이 더 단순하고 빠르다. 자동 객체화는 번거로운 일을 줄여주긴 하지만, 객체화된 기본 자료형을 사용할 때 생길 수 있는 문제들까지 없애주진 않는다. 객체화된 기본 자료형 객체 두 개를 ==로 비교한다는 것은 그 두 객체의 신원을 비교한다는 것이다. 객체화된 기본 자료형과 기본 자료형을 한 표식안에 뒤섞으면 비 객체화가 자동으로 일어나며, 그 과정에서 NullPonterException이 발생할 수 있다.