[Java] 래퍼 클래스

벼랑 끝 코딩·2025년 2월 25일
0

Java

목록 보기
20/40

기본형

자바에는 변수 타입으로 총 8가지 기본형을 제공한다.

  • boolean
  • char
  • byte
  • int
  • short
  • long
  • float
  • double
int age;
char alphabet;
double pi;
...

참조형

참조형은 클래스를 만들고, new 연산자를 사용하여 생성한다.

class Clazz {
	// 코드
}

public void clazzMethod() {
	Clazz clazz = new Clazz();  // ** 참조형 객체 생성 **
}

기본형 문제점

간단하게 사용할 수 있는 기본형은 마냥 좋아보이지만,
사용에는 치명적인 단점이 있다.

기본형은 null 값을 가질 수 없다.

기본형은 값을 초기화하지 않는 경우, 자료형에 맞는 기본값이 자동으로 할당된다

boolean → false
int → 0
short → 0
...

기본형은 '값이 없다'라고 정확하게 표현할 수 없기 때문에
데이터를 다루는 데에 있어서 불편함이 있을 수 밖에 없다.

기본형은 객체가 아니기 때문에 메서드 제공이 불가능하다.

class Money { // 참조형
	
    int money;
    
    public earnMoney(int salary) {
    	money += salary;
    }
}

=============================

int value; // 기본형

Money는 객체형으로 돈을 버는 earnMoney()와 같은 다양한 메서드를 추가할 수 있다.
그에 반해, 기본형 int는 값 그 자체만을 가지고 있어 메서드를 추가할 수 없다.

기본형 입장에서는 부러운 기능을 바라보기만 할 뿐이다.
의기소침해진 기본형을 위해 우리는 무언가를 해주어야만 한다.

..가만 있어 보자.
money 필드도 결국에는 기본형 int 아닌가?
그렇다면 우리가 사용하는 기본형을 저렇게 감싸면 되는거 아닌가?

그렇다. 그것이 바로 래퍼 클래스다.

래퍼 클래스

래퍼 클래스란, 자바에서 제공하는 기본형을 객체로 감싸서
더 편리하게 사용하도록 도와주는 기본형의 객체 버전이다.
자바는 이러한 래퍼 클래스를 기본으로 제공한다.

byte → Byte
short → Short
int → Integer
long → Long
float → Float
double → Double
char → Character
boolean → Boolean

참고로 래퍼 클래스는 참조형이므로 동일성 비교가 아닌 동등 비교 대상이다.

박싱

래퍼 클래스는 다음과 같이 생성할 수 있다.

Integer value = Integer.valueOf(1);
Integer value = new Integer(1); // ** 불가 **

래퍼 클래스는 valueOf() 메서드를 통해서 생성할 수 있다.
참조형이라고 해서 new 연산자를 사용할 수도 있는데,
래퍼 클래스에 한정해서 사용하지 못하도록 없어질 기능이라
valueOf() 메서드를 사용해야만 한다.

그리고 마치 데이터를 래퍼 클래스라는 상자에 담는 것과 유사하다고 해서,
이렇게 생성하는 것을 박싱(Boxing)이라고 부른다.

언박싱

박스에 포장을 했으면,
꺼낼 수도 있어야겠지.
래퍼 클래스에서 값을 꺼내는 것은 다음과 같이 수행하면 된다.

int value = Integer.intValue();

래퍼 클래스에서 값을 꺼낼 때에는 XXXValue() 메서드를 사용하면 된다.
이 메서드를 사용할 경우 참조형인 래퍼 클래스를 기본형으로 변환할 수 있다.

오토 박싱과 오토 언박싱

하지만 기본형의 한계를 극복하고자 도입했던 래퍼 클래스가
쓰고 뺄 때마다 이렇게 번거롭게 박싱과 언박싱을 해야 한다면
아마 많은 개발자들이 진지하게 사용을 고민하고 대안을 찾았을지도 모른다.

그래서 자바는 자주 사용하게 될 래퍼 클래스를 자연스럽게 사용하기 위한
오토 박싱과 오토 언박싱을 지원한다.

int value = 1;

Integer autoBoxingValue = value; // ** 오토 박싱, valueOf() 메서드 미사용 **

int autoUnboxingValue = autoBoxingValue; // ** 오토 언박싱, intValue() 메서드 미사용 **

박싱과 언박싱에 필요한 valueOf(), XXXValue() 메서드를 사용하지 않고
래퍼 클래스와 기본형을 자유롭게 이동할 수 있게 됐다.

기본형 장점

그렇다면 제약이 있는 기본형은 아예 배제해버리면 되는 것이냐.
그건 아니다.

기본형은 오직 값 만을 포함하고 있는 만큼,
참조형보다 훨씬 메모리를 덜 사용하는 효율적인 녀석이다.
연산이 과도하게 많은 경우, 기본형을 사용하는 것이
더 빠르고 효율적이게 처리할 수 있는 방안이라면, 기본형을 사용하는 것이 좋다.

하지만 최근 하드웨어의 성능이 매우 좋기 때문에
유지 보수의 차원에서 기본형이 크게 고려되지 않는 것이 사실이다.

마무리

메서드를 적용할 수 없고, null 값이 불가능한 기본형의 제약은
매우 치명적인 단점으로, 반드시 극복해야 할 요소인데
우리는 래퍼 클래스로 앞으로 더 실용적인 구조를 설계할 수 있겠다.
오토 박싱과 오토 언박싱까지 있으니 래퍼 클래스를 야무지게 활용해보자.

profile
복습에 대한 비판과 지적을 부탁드립니다

0개의 댓글