Java

Wrapper Class

99duuk 2025. 2. 9. 16:44

​객체처럼 쓰기 위해

객체처럼 써야 할 때 기본형을 감싸는 역할

  1. 기본형 (int)은 가볍고 성능이 좋다.
  2. 하지만 객체로 다룰 수 없다
    따라서 컬렉션 (List, Map 등)에는 넣지 못한다.
  3. 래퍼 클래스 (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;
    }
}

이 경우 SampleDTOInteger 객체를 필드로 갖고 있는 것이고, 내부적으로는 객체 속에 또 객체가 있는 것과 같아.

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을 저장할 수 없지만, Integernull을 저장할 수 있음.
  • 데이터베이스 값을 다룰 때 값이 없을 수도 있어서 유용함.

3) 메서드 제공 (유틸리티 기능)

  • Integer.parseInt("100"), Integer.toString(200) 같은 유틸리티 메서드 사용 가능.
  • Math.max(Integer a, Integer b) 같은 메서드는 객체 타입을 받음.

4) 오토박싱/언박싱으로 편리함

  • intInteger가 자동 변환되므로 객체 지향적으로 코드를 작성할 때 유리함.
Integer a = 10; // 오토박싱 (int → Integer)
int b = a;      // 오토언박싱 (Integer → int)

5) 불변 객체로 안전한 참조 유지

  • Integer 같은 래퍼 클래스는 불변 객체이므로, 값이 공유되어도 변경될 걱정이 없음.
  • 멀티스레드 환경에서 안전함.

정리하면

래퍼 클래스를 왜 쓰는가?

  • 기본 타입을 객체처럼 다루기 위해!
  • 컬렉션, 제네릭, null 값 처리, 메서드 활용, 불변 객체의 이점 때문!

기본적으로 성능이 중요한 경우에는 int를 사용하고, 객체처럼 다뤄야 할 때는 Integer를 사용하면 됨.

'Java' 카테고리의 다른 글

객체지향에서 상속과 합성의 장단점  (1) 2025.02.04
리플렉션  (0) 2025.01.12
업캐스팅 다운캐스팅  (0) 2025.01.07
LSP  (0) 2024.12.29
리스트처리(for -> forEach), switch (enum), Null(Optional)  (1) 2024.12.25