Table of Contents
- 자바의 래퍼 클래스 (Wrapper Classes)
자바의 래퍼 클래스 (Wrapper Classes)
자바는 객체 지향 언어이기 때문에 기본 자료형(primitive type)도 객체처럼 다루고 싶을 때가 많습니다. 이럴 때 사용하는 것이 바로 래퍼 클래스(Wrapper Class) 입니다.
이 글에서는 자바의 래퍼 클래스에 대해 알아보고, 언제 사용하는지, 어떤 장점이 있는지 예제를 통해 설명합니다.
기본 자료형과 래퍼 클래스
자바의 기본 자료형(primitive type)은 다음과 같습니다:
기본 자료형 | 크기 | 기본값 | 래퍼 클래스 |
---|---|---|---|
byte |
1B | 0 | Byte |
short |
2B | 0 | Short |
int |
4B | 0 | Integer |
long |
8B | 0L | Long |
float |
4B | 0.0f | Float |
double |
8B | 0.0 | Double |
char |
2B | ‘\u0000’ | Character |
boolean |
1B | false | Boolean |
래퍼 클래스는 각 기본형을 객체로 감싸서, 객체처럼 다룰 수 있게 해줍니다.
왜 래퍼 클래스가 필요한가?
- 컬렉션에 사용하기 위해
- 자바의 컬렉션 프레임워크(
List
,Map
,Set
등)는 객체만 다룰 수 있습니다. 기본형은 직접 사용할 수 없으므로 래퍼 클래스를 사용합니다.
List<Integer> list = new ArrayList<>(); list.add(10); // int -> Integer로 자동 변환
- 자바의 컬렉션 프레임워크(
- 유틸리티 메서드 사용
- 래퍼 클래스는 형 변환, 비교, 문자열 파싱 등을 위한 유용한 메서드를 제공합니다.
int num = Integer.parseInt("123"); String binary = Integer.toBinaryString(10); // "1010"
- null 값을 다루기 위해
- 기본형은 null을 저장할 수 없지만, 래퍼 클래스는 null을 가질 수 있어, 값의 유무를 표현할 때 유리합니다.
Integer age = null; // 가능 int agePrimitive = null; // 컴파일 에러
오토박싱과 언박싱 (Auto-boxing / Unboxing)
자바 5부터는 컴파일러가 기본형과 래퍼 클래스 간의 변환을 자동으로 처리해줍니다.
오토박싱 (Auto-boxing)
기본형 → 래퍼 클래스로 자동 변환
int num = 5;
Integer boxed = num; // int -> Integer 자동 변환
언박싱 (Unboxing)
래퍼 클래스 → 기본형으로 자동 변환
Integer boxed = 10;
int num = boxed; // Integer -> int 자동 변환
주의할 점은, null 값을 언박싱하려 하면 NullPointerException
이 발생합니다.
Integer val = null;
int num = val; // 런타임 오류: NullPointerException
주요 래퍼 클래스의 메서드 예시
Integer
Integer a = Integer.valueOf(100);
int b = Integer.parseInt("123");
String s = Integer.toHexString(255); // "ff"
Boolean
Boolean flag = Boolean.valueOf("true");
boolean bool = Boolean.parseBoolean("false");
Character
Character c = Character.valueOf('A');
boolean isDigit = Character.isDigit('5');
boolean isUpper = Character.isUpperCase('A');
정리
용도 | 기본형 | 래퍼 클래스 사용 |
---|---|---|
성능 위주 | O | X |
컬렉션 사용 | X | O |
null 처리 | X | O |
메서드 활용 | X | O |
기본형은 성능이 좋지만 유연성이 떨어지고, 래퍼 클래스는 기능이 많지만 약간의 오버헤드가 있습니다. 상황에 맞게 선택하는 것이 중요합니다.
기본형과 래퍼 클래스
기본형 | 래퍼 클래스 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
오토박싱과 언박싱
자바 5부터는 기본형과 래퍼 클래스 간의 자동 변환이 지원됩니다.
오토박싱 (Auto-boxing): 기본형 → 래퍼 객체
int num = 10;
Integer obj = num; // 자동으로 Integer.valueOf(10) 호출됨
언박싱 (Unboxing): 래퍼 객체 → 기본형
Integer obj = Integer.valueOf(20);
int num = obj; // 자동으로 obj.intValue() 호출됨
- 오토박싱과 언박싱은 편리하지만, null 값이 언박싱되면
NullPointerException
이 발생할 수 있으므로 주의해야 합니다.
Integer와 Boolean의 팁과 주의사항
✅ Integer
관련 팁과 주의사항
1. ==
vs .equals()
비교 주의
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true (캐싱된 객체)
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false (다른 객체)
- 자바는
-128 ~ 127
범위의Integer
객체를 캐싱합니다. - 그 외의 값은 새로운 객체이므로
==
으로 비교 시false
가 될 수 있습니다. - ✅ 객체 비교는 항상
.equals()
사용하기.
2. parseInt
vs valueOf
int num = Integer.parseInt("123"); // 기본형 int 반환
Integer obj = Integer.valueOf("123"); // Integer 객체 반환
parseInt
: 문자열을int
로 변환valueOf
: 문자열을Integer
객체로 변환하며, 내부적으로 캐싱 활용- ✅ 공통 객체를 재사용하고 싶다면
valueOf
를 사용하세요.
✅ Boolean
관련 팁과 주의사항
1. 문자열 파싱 시 주의
System.out.println(Boolean.parseBoolean("true")); // true
System.out.println(Boolean.parseBoolean("yes")); // false
System.out.println(Boolean.parseBoolean("1")); // false
- 오직 문자열이
"true"
(대소문자 무시)일 때만true
반환 - ✅ 문자열을 boolean으로 바꿀 때는 정확한 값인지 확인해야 함
2. 객체 비교 주의
Boolean b1 = true;
Boolean b2 = true;
System.out.println(b1 == b2); // true (캐싱 객체)
Boolean b3 = new Boolean(true);
System.out.println(b1 == b3); // false (다른 객체)
Boolean.TRUE
,Boolean.FALSE
두 객체만 캐싱됩니다.- ✅
.equals()
나.booleanValue()
로 비교해야 안전합니다.
요약 정리
항목 | 설명 | 팁 |
---|---|---|
Integer == |
-128 ~ 127 범위는 동일 객체 |
.equals() 사용 권장 |
Integer.valueOf |
캐싱 적용됨 | 성능상 유리 |
Boolean.parseBoolean |
“true” 만 true (대소문자 무시) | “yes”, “1”은 false |
Boolean 객체 비교 |
TRUE/FALSE는 캐싱됨 | .equals() 또는 .booleanValue() 사용 |
래퍼 클래스는 컬렉션, 제네릭 등 객체가 필요한 상황에서 기본형 값을 유연하게 다루도록 해주는 중요한 도구입니다. 하지만 위와 같은 동작 특성을 이해하고 사용하지 않으면 예상치 못한 버그가 발생할 수 있습니다. 항상 .equals()
를 사용할지, 박싱/언박싱이 일어나는 시점을 의식하며 코드를 작성하는 습관을 들이는 것이 중요합니다.
마무리
자바의 래퍼 클래스는 단순히 기본형을 객체로 감싼 것이지만, 컬렉션과의 호환, null 처리, 다양한 유틸리티 기능 등에서 꼭 필요한 요소입니다.
실제 개발에서는 기본형과 래퍼 클래스의 차이를 명확히 이해하고, 어떤 상황에서 어떤 타입을 사용해야 할지 신중히 판단해야 합니다.