안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ |
Wrapper(포장) 클래스
기본 타입의 값을 갖는 객체를 Wrapper 객체라고 합니다.
기본 타입의 값을 내부에 두고 포장하기 때문입니다.
특징 : 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다는 것.
값을 변경하고 싶을 때는 새로운 포장 객체를 만들어야 합니다.
Wrapper 클래스는 java.lang 패키지에 포함되어 있습니다.
아래처럼 기본 타입과 대응되는 클래스들이 있습니다.
기본 타입 포장 클래스
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
박싱(Boxing)과 언박싱(Unboxing)
박싱 : 기본 타입의 값을 포장 객체로 만드는 과정
언박싱 : 포장 객체에서 기본 타입의 값을 얻어내는 과정
아래 표는 8개의 기본 타입의 값을 박싱하는 방법을 보여줍니다.
생성자를 이용하지 않아도 아래 처럼
각 포장 클래스마다 가지고 있는 정적 valueOf()메서드를 사용할 수 있습니다.
Integer obj = Integer.valueOf(1000);
Integer obj = Integer.valueOf("1000");
위 처럼 박싱된 포장 객체에서 다시 기본 타입의 값을 얻기위해서는(언박싱) 각 포장 클래스마다 가지고 있는 "기본타입명 + value()" 메서드를 호출하면 됩니다.
byte num = obj.byteValue();
char ch = obj.charValue();
short num = obj.shortValue();
int num = obj.intValue();
long num = obj.longValue();
float num = obj.floatValue();
double num = obj.doubleValue();
boolean bool = obj.booleanValue();
예제)
public class BoxingUnBoxingExample {
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);
}
}
자동 박싱과 언박싱
자동 박싱은 포장 클래스 타입에 기본값이 대입될 경우에 발생합니다.
ex) Integer obj = 107; // 자동 박싱
자동 언박싱은 기본 타입에 포장 객체가 대입될 경우 발생합니다.
ex) Integer obj = new Integer(107);
int val1 = obj; // 자동 언박싱
int val2 = obj + 10; // 자동 언박싱
=====================================================================================
문자열을 기본 타입 값으로 변환
Wrapper 클래스의 주요 용도는 기본 타입의 값을 박싱해서 포장 객체로 만드는 것이지만 ,
문자열을 기본 타입 값으로 변환할 때에도 많이 사용됩니다.
대부분의 포장 클래스에는 "parse + 기본타입" 명으로 되어있는 static 메서드가 있습니다.
이 메서드는 문자열을 매개값으로 받아 기본 타입 값으로 변환합니다.
byte num = Byte.parseByte();
short num = Short.parseShort();
int num = Int.parseInt();
long num = Long.parseLong();
float num = Float.parseFloat();
double num = Double.parseDouble();
boolean bool = Boolean.parseBoolean();
예제)
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");
}
}
포장 값 비교
Wrapper 객체는 내부의 값의 비교를 위해 ==와 != 연산자를 사용할 수 없습니다.
이 연산자들은 내부의 값을 비교하는 것이 아니라 Wrapper 객체의 참조를 비교하기 때문입니다.
ex)
Integer obj1 = 107;
Integer obj2 = 107;
System.out.println(obj1 == obj2); // true가 나와야 할 것 같지만 false가 나옵니다.
내부의 값만 비교하고 싶다면, 언박싱한 값을 비교해야 합니다.
박싱된 값이 아래 표에 나와 있는 값이라면 == 와 != 연산자로 내부의 값을 바로 비교할 수 있습니다.
타입 값의 범위
boolean true, false
char \u0000~ \u007f
byte,short,int -128~127
Wrapper 객체가 정확히 어떤 값이 저장될지 모른다면, ==, != 연산자는 사용하지 않는 것이 좋습니다.
내부 값을 언박싱해서 비교하거나 equals() 메서드로 내부 값을 비교하는 것이 좋습니다.
Wrapper 클래스의 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));
}
}