: 자바는 기본 타입(byte, char, short, int, long, float, double, boolean)의 값을
갖는 객체를 생성할 수 있음 → 이런 객체를 포장(Wrapper) 객체라고 함
→ 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문
· 포장 객체의 특징
: 포장하고 있는 기본 타입 값은 외부에서
변경할 수 없음
→ 만약 내부의 값을 변경하고 싶으면
새로운 포장 객체를 만들어야함
: 포장 객체는 주로 컬렉션 프라임워크에서 기본 타입 값을
객체로 생성해서 관리할 때 사용됨
: 포장 객체의 설계도인 포장 클래스는 java.lang 패키지에 포함되어 있음
: 다음과 같이 기본 타입에 대응되는 클래스들이 있음
char 타입과 int타입이 각각 Character와 Integer로 변경되고,
기본 타입의 첫 문자를 대문자로 바꾼 이름을 가지고 있음
· 박싱(Boxing)
: 기본 타입의 값을 포장 객체로 만드는 과정
· 언박싱(Unboxing)
: 포장 객체에서 기본 타입의 값을 얻어내는 과정
→ 8개의 기본 타입의 값을 박싱하는 방법을 보여주고 있음
간단하게 포장 클래스의 생성자 매개값으로
기본 타입의 값 또는 문자열로 넘겨주면 됨
Integer obj = Integer.valueOf(1000);
Integer obj = Integer.valueOf("1000");
: 생성자를 이용하지 않아도
각 포장 클래스마다 가지고 있는
정적 valueOf() 메소드를 사용할 수도 있음
→ 박싱된 포장 객에에서 다시
기본 타입의 값을 얻어내기 위해서는(언박싱하기 위해서는)
각 포장 클래스마다 가지고 있는
'기본 타입 이름 + Value()' 메소드를 호출하면 됨
👩💻 기본 타입의 값을 박싱하고 언박싱하기
public class BoxingUnBoxingExample {
public static void main(String[] args) {
//박싱
Integer obj1 = new Integer(100);
Integer obj2 = new Integer("200");
Integer obj3 = Integer.valueOf("300");
//언박싱
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
· 자동 박싱
: 기본 타입 값을 직접 박싱, 언박싱하지 않아도 자동적으로
박싱과 언박싱이 일어나는 경우가 있음
: 포장 클래스 타입에 기본값이 대입될 경우에 발생
ex)
int 타입의 값을 Integer 클래스 변수에 대입하면
자동 박싱이 일어나 힙 영역에 Integer 객체가 생성됨
Integer obj = 100; //자동 박싱
· 자동 언박싱
: 기본 타입에 포장 객체가 대입되는 경우와 연산에서 발생
ex)
Integer 객체를 int 타입 변수에 대입하거나,
Integer 객체와 int 값을 연산하면 Integer 객체로부터
int값이 자동 언박싱되어 연산됨
Integer obj = new Integer(200);
int value1 = obj; //자동 언박싱
int value2 = ojb + 100; //자동 언박싱
👩💻 자동 박싱과 언박싱
public class AutoBoxingUnBoxingExample {
public static void main(String[] args) {
//자동 박싱
Integer obj = 100;
System.out.println("value: " + obj.intValue());
//대입 시 자동 언박싱
int value = obj;
System.out.println("value: " + value);
//연산 시 자동 언박싱
int result = obj + 100;
System.out.println("result: " + result);
}
}
💻 결과
value: 100
value: 100
result: 200
: 포장 글래스의 주요 용도는
기본 타입의 값을 박싱해서 포장 객체로 만드는 것이지만,
문자열을 기본 타입 값으로 변환할 때에도 많이 사용됨
: 대부분의 포장 클래스에는
'parse+기본 타입 이름'으로 되어 있는 정적 메소드가 있음
정적 메소드는 문자열을 매개값으로 받아 기본 타입 값으로 변환함
👩💻 문자열을 기본 타입 값으로 변환
public class StringToPrimitiveValueExample {
public static void main(String[] args) {
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
: 포장 객체는 내부의 값을 비교하기 위해
==와 !=연산자를 사용하지 않는 것이 좋음
이 연산자는 내부의 값을 비교하는 것이 아니라
포장 객체의 참조를 비교하기 때문
ex)
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println(obj1 == obj2);
동일한 값을 갖고 있지만
== 연산의 결과는 false가 나옴
: 포장 객체에 정확히 어떤 값이 저장될지 모르는 상황이라면
직접 내부 값을 언박싱해서 비교하거나,
equals()메소드로 내부 값을 비교하는 것이 좋음
👩💻 포장 객체 비교
public class ValueCompareExample {
public static void main(String[] args) {
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