[TIL] 20250106 Wrapper Class

Drumj·2025년 1월 6일
0

2025 TIL

목록 보기
6/11

Wrapper 클래스?

래퍼 클래스는 뭐야? (랩하는 클래슨가? ㅋㅋ 막이래~)
자바의 기본형 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을 반환할 일이 없어 문제가 안되는 것 같이 보일 수 도 있다.


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()) 기본형은 메서드를 제공할 수 없다. 또한 객체 참조가 필요한 컬렉션 프레임워크나 제네릭도 사용할 수 없다.


자바 Wrapper 클래스

자바는 기본형에 대응하는 래퍼 클래스를 제공한다.

  • 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편

0개의 댓글