본 게시글은 혼자 공부하는 자바 (저자 : 신용권)의 책과 유튜브 영상을 참고하였고, 개인적으로 정리하는 글임을 알립니다.


자바는 기본 타입 의 값을 갖는 객체를 생성할 수 있다.

이런 객체를 포장 객체라고 하는데, 포장 객체의 특징은 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다는 점이다. 만약 내부의 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.

 

박싱(Boxing)과 언박싱(Unboxing)

  • 박싱 : 기본 타입의 값을 포장 객체로 만드는 과정
  • 언박싱 : 포장 객체에서 기본 타입의 값을 얻어내는 과정

 

//Boxing
Integer obj1 = new Integer(100); //생성자 이용
Integer obj2 = new Integer("200"); //생성자 이용
Integer obj3 = Integer.valueOf("300"); //valueOf() 메소드 이용

//Unboxing
int value1 = obj1.intValue();
int value2 = obj2.intValue();
int value3 = obj3.intValue();

System.out.println(value1);
System.out.println(value2);
System.out.println(value3);
/*
100
200
300
*/

위 예제에서 보는 것과 같이 박싱을 하는 방법은 생성자를 이용하는 방법과, valueOf() 메소드를 이용하는 방법이 있다.

언박싱을 하기 위해서는 각 포장 클래스마다 가지고 있는 기본타입이름 + Value() 메소드를 호출하면 된다.

 

 

자동 박싱과 언박싱

기본 타입 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있다.

자동 박싱은 포장 클래스 타입에 기본값이 대입될 경우에 발생한다.

자동 언박싱은 기본 타입에 포장 객체가 대입되는 경우와 연산에서 발생한다.

//자동 Boxing
Integer obj = 100;
System.out.println("value: " + obj.intValue());

//대입 시 자동 Unboxing
int value = obj;  	
System.out.println("value: " + value);

//연산 시 자동 Unboxing
int result = obj + 100;
System.out.println("result: " + result);

/*
value: 100
value: 100
result: 200
*/

 

 

문자열을 기본 타입 값으로 변환

  • 포장 클래스의 주요 용도는 기본 타입의 값을 박싱 해서 포장 객체로 만드는 것이지만, 문자열을 기본 타입 값으로 변환할 때에도 많이 사용된다. 
  • 대부분의 포장 클래스에는 parse+기본 타입 이름으로 되어있는 정적 메소드가 있다. 정적 메소드는 문자열을 매개값으로 받아 기본 타입 값으로 변환한다.
int value1 = Integer.parseInt("10");
double value2 = Double.parseDouble("3.14");
boolean value3 = Boolean.parseBoolean("true");

System.out.println("value1: " + value1);
System.out.println("value2: " + value2);
System.out.println("value3: " + value3);

/*
value1: 10
value2: 3.14
value3: true
*/

 

문자열을 기본 타입 값으로 변환할 때 많이 쓰는 방법은 아래와 같다.

 

 

포장 값 비교

  • 포장 객체는 내부의 값을 비교하기 위해 ==와 != 연산자를 사용하지 않는 것이 좋다. 이 연산자는 내부의 값을 비교하는 것이 아니라 포장 객체의 참조를 비교하기 때문이다.
  • 포장 객체 내부의 값을 비교하려면 equals() 메소드를 이용하는 것이 좋다.

박싱 된 값이 다음 표에 나와 있는 범위의 값이라면 ==와 !=연산자로 내부의 값을 바로 비교할 수 있지만, 그 이외의 경우에는 언박싱한 값을 얻어서 비교를 하거나 equals() 메소드를 이용해야 한다.

 

예제 코드

System.out.println("[-128~127 초과값일 경우]");
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println("==결과: " + (obj1 == obj2));
System.out.println("언박싱후 ==결과: " + (obj1.intValue() == obj2.intValue()));
System.out.println("equals() 결과: " + obj1.equals(obj2));
System.out.println();

System.out.println("[-128~127 범위값일 경우]");
Integer obj3 = 10;
Integer obj4 = 10;
System.out.println("==결과: " + (obj3 == obj4));
System.out.println("언박싱후 ==결과: " + (obj3.intValue() == obj4.intValue()));
System.out.println("equals() 결과: " + obj3.equals(obj4));

/*
[-128~127 초과값일 경우]
==결과: false
언박싱후 ==결과: true
equals() 결과: true

[-128~127 범위값일 경우]
==결과: true
언박싱후 ==결과: true
equals() 결과: true
*/