Java

Wrapper 클래스

fygoo-826 2025. 2. 2. 00:00
728x90

 자바는 객체 지향 언어로, 대부분의 데이터들은 객체의 특성을 지니고 있다. 그러나 int나 double과 같은 기본형 타입(Primitive Type)은 객체가 아니기 때문에 몇 가지 단점이 존재한다. 이번 포스팅에서는 기본형 타입의 한계를 극복하기 위한 "Wrapper" 클래스에 대해서 소개해보고자 한다.


기본형 타입의 단점

객체 특성 사용 불가
 기본형 타입은 메서드를 제공하지 않기 때문에 객체 기반 기능을 사용할 수 없다. 아래 코드를 보자.

int num1 = 5;
boolean result = num1.compareTo(5); // 컴파일 에러 발생

 `num1` 이 기본형 int 타입이기 때문에 내장 메서드를 사용할 수 없어 컴파일 에러가 발생한다. 기본형 데이터에 대해 메서드를 사용하려면 별도의 외부 메서드를 정의해야 한다. 실제로 여러 라이브러리들에서 static 메서드를 제공해주기도 한다.

public static boolean compareTo(int num1, int num2) {
    return Integer.compare(num1, num2) == 0;
}

 

 

 

null을 가질 수 없음
 기본형 타입은 null을 가질 수 없고, 초기화되지 않은 경우 기본값을 가진다. 예를 들어, int는 초기화되지 않으면 자동으로 0을 가진다. 값이 "null"이라는 상태를 표현하기 어려운 문제가 있다. 사실 이 부분은 장점이 되기도 한다.

 

Wrapper Class 란?

 이러한 단점을 보완하기 위해 자바는 기본형을 객체로 감싸는 래퍼 클래스를 제공한다. 자바의 기본형 타입에 대응하는 래퍼 클래스는 각 기본형의 첫 글자를 대문자로 변경한 형태로 제공된다. 예를 들어, int의 래퍼 클래스는 Integer이다.

 

Figure 1. prmitive vs wrapper (ref. https://www.linkedin.com/pulse/wrapper-classes-vs-primitive-data-types-bhavishya-ambati-978nc/)



Wrapper Class의 특징

  • 래퍼 클래스는 자바에서 기본적으로 제공되며, 유용한 메서드를 포함한다. 예를 들어, Integer 클래스는 두 수를 비교하는 compareTo 메서드를 제공한다
  • Wrapper Class는 불변 객체(Immutable)로 설계되어 있어, 대부분의 메서드가 기존 객체를 변경하지 않고 새로운 객체를 반환한다
  • 기본형을 참조형으로 변환한 것이기 때문에, 동등성 비교 시 equals() 메서드를 사용한다

Wrapper Class의 단점
 래퍼 클래스는 불변이라는 특성으로 인해 성능 상 문제가 발생할 수 있다. 래퍼 클래스를 사용하여 수많은 연산을 수행하면 매번 새로운 객체가 생성되어 속도가 느려질 수 있다. 또한, 추가적인 메타데이터를 포함하고 있어 기본형보다 더 많은 메모리를 소비하게 된다.

Boxing vs Unboxing

Boxing
 기본형을 래퍼로 바꾸는 과정을 Boxing이라고 한다.

Integer int1 = new Integer(5); // 삭제될 예정
Integer int2 = Integer.valueOf(5); // 권장되는 표현
Integer int3 = 5; // 기본 자료형을 바로 삽입해도 된다

 첫 번째 표현은 매번 새로운 객체를 생성하지만, 두 번째 표현은 캐싱을 활용하여 -128부터 127 사이의 값을 재사용한다. 내부적으로 동일한 값을 가진 객체를 반복 생성하지 않으므로 메모리와 성능 측면에서 더 효율적이다.

 

Unboxing
 Unboxing은 래퍼 객체를 기본형으로 변환하는 과정이다.

Integer value1 = 7; // 래퍼 타입 만들기
int value2 = value1; // 기본형으로 바꾸기

 

728x90