JAVA

(JAVA) Wrapper 기본 개념 이해하기

lastdove 2024. 9. 23. 10:10

Wrapper Class란?

Java의 기본 데이터 타입은 객체가 아니기 때문에, 객체처럼 다룰 수 있는 클래스로 변환할 필요가 있을 때가 있습니다. 이때 사용하는 것이 바로 Wrapper 클래스입니다. Wrapper 클래스는 기본 타입을 객체로 다룰 수 있게 해주는 역할을 합니다. 예를 들어 intInteger, charCharacter 등의 대응되는 클래스가 존재합니다.

1. 기본 타입과 Wrapper 클래스의 관계

Java에서는 8개의 기본 타입에 대해 각각 대응되는 Wrapper 클래스를 제공합니다.

기본 타입 Wrapper 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

이러한 클래스들은 기본 타입의 값을 객체로 변환하여 다루고자 할 때 사용됩니다.

2. Boxing과 Unboxing

Boxing은 기본 타입을 Wrapper 객체로 변환하는 과정을 의미하며, Unboxing은 Wrapper 객체를 기본 타입으로 변환하는 과정을 말합니다. 자바 5부터는 이러한 변환이 자동으로 이루어지는 Auto-BoxingAuto-Unboxing이 도입되었습니다.

예시 : Auto-Boxing과 Auto-Unboxing

int num = 100;
Integer boxedNum = num;  // Auto-Boxing: 기본 타입 -> Wrapper 객체
int unboxedNum = boxedNum;  // Auto-Unboxing: Wrapper 객체 -> 기본 타입

3. 주요 Wrapper 클래스 메서드

Wrapper 클래스들은 다양한 유용한 메서드를 제공합니다. 특히, 문자열을 기본 타입으로 변환하거나 기본 타입을 문자열로 변환하는 메서드들이 많이 사용됩니다.

주요 메서드

  • parseInt() : 문자열을 int 타입으로 변환합니다.
  • valueOf() : 문자열을 Wrapper 객체로 변환합니다.
  • toString() : 기본 타입을 문자열로 변환합니다.

예시 : 주요 메서드 사용

int num = 100;
Integer boxedNum = num;  // Auto-Boxing: 기본 타입 -> Wrapper 객체
int unboxedNum = boxedNum;  // Auto-Unboxing: Wrapper 객체 -> 기본 타입

4. Null 처리 주의

Wrapper 클래스는 객체이기 때문에 null 값을 가질 수 있습니다. 기본 타입 변수는 null을 가질 수 없기 때문에, 만약 null이 할당된 Wrapper 클래스를 Unboxing하려 하면 NullPointerException이 발생할 수 있습니다.

예시 : NullPointerException 발생

Integer nullWrapper = null;
int unboxed = nullWrapper;  // Unboxing 시도 -> NullPointerException 발생

▶ 꿀팁 - Wrapper 클래스 사용 시 주의할 점

  1. 자동 변환(Auto-Boxing/Unboxing) 주의
    • 반복문에서 Wrapper 객체를 자주 사용할 경우, 성능 저하가 발생할 수 있습니다. 불필요한 Boxing/Unboxing이 발생하지 않도록 주의하세요.
  2. == 대신 equals() 사용
    • Wrapper 객체는 기본 타입과 달리 객체이므로 == 연산자는 객체의 참조 주소를 비교합니다. 값 자체를 비교하고 싶다면 equals() 메서드를 사용하는 것이 좋습니다.
Integer num1 = 128;
Integer num2 = 128;
System.out.println(num1 == num2);  // false (주소 비교)
System.out.println(num1.equals(num2));  // true (값 비교)
  1. 성능 최적화 고려
    • 성능이 중요한 상황에서는 기본 타입을 직접 사용하는 것이 좋습니다. Wrapper 클래스는 객체를 생성하고 메모리를 추가로 소비하기 때문에 기본 타입보다 성능이 떨어질 수 있습니다.
  2. Null 처리 조심
    • Wrapper 클래스를 사용할 때는 null 값에 대한 처리를 항상 고려하세요. 기본 타입은 null을 가질 수 없기 때문에, Unboxing 시 발생할 수 있는 NullPointerException에 대비해야 합니다.
  3. 캐싱된 Wrapper 객체 활용
    • Integer는 -128에서 127 범위의 값을 캐싱하여 사용합니다. 이 범위 내의 값을 new로 생성하지 않고 valueOf()를 사용하면 메모리 효율성을 높일 수 있습니다.
Integer num1 = 127;
Integer num2 = 127;
System.out.println(num1 == num2);  // true (같은 객체 사용)

Integer num3 = 128;
Integer num4 = 128;
System.out.println(num3 == num4);  // false (다른 객체 사용)

정리

Java의 Wrapper 클래스는 기본 타입을 객체처럼 다뤄야 하는 상황에서 매우 유용하게 사용됩니다. 하지만 객체로 다루기 때문에 발생할 수 있는 성능 저하나 null 처리 등 주의할 점도 많습니다. 이러한 특성을 잘 이해하고 상황에 맞게 적절히 사용하는 것이 중요해보입니다.