Wrapper Class 란?
객체 지향 언어인 JAVA로 프로그래밍을 할 때 때때로 기본 타입(primitive type)의 값을 객체로 다루어야 할 상황이 발생합니다.
예를 들어 메서드의 인수로 객체 타입만이 요구된다면?? 기본 타입의 데이터를 그대로 사용할 수 없기 때문에 변환 작업이 필요합니다.
또한 멀티 쓰레드 환경에서 기본형 타입의 값을 공유 데이터로 사용하고 있다고 가정해 보겠습니다. 이러한 기본형 타입의 값에 동기화 처리를(한번에 한 쓰레드만 공유 데이터에 접근할 수 있도록) 하기 위해 객체화 해야 할 필요성이 생길 수 있습니다.
위와 같은 상황에서 기본 타입을 객체로 다루기 위해 사용하는 클래스를 래퍼 클래스라고 합니다
자바에서는 모든 기본타입의 값을 갖는 객체를 java.lang 패키지에 포함해서 제공합니다.
래퍼 클래스에 종류는 밑의 그림을 참고해주세요~
박싱(Boxing) & 언박싱(UnBoxing)
위에서 설명한 것과 같이 기본형 값을 포장하여 객체로 만드는 것은 좋지만, 만일 값에 대한 연산이 필요할 경우 포장을 다시 뜯을 필요가 있습니다!
이러한 행위를 Boxing과 UnBoxing이라고 부릅니다
Boxing : 기본 타입의 데이터 -> 래퍼 클래스의 인스턴스로 변환
UnBoxing : 래퍼 클래스의 인스턴스에 저장된 값 -> 기본 타입의 데이터로 변환하는 것
래퍼 클래스는 생성된 인스턴스의 값만을 참조할 수 있기에, 래퍼 클래스 인스턴스 저장된 값을 직접 변경할 수 없습니다.
따라서 래퍼 클래스를 언박싱 한 뒤에 값을 변경 후 다시 박싱해야 하는 중간 단계를 거쳐야 합니다.
Auto Boxing & Auto UnBoxing
JDK 1.5부터는 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 자동으로 처리해주기 시작하였습니다.
이러한 자동화된 박싱과 언박싱을 오토 박싱과 오토 언박싱이라고 부릅니다.
// 기존 박싱 & 언박싱
Integer num = new Integer(17); // 박싱
int n = num.intValue();
// 오토 박싱 & 언박싱
Integer num = 17;
int n = num
// 연산 또한 가능
Integer num1 = new Integer(7);
Integer num2 = new Integer(3);
Integer result = num1 + num2;
위와 같이 오토 박싱을 이용하면 new 키워드를 사용하지 않고도 자동으로 인스턴스를 생성할 수 있고, 언박싱 메서드를 사용하지 않고도 오토 언박싱을 통해 인스턴스에 저장된 값을 바로 참조할 수 있게 됩니다.
주의 할 점
오토 박싱,언박싱을 통해 객체 값을 더하고 빼는 것은 문제가 없지만 값을 비교할때는 조심해야 합니다.
래퍼 클래스 둘을 == 로 비교 연산을 할때는 객체의 주소를 통해 값을 비교하여 의도치 않은 결과가 나타납니다.
또한 대용량 트래픽이 발생하는 서비스를 이용할 경우, 이러한 auto Casting이 반복적으로 일어날 경우 실행 시간에 큰 영향을 미칠 수 있으므로 주의해야 합니다!
참고
자바의 정석
https://inpa.tistory.com/entry/JAVA-☕-wrapper-class-Boxing-UnBoxing
'JAVA' 카테고리의 다른 글
Collection Framework 정복 2탄 - List 인터페이스와 ArrayList (0) | 2023.05.22 |
---|---|
Collection Framework 정복 1탄 - Collection Framework란? (0) | 2023.05.22 |
StringBuffer,StringBuilder의 개념 및 차이점 정복하기 (0) | 2023.05.17 |
문자열 리터럴 할당 VS new String() (0) | 2023.05.10 |
[JAVA] Enum 클래스 정복하기! (0) | 2023.05.10 |