본문 바로가기
Programming/Java

[자바/Java] Wrapper 클래스

by 코딩하는 랄로 2023. 10. 12.
728x90

Wrapper클래스란

자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어진다. 대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고 참조 타입은 class, String등이 있는데 프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 생긴다.

 

이 때에 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 한다. 자바는 모든 기본타입(primitive type)에 대해 객체를 생성할 수 있는 Wrapper 클래스가 있다.

 

이런 객체를 포장 객체라고도 하는데 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문입니다. 즉, 기본 타입을 감싸서(Wrap) 객체로 사용하기 때문에 래퍼 클래스인 것이다.

 

Wrapper 클래스의 인스턴스는 immutable 하기 때문에 값을 변경하기 위해서는 변경된 값을 가지고 있는 새로운 객체를 참조해야 한다.

 

 

 

Wrapper 클래스 종류

자바는 모든 기본 타입에 대해서 Wrapper 클래스를 제공하고 있고 래퍼 클래스의 이름은 해당 타입의 풀네임이기 때문에 기억하기 쉽다.(char, int 빼고는 타입과 풀네임이 일치)

 

기본타입(Primitive Type) Wrapper 클래스
byte Byte
char Character
int Integer
float Float
double Double
boolean Boolean
long Long
short Short

 

래퍼 클래스는 java.lang 패키지에 포함되어 있어 별다른 패키지 import없이 사용가능하다. 

 

 

 

Wrapper 클래스 계층 구조도

 

위의 계층 구조에서 볼 수 있듯 모든 래퍼 클래스의 부모는 Object이고 내부적으로 숫자를 다루는 래퍼클래스의 부모 클래스는 Number 클래스이다. 모든 래퍼 클래스는 최종 클래스로 정의된다.

 

 

 

Boxing() 과 Unboxing()

boxing과 unboxing은 래퍼 클래스의 필수 개념이다. 사실 이 단어가 뜻하는 바는 위에서 언급한 래퍼클래스에 대한 설명에 다 나와있다.

 

boxing()은 '포장한다'는 의미를 가진다. 즉, 기본타입을 래퍼 클래스로 감싸서 변환하는 것을 말하고, unboxing은 반대로 래퍼 클래스에서 기본 타입을 꺼내서 변환하는 것을 의미한다.

 

Integer boxing = new Integer(10);  // boxing()

int unboxing = boxing.intValue();  // unboxing()

 

 

 

자동 Boxing() 과 Unboxing()

기본타입 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있다. 이러한 현상은 자동 박싱의 래퍼 클래스 타입에 기본값이 대입될 경우에 발생한다. 예를 들어, int타입의 값을 Integer클래스 변수에 대입하면 자동 박싱이 일어나 힙 영역에 Integer객체가 생성됩니다.

 

Integer boxing = 10;  // auto boxing()

int unboxing = boxing;  // auto unboxing()

 

 

 

래퍼 객체의 값 비교

래퍼 객체는 내부의 값을 비교하기 위해 == 연산자를 사용할 수 없다. 자동 boxing과 unboxing을 통해서 객체를 기본타입처럼 초기화를 할 수 있다 하여도 결국에는 객체이기 때문이다.

 

그렇기 때문에 == 연산자를 사용하면, 값의 비교가 아닌 주소의 비교가 일어나므로 객체의 값을 비교하기 위한 equals 연산을 사용하여야 한다.

 

하지만 래퍼 객체와 기본타입과의 비교는 == 연산과 equals 연산 모두 가능하다. compiler가 컴파일 시 자동으로 boxing과 unboxing을 해주기 때문이다.

 

Integer num1 = new Integer(10); //래퍼 클래스1
Integer num2 = new Integer(10); //래퍼 클래스2
int num3 = 10; //기본타입
		 
System.out.println("래퍼클래스 == 기본타입 : "+(num1 == num3)); //true
System.out.println("래퍼클래스.equals(기본타입) : "+num1.equals(num3)); //true
System.out.println("래퍼클래스 == 래퍼클래스 : "+(num1 == num2)); //false
System.out.println("래퍼클래스.equals(래퍼클래스) : "+num1.equals(num2)); //true

 

728x90

'Programming > Java' 카테고리의 다른 글

[자바/Java] Collection1 - 개념  (1) 2023.10.13
[자바/Java] 제네릭(Generic)  (0) 2023.10.12
[자바/Java] Time 패키지의 클래스  (0) 2023.10.11
[자바/Java] Date 클래스  (1) 2023.10.10
[자바/Java] 문자열3 - 정규표현식  (1) 2023.10.09