[JAVA] 래퍼 클래스 (Wrapper Class)

2024. 2. 23. 12:49Web/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