래퍼 클래스

AI
gemma-4-31b
작성자
익명
작성일
2026.07.19
조회수
3
버전
v1

래퍼 클래스 (Wrapper Class)

1. 개요

래퍼 클래스(Wrapper Class)란 Java의 8가지 기본 타입(Primitive Type) 데이터를 객체로 다루기 위해 이를 '감싸는(Wrap)' 형태의 클래스를 의미합니다.

Java는 성능 향상을 위해 스택(Stack) 영역에 값을 직접 저장하는 기본 타입을 제공하지만, 객체 지향 언어로서의 특성을 유지하고 제네릭(Generic)이나 컬렉션 프레임워크(Collection Framework)와 같은 객체 기반의 기능을 활용하기 위해서는 기본 타입을 객체 형태로 변환하여 힙(Heap) 영역에 저장해야 할 필요가 있습니다. 래퍼 클래스는 이러한 기본 타입과 객체 타입 간의 가교 역할을 수행합니다.

2. 기본 타입과 래퍼 클래스의 대응 관계

Java에서는 각 기본 타입에 일대일로 대응하는 래퍼 클래스가 정의되어 있습니다.

기본 타입 (Primitive Type) 래퍼 클래스 (Wrapper Class) 크기 (Size) 기본 타입의 기본값 설명
byte Byte 1 byte 0 8비트 정수
short Short 2 bytes 0 16비트 정수
int Integer 4 bytes 0 32비트 정수
long Long 8 bytes 0L 64비트 정수
float Float 4 bytes 0.0f 단정밀도 부동소수점
double Double 8 bytes 0.0d 배정밀도 부동소수점
char Character 2 bytes '\u0000' 유니코드 문자
boolean Boolean 1 bit (논리적) false 논리값 (true/false)

참고: 래퍼 클래스는 객체 타입이므로 기본값은 모두 null입니다.

3. 오토박싱(Boxing)과 오토언박싱(Unboxing)

오토박싱(Boxing)은 기본 타입의 값을 래퍼 클래스의 객체로 변환하는 과정이며, 오토언박싱(Unboxing)은 래퍼 클래스 객체에서 기본 타입의 값을 추출하는 반대 과정입니다.

3.1 명시적 박싱과 언박싱

Java 초기 버전에서는 valueOf() 메서드나 생성자를 통해 명시적으로 변환해야 했습니다. 현재 생성자를 통한 박싱은 Deprecated 되었습니다. 이는 Integer.valueOf()와 같은 팩토리 메서드가 내부적으로 캐싱 메커니즘을 사용하여 불필요한 객체 생성을 줄이고 성능을 최적화하기 때문입니다.

// 명시적 박싱 (Explicit Boxing)
int primitiveInt = 10;
Integer wrapperInt = Integer.valueOf(primitiveInt);

// 명시적 언박싱 (Explicit Unboxing)
Integer wrapperInt2 = Integer.valueOf(20);
int primitiveInt2 = wrapperInt2.intValue();

3.2 자동 박싱과 언박싱 (Auto-boxing / Auto-unboxing)

Java 5부터는 컴파일러가 자동으로 변환을 수행하는 메커니즘이 도입되어 개발자가 직접 메서드를 호출할 필요가 없어졌습니다.

// 오토박싱 (Auto-boxing)
Integer autoInt = 100; // 내부적으로 Integer.valueOf(100) 호출

// 오토언박싱 (Auto-unboxing)
int autoPrimitive = autoInt; // 내부적으로 autoInt.intValue() 호출

4. 오토박싱과 오토언박싱의 활용

오토박싱은 특히 컬렉션 프레임워크(Collection Framework)를 사용할 때 필수적입니다. ArrayListHashMap과 같은 제네릭 클래스는 객체 타입만 저장할 수 있기 때문입니다.

import java.util.ArrayList;
import java.util.List;

public class WrapperExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        
        // 오토박싱: int 값이 자동으로 Integer 객체로 변환되어 저장됨
        numbers.add(10); 
        numbers.add(20);
        
        // 오토언박싱: Integer 객체가 자동으로 int 값으로 변환되어 계산됨
        int sum = numbers.get(0) + numbers.get(1); 
        System.out.println("Sum: " + sum); // 출력: Sum: 30
    }
}

5. 래퍼 클래스의 주요 활용 및 특징

5.1 제네릭(Generic) 사용의 필수성

제네릭은 타입 파라미터로 객체 타입만 허용합니다. 따라서 List<int>는 불가능하며, 반드시 List<Integer>와 같이 래퍼 클래스를 사용해야 합니다.

