
Java에서 숫자나 문자 같은 기본형 데이터(int, double, char 등)는 객체가 아니에요. 그런데 때때로 이 기본형 데이터를 객체처럼 다뤄야 할 때가 있죠.
그럴 때 사용하는 것이 바로 "래퍼 클래스"!
쉽게 말해, 기본형 데이터를 감싸서 객체로 만들어주는 클래스예요.
| 기본형 ( Type) | 래퍼 클래스 (Wrapper Class) |
|---|---|
int | Integer |
double | Double |
char | Character |
boolean | Boolean |
byte | Byte |
short | Short |
long | Long |
float | Float |
그냥 int, double 같은 기본형을 쓰면 되는 거 아닌가? 싶겠지만, 래퍼 클래스가 필요한 이유가 몇 가지 있어요.
객체로 다뤄야 할 때 → 기본형 데이터는 객체가 아니라서, 객체를 요구하는 상황에서는 쓸 수 없어요.
List<Integer> list = new ArrayList<>(); // ✅ Integer 객체만 저장 가능
list.add(10); // 기본형 int를 넣었지만, 자동으로 Integer로 변환됨 (오토박싱)
기능이 필요할 때 → 기본형 데이터는 기능이 없지만, 래퍼 클래스는 다양한 메서드를 제공해요.
int num = 100;
String str = Integer.toString(num); // ✅ 숫자를 문자열로 변환 가능
기본형과 객체 간의 변환이 필요할 때 → 자동으로 변환되는 기능(오토박싱, 오토언박싱) 덕분에 편리해요.
Integer num = 20; // 오토박싱: int → Integer
int result = num + 5; // 오토언박싱: Integer → int
래퍼 클래스가 어떤 개념인지 더 쉽게 이해하려면 직접 만들어보는 게 좋아요.
class CustomInteger {
private int value; // 기본형 데이터를 감싸는 변수
// 생성자
public CustomInteger(int value) {
this.value = value;
}
// 값을 가져오는 메서드
public int getValue() {
return value;
}
// 값을 설정하는 메서드
public void setValue(int value) {
this.value = value;
}
// toString() 오버라이딩 → 출력할 때 값이 나오도록 설정
@Override
public String toString() {
return String.valueOf(value);
}
}
public class Main {
public static void main(String[] args) {
CustomInteger num = new CustomInteger(100);
System.out.println(num); // 100
num.setValue(200);
System.out.println(num.getValue()); // 200
}
}
이처럼 기본형 int 값을 감싸는 객체를 직접 만들 수도 있어요. 하지만 Java에서는 이런 작업을 대신해 주는 Integer, Double 같은 래퍼 클래스가 이미 존재하는 거죠!
✔ 오토박싱: 기본형 → 래퍼 클래스 객체로 자동 변환
Integer num = 10; // int → Integer (자동 변환)
✔ 오토언박싱: 래퍼 클래스 → 기본형으로 자동 변환
int value = num; // Integer → int (자동 변환)
이 기능 덕분에 기본형과 객체를 자유롭게 오갈 수 있어요!
⚡ 기본형이 더 빠르다!
래퍼 클래스는 객체이기 때문에 기본형보다 연산 속도가 느려요.
int a = 10;
int b = 20;
System.out.println(a + b); // 빠름!
Integer x = 10;
Integer y = 20;
System.out.println(x + y); // 내부적으로 변환 과정이 추가되어 느림!
그렇기 때문에 성능이 중요한 경우(반복문, 연산이 많은 코드 등)에는 기본형을 쓰는 것이 유리해요.
✔ 기본형 데이터를 객체로 감싸는 것이 래퍼 클래스
✔ 기본형이 필요한 경우에는 기본형(int, double 등) 그대로 사용
✔ 객체처럼 다뤄야 하거나, 기능이 필요할 때는 래퍼 클래스(Integer, Double 등) 사용
✔ 오토박싱, 오토언박싱 덕분에 변환이 자동으로 이루어짐
✔ 성능이 중요한 경우 기본형을 우선 사용