래퍼 클래스는 뭐야? (랩하는 클래슨가? ㅋㅋ 막이래~)
자바의 기본형 int
,double
,boolean
등등 을 객체로 감싸서 편리하게 사용하도록 해주는 클래스다. 자바 기본형의 객체버전! 이라고 생각하면 쉽다.
그럼 이게 왜 있어야할까? 숫자는 그냥 int
, long
을 쓰면 되지 않나? true,false는 boolean
을 쓰면 되지!
라고 생각할 수 있다. 아래 코드를 보자.
int value = 10;
int compare = compareTo(value, 5);
static int compareTo(int value, int target) {
if (value < target) return -1;
if (value > target) return 1;
return 0;
}
숫자 10을 target 숫자와 비교해서 target이 큰 경우 -1, 10 이 큰 경우 1, 같을 경우 0을 반환하는 메서드를 작성했다.
여기서 compareTo() 메서드에 value 값과 target 값 모두 필요한 것을 볼 수 있다.
만약 이게 객체였다면 value.compareTo(5)
와 같은 형식으로 작성할 수 있었을 것이다.
Integer integer = Integer.valueOf(10);
integer.compareTo(5);
자바에서 제공하는 래퍼클래스를 사용했다. 이렇게 하면 메서드를 작성할 필요도 없이 그냥 가져다 쓰기만 하면 된다!
또 기본형 int value
를 사용할 경우 null
값을 반환 할 수 없다는 문제도 있다.
위와 같은 compareTo()
메서드에선 null을 반환할 일이 없어 문제가 안되는 것 같이 보일 수 도 있다.
int[] arr = {-1,0,1,2,3};
findValue(arr, -1); //-1
findValue(arr, 2); //2
findValue(arr, 100); //-1 <- ???
static int findValue(int[] arr, int target) {
for (int value : intArr) {
if (value == target) {
return value;
}
}
return -1; // target 이 없을때도 -1을 반환하는게 문제. null을 반환할 수 없다.
}
배열에서 값을 찾아서 반환하고 target 이 없을 경우 -1 을 반환한다.
이렇게 코드를 작성할 경우 target = 100
일 경우에도 -1
을 반환하는 문제가 있다.
Integer[] integers = {-1, 0, 1};
findValue(intArr, -1);
findValue(intArr, 0);
findValue(intArr, 1);
findValue(intArr, 100); //null 반환
static Integer findValue(Integer[] intArr, int target) {
for (Integer value : intArr) {
if (value == target) {
return value;
}
}
return null;
}
위와 같이 Integer
객체를 사용한 경우에는 배열에 값이 없는 경우 null
을 반환해서 처리할 수 있다.
- 객체가 아님
- null 값을 가질 수 없음
기본형은 이처럼 한계를 가지고 있다. 이를 해결하기 위해 등장한 것이 바로 래퍼 클래스라고 할 수 있는 것이다.
객체가 아닌게 왜??
자바는 객체 지향 언어이다. 하지만 기본형인 경우 객체가 아니기 때문에 객체 지향 프로그래밍의 장점을 살릴 수 없다. 객체는 유용한 메서드를 제공할 수 있는데(위의 예시 compareTo()
) 기본형은 메서드를 제공할 수 없다. 또한 객체 참조가 필요한 컬렉션 프레임워크나 제네릭도 사용할 수 없다.
자바는 기본형에 대응하는 래퍼 클래스를 제공한다.
- byte -> Byte
- short -> Short
- int -> Integer
- long -> Long
- float -> Float
- double -> Double
- char -> Character
- boolena -> Boolean
거의 대부분 첫 글자가 대문자로 바뀌는 형식이다.
이런 래퍼 클래스는 다음과 같은 특징이 있다.
- 불변 객체
- equals로 비교
래퍼 클래스는 아래와 같이 사용하면 된다.
Integer newInteger = new Integer(10); // Deprecated
Integer integer = Integer.valueOf(10); // 이걸 사용해라, -128 ~ 127 자주 사용하는 숫자 값 재사용, 불변
Integer integer1 = 10; // 이렇게 사용해도 된다. 오토박싱 (기본형 -> 래퍼클래스)
int intValue = integer.intValue(); //언박싱(래퍼클래스 -> 기본형)
int intvalue1 = integer; //오토 언박싱
//비교
newInteger == integer; //false 객체 참조값이 다르다.
integer == integer1; //true 자주 사용하는 숫자(-128~127) 은 재사용하기 때문에 true 가 나오긴 한다.
newInteger.equlas(integer); //true equals()를 사용하는게 best!
- 김영한의 실전 자바 - 중급 1편