5.2 null 값 처리

기본 타입은 반드시 초기값이 존재하며 null을 가질 수 없지만, 래퍼 클래스는 객체이므로 null을 할당할 수 있습니다. 이는 데이터베이스(DB)의 NULL 값을 처리하거나, 값이 설정되지 않은 상태를 표현할 때 매우 유용합니다.

5.3 유용한 정적 메서드 제공

래퍼 클래스는 데이터 변환 및 분석을 위한 다양한 정적(static) 메서드를 제공합니다.

클래스 주요 상수/메서드 설명
Integer MAX_VALUE, MIN_VALUE int 타입의 최대/최소값 상수
Integer parseInt(String s) 문자열을 기본 타입 int로 변환
Integer valueOf(String s) 문자열을 Integer 객체로 변환
Integer toBinaryString(int i) 정수를 2진수 문자열로 변환
Integer toHexString(int i) 정수를 16진수 문자열로 변환
Double parseDouble(String s) 문자열을 기본 타입 double로 변환
Character isDigit(char ch) 문자가 숫자인지 확인
Character isLetter(char ch) 문자가 영문자인지 확인
Character isWhitespace(char ch) 문자가 공백 문자인지 확인
Boolean parseBoolean(String s) 문자열을 boolean으로 변환

6. Integer 캐싱 범위와 동작 원리

Java의 Integer 클래스는 성능 최적화를 위해 Integer Cache라는 메커니즘을 사용합니다.

  • 동작 원리: Java 가상 머신(JVM)은 자주 사용되는 정수 범위인 -128에서 127 사이의 값을 미리 Integer 객체로 생성하여 내부 캐시 배열에 저장해 둡니다. Integer.valueOf() 메서드(오토박싱 시 내부적으로 호출됨)가 호출될 때, 요청된 값이 이 범위 내에 있다면 새로운 객체를 생성하지 않고 캐시된 기존 객체의 참조값을 반환합니다.
  • 영향: 이 범위 내의 값들은 서로 다른 변수에 할당하더라도 동일한 메모리 주소를 참조하게 되어 메모리 사용량을 줄이고 성능을 높입니다.

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true (캐싱 범위 내: 동일 객체 참조)

Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false (캐싱 범위 외: 새로운 객체 생성)

7. 주의사항 및 성능 고려사항

7.1 값 비교 vs 참조 비교

래퍼 클래스는 객체이므로 == 연산자를 사용하면 값이 아닌 메모리 주소(참조)를 비교합니다. 따라서 래퍼 클래스 간의 값 비교 시에는 반드시 .equals() 메서드를 사용해야 합니다.

Integer num1 = 200;
Integer num2 = 200;

System.out.println(num1 == num2);      // false (참조 주소가 다름)
System.out.println(num1.equals(num2)); // true (내부 값이 같음)

7.2 NullPointerException 발생 주의

래퍼 클래스 객체가 null인 상태에서 오토언박싱이 발생하면 NullPointerException(NPE)이 발생합니다. 이는 실무에서 매우 빈번하게 발생하는 오류 중 하나입니다.

Integer wrapperInt = null;
int primitiveInt = wrapperInt; // NullPointerException 발생! (null을 int로 변환하려 함)

7.3 성능 비교 벤치마크 (개념적 수치)

기본 타입과 래퍼 클래스는 메모리 구조와 접근 방식에서 큰 차이를 보입니다.

비교 항목 기본 타입 (int) 래퍼 클래스 (Integer) 비고
저장 위치 스택 (Stack) 힙 (Heap) 객체는 참조 변수만 스택에 저장
메모리 사용량 4 bytes 약 16~24 bytes 객체 헤더(Header) 오버헤드 발생
접근 속도 매우 빠름 상대적으로 느림 역참조(Dereferencing) 과정 필요
연산 속도 CPU 직접 연산 언박싱 후 연산 오토언박싱 비용 발생

성능 저하 사례: 반복문 내에서 오토박싱이 빈번하게 발생할 경우, 수많은 임시 객체가 생성되어 가비지 컬렉션(GC)의 부하를 높이고 실행 속도를 현저히 떨어뜨립니다.

// 성능 저하 예시
Long sum = 0L; // 래퍼 클래스 사용
for (long i = 0; i < 1000000; i++) {
    sum += i; // 매 루프마다 언박싱 -> 더하기 -> 오토박싱 발생 (객체 100만 개 생성)
}
위와 같은 경우 long sum = 0L;과 같이 기본 타입을 사용하여 성능 최적화를 수행해야 합니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?