Wrapper Class는 무엇일까요?
래퍼 클래스는 하나 이상의 기본 타입(primitive type)을 wrap 하는 클래스입니다.
기본타입인 boolean, byte, char, int, float, double, long, short을 객체로 사용하는 클래스들을 말하는 거죠
그런 래퍼 클래스에는 Integer,Boolean,Double 등이 있습니다
그런데, 방금 위에서 하나 이상의 기본 타입이라 했는데 왜 하나 이상이라는 표현을 썼을까요?
Primitive(기본타입) | Wrapper Class(래퍼 클래스) | Constructor Argument (생성 인자) |
boolean | Boolean | byte or String |
char | Character | char |
int | Integer | int or String |
float | Float | float, double or String |
double | Double | double or String |
long | Long | long or String |
short | Short | short or String |
표에서 기본타입 char 행을 제외한 모든 타입이 인자에 String타입을 넣을 수 있는 걸 볼 수 있습니다.
이게 무슨 의미일까요?
public class Wrapper {
public static void main(String[] args) {
Integer num1 = new Integer(43);
Integer num2 = new Integer("43");
System.out.println(num1); // 43
System.out.println(num2); // 43
System.out.println(num1+num2); // 86
Integer 래퍼 클래스 변수인 num1,num2 에 각각 int 타입인 43과 , String 타입인 43을 넣었는데
출력값이 모두 43으로 나오고 있습니다.
뿐만 아니라 num1+num2 을 출력해 보면, 둘을 더한 값인 86이 출력됩니다.
이걸 통해 wrapper 클래스는 String 타입의 인자를 받아도 wrapper 클래스에 맞는 기본 타입처럼 사용이 가능하다는 걸 알 수 있습니다.
boolean a ;
Integer num1 = new Integer(43);
Integer num2 = new Integer("43");
System.out.println(num1.compareTo(num2)); //출력 0
int iNum1 = 43;
int iNum2 = 43;
//System.out.println(iNum1.compareTo(iNum2)); // 오류뜸
a= (num2==num1);
System.out.println(a); //출력 false
문자열이 같은지 비교해주는 compareTo 메서드를 Integer 타입인 num1과 num2에서도 사용이 가능하고
num1.compareTo(num2)를 출력할 시 같다는 의미인 0을 출력합니다.
# Integer가 아닌 int 타입의 변수에 compareTo 메서드를 사용하면 오류가 뜨는 것을 확인할 수 있습니다.
반면에 boolean타입을 통해 num2==num1을 출력해 보면
false 값이 출력됩니다.
이는 객체를 생성하면 Heap 메모리 영역에 새롭게 생성되기 때문에 각각의 객체인 num1과 num2가 다르기 때문입니다.
Wrapper Class는 주로 언제 사용될까요?
기본 타입(primitive type)이 아닌 객체로 저장이 필요할 때, 객체 간에 비교가 필요할 때 등 래퍼 클래스가 필요합니다.
기본 타입은 사용이 불가능하고, 객체 형태만 다룰 수 있는 Collections Framework에서는 Wrapper 객체로 생성해서
이용해야 합니다.
public class Wrapper {
public static void main(String[] args) {
List<int> list = new ArrayList<>(); //-> 오류
List<Integer> list2 = new ArrayList<>();
}
}
또한 위에서 봤던 문자열을 기본 데이터 타입으로 이용할 수 있을 경우에도 사용합니다.
public class Wrapper {
public static void main(String[] args) {
Integer num1 = new Integer(43);
Integer num2 = new Integer("43");
System.out.println(num1); // 43
System.out.println(num2); // 43
System.out.println(num1+num2); // 86
Wrapper Class의 Method
Integer 래퍼 클래스 초점에 맞춘 Method 설명이지만 8개의 래퍼 클래스 모두 적용가능합니다.
parseInt(s) | 문자열에 해당하는 10진수 숫자로 값을 반환한다(int 타입 반환) |
valuOf() | 문자열 또는 int 타입을 Integer 객체 반환한다. |
toString(i) | 정수를 새로운 String 객체로 반환한다 |
byteValue() | Integer 값을 byte 로 반환한다 |
doubleValue() | Integer 값을 double로 반환한다 |
floatValue() | Integer 값을 float로 반환한다 |
intValue() | Integer 값을 int로 반환한다 |
shortValue() | Integer 값을 short로 반환한다 |
longValue() | Integer 값을 long로 반환한다 |
int compareTo(inti) | 숫자 값을 비교해서 값이 같으면 0, 호출 개채에 값이 더 낮으면 음수, 더 크면 양수를 반환 |
static int compare(int num1,int num2) | num1과 num2의 값 비교하여 같으면 0, num1<num2 음수, num1>num2 양수 반환 |
boolean equals(Object intObj) | 호출하는 Integer 객체가 intObj와 동일하면 true 반환, 아니면 false 반환 |
Wrapper Class 의 autoboxing & unboxing
autoboxing& unboxing 이 무엇을 의미할까요?
자바에서는 autoboxing unboxing 기능을 컴파일러가 자동으로 해줍니다.
parseInt(s) | 문자열에 해당하는 10진수 숫자로 값을 반환한다(int 타입 반환) |
valuOf() | 문자열 또는 int 타입을 Integer 객체 반환한다. |
public class Wrapper {
public static void main(String[] args) {
String str ="3";
Integer num = new Integer(str);
Integer n1 = Integer.parseInt(str);
int n2 = Integer.valueOf(str);
Integer n3 = Integer.valueOf(str);
System.out.println(n1); //출력 3
System.out.println(n2); //출력 3
System.out.println(n1+n2); //출력 6
}
}
위에 표를 보면 parseInt 메서드는 반환값이 int 타입인 걸 알 수 있고
valuOf 메서드는 반환값이 Integer인 걸 알 수 있는데
코드를 보면
1. parseInt 메서드 반환값을 Integer 타입의 변수에 넣어도 오류가 나오지 않고
2. valuOf 메서드 반환값에 int 값을 넣어도 오류가 나오지 않는 걸 볼 수 있습니다.
1번의 경우가 바로 autoboxing의 경우이고
2번의 경우가 autounboxing의 경우입니다.
즉, 직접 int와 integer를 변환시켜주지 않아도 자바에서 자동으로 컴파일러가 해주는 거죠
그렇기 때문에 Integer 타입의 변수를 바로 int타입 숫자처럼 더해줘도 더한 값이 출력되는 겁니다
'Java > Java' 카테고리의 다른 글
Java_ Optional Class (0) | 2023.02.21 |
---|---|
Java 깊은 복사(Deep Copy) 와 얕은 복사( Shallow Copy) (0) | 2023.02.01 |
Java StringBuilder vs StringBuffer /Thread (0) | 2023.01.21 |
Java Thread (0) | 2023.01.21 |
Java StringBuilder 사용하는 이유와 사용법 (0) | 2023.01.21 |