Java 래퍼 필요성 - 기본형
래퍼를 알아보기 전 기본형 문제점을 살펴본다.
그리고 엔진이나 프레임워크 소스에서 여러 래퍼 클래스가 있다. 래퍼를 익히게 되면 Wrapper 주석을 발견되더라도 당황하지 않는다.
기본형 문제점
자바는 객체지향 언어지만 객체가 아닌 것이 있다. int, long float double 이 키워드는 객체가 아닌 기본형 타입이다.(Primitive Type)
기본형 타입은 다음 문제가 있다.
- 객체가 아니다.
- 객체가 아니기에 객체 지향 프로그래밍의 장점을 사용할 수 없다.
객체의 유용한 메소드 제공할 수 없다.
- 객체가 아니기에 객체 지향 프로그래밍의 장점을 사용할 수 없다.
- 컬렉션 프레임워크를 사용할 수 없다.
- 컬렉션 프레임워크는 객체 참조가 필요하다.
- null 값을 할당할 수 없다.
- 기본형 데이터 타입은 null 이 없다. 데이터가 없다고 필요한 상황에 기본형은 항상 값이 존재하므로 이런 표현을 쓸 수 없다.
다음 코드에서 비교로 많이 사용하는 compareTo() 메소드를 만들어 기본형 문제점을 살펴본다.
compare To 함수로 비교할 때는 다음을 참고해야한다.
- 왼쪽 값이 더 작습니다 -> "-1" 반환
- 두 값이 같습니다 -> "0" 반환
- 왼쪽 값이 더 큽니다 -> "1" 반환
public class Main {
public static void main(String[] args) {
int value = 11;
int i1 = compareTo(value, 5);
int i2 = compareTo(value, 11);
int i3 = compareTo(value, 22);
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
}
public static int compareTo(int value, int target)
{
if (value < target) {
return -1;
} else if (value > target) {
return 1;
} else {
return 0;
}
}
}
1
0
-1
변수 value와 상관없는 외부 메소드를 사용하고 있다.
물론 외부 메소드 사용하여도 문제는 없지만 이 메소드가 변수 value 값을 계속 사용하는데 외부 메소드보다 자신의 메소드를 사용하는게 바람직해보인다. 그렇지만 value 타입인 integer 타입은 비교하는 메소드가 없다.
없다면 만들어 사용할 필요가 있는데. 이것이 wrapper 클래스가 있으며 이것을 사용하면 된다.
직접 사용하는 래퍼 클래스
int 타입 대신 새로운 클래스로 만들어보도록 한다. 해당 클래스는 int 값을 가지고 있는 클래스가 있으며 마치 int형처럼 사용할 것이다.
이렇게 특정 기본형을 감싸서(Wrap) 만드는 클래스를 래퍼(Wrapper) 클래스라 한다.
Tint.class
public class Tint {
private final int value;
public Tint(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public int compareTo(int target) {
if (value < target) {
return -1;
} else if (value > target) {
return 1;
} else {
return 0;
}
}
@Override
public String toString() {
return String.valueOf(value);
}
}int 감싸는 래퍼로 Tint 클래스를 만들었다. 이제 직접 사용해보도록 한다.
Main.class
public class Main {
public static void main(String[] args) {
Tint it = new Tint(11);
int i1 = it.compareTo(5);
int i2 = it.compareTo(11);
int i3 = it.compareTo(22);
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
}
}
1
0
-1