본문 바로가기
Web

[Java] Wrapper 클래스

by DuncanKim 2022. 7. 18.
728x90

[Java] Wrapper 클래스

 

1. Wrapper Class 기본

 

자바는 기본 타입(byte, char, short, int, long, float, double, boolean)의 값을 갖는 객체를 생성할 수 있다. 이런 객체를 래퍼 객체라고 하는데, 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문이다. 이런 포장 객체는 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다. 만약 내부의 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.

 

기본 타입별 포장 클래스는 다음과 같이 매칭된다.

기본 타입 포장 클래스
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean

 

2. 박싱(Boxing) & 언박싱(Unboxing)

 

기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라고 한다.

 

 

1) 박싱

 

// 1000을 Integer로 박싱하기

Integer obj = new Integer(1000); // 기본 타입으로 값을 주는 방법
Integer obj = new Integer("1000"); // 문자열로 값을 주는 방법

기본적인 박싱은 다음과 같이 할 수 있다.

 

 

// 생성자를 사용하지 않고 정적 메소드 valueOf()를 써서 박싱하는 방법

Integer obj = Integer.valueOf(1000);
Integer obj = Integer.valueOf("1000");

생성자를 사용하지 않고 박싱을 할 수도 있다.

 

 

2) 언박싱

 

박싱된 객체에서 다시 기본타입의 값을 가지고 오고 싶으면 각 포장 클래스마다 가지고 있는 기본타입명+Value() 메소드를 호출하면된다.

 

//Boxing
Integer obj1 = new Integer(1000);

//Unboxing
int value1 = obj1.intValue();

 

 

3. 오토 박싱과 언박싱

 

1) 오토 박싱

 

기본 타입 값을 직접 박싱, 언박싱하지 않아도 자동으로 박싱과 언박싱이 일어나는 경우가 있다. 오토 박싱은 포장 클래스 타입에 기본값이 대입될 경우에 발생한다.

예를 들어, int 타입의 값을 Integer 클래스 변수에 대입하면 자동 박싱이 일어나 힙 영역에 Integer 객체가 생성된다.

 

Integer obj = 100; //auto Boxing

 

2) 오토 언박싱

 

기본 타입에 포장 객체가 대입될 경우에 발생한다.

예를 들어 Integer 객체를 int 타입 변수에 대입하거나, Integer 객체와 int 타입값을 연산하면, Integer 객체로부터 int 타입값이 자동 언박싱되어서 연산된다.

 

Integer obj = new Integer(200);
int value1 = obj; // auto Unboxing
int value2 = obj + 200; // auto Unboxing

 

ArrayList와 같은 컬렉션 객체에 값을 저장할 때에도 오토 박싱이 일어나 값이 저장된다.

List<Integer> list = new ArrayList<Integer>();
list.add(200); // auto Boxing

 

 

4. 문자열(String)을 기본 타입 값으로 변환하기

 

래퍼 클래스의 주요 용도는 기본 타입의 값을 박싱해서 포장 객체로 만드는 것인데, 문자열을 기본 타입 값으로 변환할 때도 많이 사용된다.

"parse+기본타입" 형식으로 되어 있는 정적 메소드가 있는데, 이 메소드는 문자열을 매개값으로 받아 기본 타입 값으로 반환해준다.

 

String str = "10";
int value1 = Integer.parseInt(str);
// value1은 기본 타입 정수 10의 값을 가진다.

 

이외 parseLong, parseDouble 등도 모두 가능하다.

 

 

5. 포장 객체 내부의 값 비교

 

포장 객체 내부의 값을 비교하기 위해서는 비교 연산자(==, !=)를 사용할 수 없다. 비교연산자는 내부의 값을 비교하는 것이 아니라 객체의 참조를 비교하기 때문이다. 

 

Integer obj1 = 200;
Integer obj2 = 200;
System.out.println(obj1 == obj2); //false

 

내부의 값만 비교하려면 언박싱을 한 값을 얻어서 비교해야 한다. 하지만, 언박싱을 하지 않고도 비교하는 방법이 있다. equals() 메소드로 내부의 값을 비교해볼 수 있다.

 

Integer obj1 = 200;
Integer obj2 = 200;
System.out.println(obj1 == obj2); //false
System.out.println(obj1.equals(obj2)); //true

 

한편, 추가적으로 알아두어야 할 것이 있는데, 자바 언어 자체에서 -128부터 127까지의 값은 equals()를 하지 않고 비교연산자를 사용해도 내부의 값을 비교해서 결과값을 내준다. 즉 위의 코드의 obj1, obj2에 100을 각각 집어넣었다면, 모두 참이 나오는 결과를 얻게 되는 것이다. 그렇지만, 값 별로 구분해서 쓴다고 생각하기 보다는, 왠만하면 값을 비교하는 곳에는 equals() 메소드를 활용하는 것이 좋을 것이다.

728x90

댓글