티스토리 뷰
주의 사항!
- 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
- 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
- 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.
자바는 기본 타입의 값을 갖는 객체를 생성할 수 있습니다. 이런 객체를 포장(Wrapper) 객체라고 하는데, 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문입니다. 포장 객체의 특징은 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다는 것입니다. 만약 내부의 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 합니다.
(String 객체가 이와 매우 유사합니다.)
포장 클래스는 java.lang 패키지에 포함되어 있습니다. 그리고 포장 클래스의 이름은 기본 타입의 첫 문자를 대문자로 바꾼 이름을 가지고 있습니다.
박싱(Boxing)과 언박싱(Unboxing)
기본 타입의 값을 포장 객체로 만드는 과정을 박싱(Boxing)이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어 내는 과정을 언박싱(Unboxing)이라고 합니다. 다음은 8개의 기본 타입의 값을 박싱 하는 방법을 보여주고 있습니다. 간단하게 포장 클래스의 생성자 매개 값으로 기본 타입의 값 또는 문자열을 넘겨주면 됩니다.
기본 타입의 값을 줄 경우 | 문자열을 줄 경우 |
Byte obj = new Byte(10); | Byte obj = new Byte("10"); |
Character ogj = new Character('한'); | 없음 |
Short obj = new Short(100); | Short obj = new Short("100"); |
Integer obj = new Integer(1000); | Integer obj = new Integer("1000"); |
Long obj = new Long(10000); | Long obj = new Long("10000"); |
Float obj = new Float(2.5f); | Float obj = new Float("2.5f"); |
Double obj = new Double(3.5); | Double obj = new Double("3.5"); |
Boolean obj = new Boolean(true); | Boolean obj = new Boolean("true"); |
생성자를 이용하지 않아도 다음과 같이 각 포장 클래스마다 가지고 있는 정적 valueOf() 메서드를 사용할 수도 있습니다.
Integer obj = Integer.valueOf(1000);
Integer obj = Integer.valueOf("1000");
이렇게 박싱 된 포장 객체에서 다시 기본 타입의 값을 얻기 위해서는 각 포장 클래스마다 가지고 있는 "기본 타입명+Value()"메서드를 호출하면 됩니다.
다음 예제는 기본 타입의 값을 박싱 하고 언박싱 하는 예를 보여줍니다.
//Main.java
package Example;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
//Boxing
Integer obj1 = new Integer(100);
Integer obj2 = new Integer("200");
Integer obj3 = Integer.valueOf("300");
//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
*/
자동 박싱과 언박싱
기본 타입 값을 직접 박싱, 언박싱 하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있습니다. 자동 방식은 포장 클래스 타입에 기본 값이 대입될 경우에 발생합니다. 예를 들어 int 타입의 값을 Integer 클래스 변수에 대입하면 자동 박싱이 일어나 힙 영역에 Integer 객체가 생성됩니다. 반면 자동 언박싱은 기본 타입에 포장 객체가 대입될 경우에 발생합니다.
Integer obj = 100; //자동 박싱
int value1 = obj; //자동 언박싱
int value2 = obj + 100; //자동 언박싱
문자열을 기본 타입 값으로 변환
포장 클래스의 주요 용도는 기본 타입의 값을 박싱 해서 포장 객체로 만드는 것이지만, 문자열을 기본 타입 값으로 변환할 때에도 많이 사용됩니다. 대부분의 포장 클래스에는 "parse+기본 타입"명으로 되어 있는 정적 메서드가 있습니다. 이 메서드는 문자열을 매개 값으로 받아 기본 타입 값으로 변환합니다.
//Main.java
package Example;
public class Main {
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
*/
포장 값 비교
포장 객체는 내부의 값을 비교하기 위해 ==나 !=연산자를 사용할 수 없습니다. 이 연산자는 내부의 값을 비교하는 것이 아니라 포장 객체의 참조를 비교하기 때문입니다. 내부의 값만 비교하려면 언박싱 한 값을 얻어 비교해야 합니다. 그러나 자바 언어 명세에 보면 다음과 같은 규칙이 있습니다. 박싱 된 값이 다음 표에 나와 있는 값이라면 ==와 != 연산자로 내부의 값을 바로 비교할 수 있습니다.
타입 | 값의 범위 |
boolean | true, false |
char | \u0000 ~ \u007f |
byte, short, int | -128 ~ 127 |
포장 객체에 정확히 어떤 값이 저장될지 모르는 상황이라면 ==와 != 연산자는 사용하지 않는 것이 좋습니다. 직접 내부 값을 언박싱 해서 비교하거나, equals() 메서드로 내부 값을 비교하는 것이 좋습니다. 포장 클래스의 equals() 메서드는 내부의 값을 비교하도록 오버 라이딩되어 있습니다.
//Main.java
package Example;
public class Main {
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 = 30;
Integer obj4 = 30;
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
*/
'공부 일지 > JAVA 공부 일지' 카테고리의 다른 글
자바, Date, Calendar 클래스 (0) | 2021.04.21 |
---|---|
자바, Math, Random 클래스 (0) | 2021.04.21 |
자바, Arrays 클래스 (0) | 2021.04.21 |
자바, 정규 표현식과 Pattern 클래스 (0) | 2021.04.21 |
자바, StringBuffer, StringBuilder 클래스 (0) | 2021.04.21 |