Java
Wrapper Class
99duuk
2025. 2. 9. 16:44
객체처럼 쓰기 위해
객체처럼 써야 할 때 기본형을 감싸는 역할
- 기본형 (int)은 가볍고 성능이 좋다.
- 하지만 객체로 다룰 수 없다
따라서 컬렉션 (List, Map 등)에는 넣지 못한다. - 래퍼 클래스 (Integer)는 기본형을 객체로 감싸서 컬렉션에 넣거나
null
을 다룰 수 있게 해준다.
또 자동 박싱/언박싱 덕분에 기본형처럼 쓸 수도 있다.
1. DTO에서 Integer
를 사용하면?
DTO에서 Integer
를 사용하면 해당 DTO 객체 내부에 또 다른 Integer
객체가 존재하는 구조가 됨.
public class SampleDTO {
private Integer number;
public SampleDTO(Integer number) {
this.number = number;
}
public Integer getNumber() {
return number;
}
}
이 경우 SampleDTO
는 Integer
객체를 필드로 갖고 있는 것이고, 내부적으로는 객체 속에 또 객체가 있는 것과 같아.
int
를 사용하면?
public class SampleDTO {
private int number;
public SampleDTO(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
}
여기서는 int
가 원시 타입이므로 객체가 아니라 값 자체를 저장하는 형태가 됨.
결국, Integer
를 쓰는 것은 DTO 내부에서 숫자를 객체로 감싸는 것이고, int
를 쓰는 것은 그냥 값만 저장하는 것이라고 보면 됨.
2. Integer
를 쓰는 이유가 불변 객체처럼 사용하기 위해서인가?
Integer
가 불변 객체(Immutable Object)인 것은 맞지만, Integer
를 쓰는 주요 이유가 불변 객체로 쓰기 위해서는 아님
불변 객체란?
- 한 번 값이 정해지면 절대 변경되지 않는 객체를 말함.
String
,Integer
,Long
,Double
등 대부분의 래퍼 클래스들은 불변 객체임.- 불변 객체는 상태가 변하지 않기 때문에 스레드 안전(Thread-Safe) 하고, 참조를 공유해도 변경될 위험이 없음.
예를 들어:
Integer a = 100;
Integer b = a;
a = 200; // 새로운 Integer 객체를 생성한 것이지, 기존 a의 값을 바꾼 게 아님!
System.out.println(b); // 여전히 100
a = 200;
을 하면 기존a
의 값을 변경하는 것이 아니라 새로운Integer
객체(200)를 생성해서 참조를 변경한 것.- 기존
b
는 여전히100
을 참조하고 있음.
불변 객체라 얻는 장점이 있는거지 불변 객체를 사용하기 위해 Wrapper Class를 사용하는 건 아니다.
3. 결국 래퍼 클래스의 핵심은 "자료형을 객체처럼 사용한다"는 건가?
ㅇㅇ 래퍼 클래스의 본질적인 이유는 "기본 타입을 객체처럼 사용하기 위해서".
4. 그럼 래퍼 클래스를 왜 객체처럼 사용해야 할까? (본질적인 이유)
1) 컬렉션, 제네릭 사용
- 컬렉션 프레임워크(
List
,Map
,Set
)는 객체만 저장할 수 있어서Integer
가 필요함. - 제네릭도 기본 타입을 지원하지 않기 때문에
Integer
,Double
등을 써야 함.
2) null 값 처리
- 기본 타입(
int
)은null
을 저장할 수 없지만,Integer
는null
을 저장할 수 있음. - 데이터베이스 값을 다룰 때 값이 없을 수도 있어서 유용함.
3) 메서드 제공 (유틸리티 기능)
Integer.parseInt("100")
,Integer.toString(200)
같은 유틸리티 메서드 사용 가능.Math.max(Integer a, Integer b)
같은 메서드는 객체 타입을 받음.
4) 오토박싱/언박싱으로 편리함
int
와Integer
가 자동 변환되므로 객체 지향적으로 코드를 작성할 때 유리함.
Integer a = 10; // 오토박싱 (int → Integer)
int b = a; // 오토언박싱 (Integer → int)
5) 불변 객체로 안전한 참조 유지
Integer
같은 래퍼 클래스는 불변 객체이므로, 값이 공유되어도 변경될 걱정이 없음.- 멀티스레드 환경에서 안전함.
정리하면
래퍼 클래스를 왜 쓰는가?
- 기본 타입을 객체처럼 다루기 위해!
- 컬렉션, 제네릭, null 값 처리, 메서드 활용, 불변 객체의 이점 때문!
기본적으로 성능이 중요한 경우에는 int
를 사용하고, 객체처럼 다뤄야 할 때는 Integer
를 사용하면 됨.