○ Wrapper 클래스
- 자바에서는 언어 수준에서 제공하는 기본형 데이터를 제외한 나머지 클래스로 설계하여 객체 단위로 처리한다.
- 따라서 자바에서는 이러한 기본형 데이터를 객체 단위로 처리할 수 있도록 클래스를 제공할 수 밖에 없는데 이러한 클래스들을 가리켜 Wrapper 클래스라 한다.
- 기본 자료형인 byte, short, int, long, float, double, char, boolean 형(primitive 메소드)에 대응하는 Byte, Short, Integer, Long, Float, Double, Char, Boolean의 Wrapper 클래스 및 큰 숫자들을 다루기 위한 java.math.BigInteger 와 java.math.BigDecimal 클래스를 제공한다.
- Wrapper 클래스는 java.lang 패키지에 포함되어 있으므로 별도의 import 과정 없이 바로 사용하는 것이 가능하며 기본형과 마찬가지로 Wrapper 클래스도 내부 메소드를 통해 형 변환이 가능하고, 동등 비교와 같은 연산도 가능하다.
- ex) java.lang,Integer 클래스 → int 기본 자료형의 Wrapper 클래스로 정수를 다루는데 필요한 상수나 메소드, 진수 변환 등에 필요한 메소드 등을 포함하고 있다.
- static Integer valueOf(int i) → int 형을 Integer 형으로 변환한다.
- static int parseInt(String s) → 문자열 형식으로 저장된 숫자를 정수 형태로 변환하여 반환한다.
- byte byteValue(), int intvValue(). short shortValue(), lopng longValue(), float floatValue(), double doubleVaule() 해당 기본 자료형으로 형 변환한 값을 반환한다.
○ 오토 박싱(Auto-Boxing)과 오토 언박싱(Auto-Unboxing)
- 일반적으로 레퍼런스 형과 기본 자료형은 호환되지 않으며 이 경우 발생하는 문제 해결을 위해 자바에서는 Wrapper 클래스를 제공하게 되었다.
- 하지만, JDK 1.5 부터 레퍼런스 형과 기본 자료형이 다음과 같이 형 변환이 가능하도록 문법적인 지원이 이루어졌다.
int a = 10, b;
Integer ob;
ob = a;
//-- 기본 자료형(int)이 Integer 형으로 자동 변환(오토 박싱)
// 실제로는... 『ob = new Integer(a);』
b = ob;
//-- Integer(객체)가 기본 자료형을 int guddmfh wkehd qusghks(dhxh djsqkrtld)
// 실제로는... 『b = ob.intValue();』 이렇게 작성하면 오토 언박싱이 아닌 언박싱
- 이는 JDK 1.5 이후 추가된 오토 박싱 / 오토 언박싱이라는 기능으로 인해 가능해진 것!!
▼ Test130
// import java.lang.*;
public class Test130 // extends Object
{
public static void main(String[] args)
{
int a=10, b;
Integer c;
Object d;
b = a; //-- int 형 데이터(자료) → int 형 변수
c = new Integer(0); //-- 객체 생성
// ※ 기본적으로 레퍼런스 형(참조 타입)과 기본 자료형(기본 타입)은 호환되지 않는다.
b = c; //-- Integer 형 데이터(객체) → int 형 변수 (오토 언박싱).
b = c.intValue(); //-- 객체의 메소드 호출을 통해 결과값 반환 (언박싱)
d = new Object(); //-- 객체 생성
System.out.println("d.toString() : " + d.toString());
//--==>> d.toString() : java.lang.Object@15db9742 //-- 임포트 구문이 생략되어 어느 패키지인지 알려주기 위해 패키지도 붙은 상태로 출력됨
d = new Integer(10); //-- 업 캐스팅 Object d = new Integer(10)
System.out.println("d.toString() : " + d.toString());
//--==>> d.toString() : 10
// Integer()에서 Object(부모)에 있는 toString()메소드를 오버라이딩 했다~! 그래서 해시코드 형태가 아니라 10이 나온다!
d = new Double(12.345); //-- 업 캐스팅
System.out.println("d.toString() : " + d.toString());
//--==>> d.toString() : 12.345
// Object d = 10;
d = 10; //-- 오토 박싱 → 업 캐스팅 d=new Integer(10)으로 오토박싱 된 것을 업캐스팅.
System.out.println("d.toString() : " + d.toString());
//--==>> d.toString() : 10
}
}
▼ Test131
public class Test131
{
public static void main(String[] args)
{
boolean bi = true;
Boolean wrapBi = new Boolean(bi); // 인스턴스 생성
Boolean wBi = bi; //-- 오토 박싱
int n = 300;
Integer wrapN = new Integer(n);
int n2 = wrapN; //-- 오토 언박싱
float f = 300.3f; //-- 300.3은 double 이라 float f = 300.3f으로 써야함
Float wrapF = new Float(f);
System.out.println(wrapBi.toString());
System.out.println(wrapN.toString());
System.out.println(wrapF.toString());
//--==>> true
// 300
// 300.3
System.out.println(wrapBi);
System.out.println(wrapN);
System.out.println(wrapF);
//--==>> true
// 300
// 300.3
// Integer 클래스
String sn = "12";
int ni = Integer.parseInt(sn);
System.out.printf("ni : %3d\n", ni);
//--==>> ni : 12
ni = Integer.parseInt("0101", 2); // 앞에 0이 오니까 문자열 형태로 써줘야 해. 뒤에 오는건 n진수 표현
System.out.printf("ni : %3d\n", ni);
//--==>> ni : 5
ni = Integer.parseInt("12", 8);
System.out.printf("ni : %3d\n", ni);
//--==>> ni : 10
ni = Integer.parseInt("A", 16);
System.out.printf("ni : %3d\n", ni);
//--==>> ni : 10
sn = Integer.toBinaryString(20);
System.out.printf("sn : %s\n", sn); // toXxx() 이런 메소드는 뭔가를 변환시킴, isXxxx()는 이것이 맞는지 아닌지 확인하게 하는 메소드일 확률이 높음
//--==>> sn : 10100
sn = Integer.toOctalString(31);
System.out.printf("sn : %s\n", sn);
//--==>> sn : 37
sn = Integer.toHexString(31); //-- 16진수
System.out.printf("sn : %s\n", sn);
//--==>> sn : 1f
Integer num = new Integer(50);
System.out.println("num.toString() : " + num.toString()); // 스트링 타입
//--==>> num.toString() : 50
int n3 = 345;
Integer n4 = Integer.valueOf(n3);
System.out.println("n4 : " + n4);
//--==>> n4 : 345
}
}