오늘은 간단하게 Wrapper 클래스에 대해서 알아봅시다. 우리는 기본 타입을 어떠한 이유로 Wrapping을 해야 하는 경우가 생기는데요. 예를 들자면, ArrayList에 값을 집어넣을 때 기본 타입을 넣을 수 없어요. 그러면 wrapping 해서 넣어야 합니다.

 

 

 이것을 Boxing이라고 합니다. 반대로, Integer 타입을 int로, 그러니까 값을 얻어낼 수가 있는데요. 이를 언박싱이라고 합니다. 요것을 그림으로 도식화 시키면 아래와 같습니다.

 

 

 보시면 박스 안에 real Value가 들어가 있음을 알 수 있어요. 초록색으로 칠한 상자는 Integer 객체인데요. 이 안에, 5000이라는 실제 값이 들어가 있음을 알 수 있어요.

 

 


 먼저, 기본값을 boxing 해 봅시다.

 

 

 먼저 생성자를 이용한 방법이 있습니다. 6번째 줄은 그것을 이용한 건데요. 5라는 값을 boxing한, Integer 객체 num1을 생성했습니다. 다음에, valueOf라는 메소드를 이용하는 방법이 있는데요. 이것 역시 인자로 문자열이나 기본 타입 값을 줄 수 있어요.

 

 그러면 wrapping이 됩니다.

 

 

 실제로, 내부적으로 캐시에 저장된 범위가 아니라면 새롭게 wrapping 객체를 생성합니다. 이것이 new로 생성하는 것과는 다른 점입니다.

 

 

 실제로 new 연산자로 생성해 버리면 캐시에 저장이 되어 있는 친구를 쓰지 않아요. 그러면, 적당히 캐시 범위에 들어 오는 값을 주었을 때, 어떻게 될까요?

 

 

 예제 프로그램을 돌려봅시다. num1과 num3은 new로 생성한 객체입니다. 그리고 num2와 num4는 valueOf로 boxing을 해 버리고 있습니다.

 

 

 그러면, num1과 num3은 다른 객체를 가리킬 겁니다. 그런데, valueOf 메서드에 따르면, 'A'라는 값은, 캐시에 미리 저장이 되어 있을 가능성이 큽니다. 실제로, 제 환경에서 default 값이 128 정도 됩니다. 'A'는 아스키 코드로 128보다 작기 때문에 캐시에 저장이 되어 있는데요. valueOf는 cache에 저장이 되어 있다면, 그 객체의 참조값을 리턴합니다.

 

 

 그러면, num2와 num4는 같은 객체를 참조할 것이고, num1과 num4는 다른 객체를 참조할 거에요. 이런 점은 조심해야 합니다. 당연한 이야기겠지만, 같은 값을 가지고 있는 객체 A와 객체 B를 비교하기 위해서는 equal 메서드를 쓰거나 언박싱을 해서 비교하는 게 현명한 방법입니다.

 

 

 다음 프로그램을 돌려봅시다. 결과는 false, true, true가 나옵니다. 같은 내용물이 있어도, num과 num2는 다른 객체이기 때문에, false가 리턴이 됩니다. 내용을 비교하기 위해서는 xxxValue로 언박싱을 하거나, equals로 비교해야 합니다. 이런 클래스들은 equals도 오버 라이딩이 되어 있습니다.

 

 

 이 메서드를 간략하게 보면 내용을 비교함을 알 수 있어요. 그러니 마음 놓고 쓰셔도 됩니다. new 연산자랑, valueOf 차이점 설명하다가 여기까지 와 버렸네요. 자바 1.5부터는 자동 박싱이라는 것도 지원을 해 주는데요.

 

 

 포장 클래스 타입에 기본 값이 대입되었어요. 그러면, 자동으로 boxing이 되는데요.

 

 

 이 때 호출 스택을 보면, 내부적으로, valueOf를 호출함을 알 수 있어요.

 


 그러면 boxing된 값을 얻어와야 하는 경우가 있을 겁니다.

 

 

 이 때에는 xxxValue 메서드로 얻어오면 됩니다. 저는 10이라는 값이 boxing된 객체 num을 생성했어요. 그리고 그것으로부터, 언박싱을 하려고 합니다. 그 경우에 xxxValue를 쓰면 되는 것입니다. 다른 방법이 없을까요? 자동 박싱이 있다면, unboxing도 있을 건데요.

 

 

 기본 타입에 포장 객체가 대입이 되어 버리거나, 포장 객체와 기본 타입을 연산해 버리면, 언박싱이 되는데요. num + 1은 어떤가요? 1이 기본 타입인가요?

 

  

 그러니, 7번째 줄을 수행하면, xxxValue가 호출이 됩니다. 의외로 많이 쓰는 메서드 중에 parsexxx가 있습니다.

 

 

 이는 문자열을 기본 타입으로 반환해 주는 역할을 해요. 예를 들어 parseInt는 string을 int로 변환해주는 역할을 합니다. 이 메서드는, 제가 Java로 ps를 할 때 꽤 자주 사용을 했던 것이니 알아두시면 좋을 듯 싶습니다.