[JAVA] 래퍼 클래스 (Wrapper Class)
2024. 2. 23. 12:49ㆍWeb/JAVA
프로그래밍을 하다보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 생기게 된다.
예를 들어 메소드의 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수 없기때문에 어떠한 변환 작업이 필요해진다.
멀티스레드 환경에서 동기화 데이터를 사용해야 할 경우 이를 객체화 해야 할 필요성이 생긴다.
(멀티 스레드 환경에서 동기화 할 시 기본형 타입에는 lock을 걸수가 없기 때문에)
Wrapper Class
- 기본 타입(Primitive type)을 객체로 다루기 위해서 사용하는 클래스
- 래퍼 클래스를 이용하면 각 타입에 해당하는 데이터를 파라미터로 전달받아 해당 값을 가지는 객체로 만들어 준다.
박싱(Boxing) & 언박싱(UnBoxing)
- 위에서 래퍼 클래스는 값을 포장하여 객체로 만드는것
- 만약 래퍼클래스의 값을 더하거나 변환해야 할 경우 다시 기본타입으로 변경해야 할 필요가 있다.
- 이 과정을 언박싱(Unboxing) 이라고 한다.
- 박싱 Boxing : 기본 타입의 데이터 -> 래퍼 클래스의 인스턴트로 변환
- 언박싱 UnBoxing : 래퍼 클래스의 인스턴스에 저장된 값 -> 기본 타입의 데이터로 변환
자동 박싱(Auto Boxing) & 자동 언박싱(Auto UnBoxing)
- JDK 1.5부터 박싱과 언박싱이 필요한 상황에 자바 컴파일러가 자동으로 처리해주기 시작했다.
- 이러한 자동화된 박싱과 언박싱이 오토박싱과 오토언박싱 이라고 부른다.
/* 기존 박싱 & 언박싱 */
Integer num = new Integer(17); // 박싱
int n = num.intValue(); // 언박싱
/* 오토 박싱 & 언박싱 */
Integer num = 17; // new Integer() 생략
int n = num; // intValue() 생략
래퍼 클래스 연산
- 오토 박싱 & 오토 언박싱 기능을 이용해 객체에 직접 연산이 가능해 졌다.
- 원래는 래퍼클래스는 직접 연산이 불가능 하지만, 컴파일러가 스스로 판단해 자동으로 언박싱하여 연산하기 때문에 가능
Integer num1 = new Integer(7); // 박싱
Integer num2 = new Integer(3); // 박싱
int int1 = num1.intValue(); // 언박싱
int int2 = num2.intValue(); // 언박싱
// 박싱된 객체를 오토 언박싱하여 연산하고 다시 박싱하여 저장
Integer result1 = num1 + num2; // 10
Integer result2 = int1 - int2; // 4
int result3 = num1 * int2; // 21
래퍼 클래스 동등 비교
- 오토 언박싱을 통해서 객체를 연산하는 데는 문제가 없지만, 객체 값을 비교할때에는 문제가 된다
- 자바 Heap에 저장된 값에 대한 동등 여부 판단은 객체의 주소값을 비교하기 때문에 오작동을 유발한다.
Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
num1 == num2; // 참조형과 참조형 비교 false
- 따라서, 래퍼클래스의 값을 비교할 때는 equals() 메소드를 통해서 비교하여야 한다.
오토 박싱(Auto Boxing) & 오토 언박싱(Auto UnBoxing) 성능 고려
- 자바에서 기능적 편의성을 위하여 오토 박싱/언박싱을 제공하지만, 다른 타입간의 형 변환은 어플리케이션 성능에 영향을 미치게 된다.
- 만약 100만건 이상의 대용량 데이터를 다루게 되면, 불필요한 Auto Casting이 반복적으로 이루어져서 성능에 악영향이 미친다.
- 단지 똑같은 자료값을 저장하지만 어떤 타입 방식으로 선언했느냐에 따라 성능차이는 점점 벌어질 우려가 있다.
'Web > JAVA' 카테고리의 다른 글
[JAVA] String / StringBuffer / StringBuilder (0) | 2024.02.23 |
---|---|
[JAVA] Immutable(불변) / Mutable(가변) (0) | 2024.02.23 |
[Java] 원시타입 / 참조타입 (0) | 2024.02.23 |
[Java] 메모리 관리 (0) | 2024.02.23 |
ObjectMapping 라이브러리 비교 (0) | 2024.01.24 |