진행하고 있는 프로젝트에서 거의 다 Long을 쓰기에 wrapper class에 대해 정리해봤다.
먼저 차이를 알기 위해서는 원시 타입과 참조 타입을 알아야 한다.
가끔 에러에서 보이면 뭔가 했는데 말 그대로 기본 타입으로 8가지가 있다. 크게 정수형, 실수형, 문자형, 논리형이 있다.
실제 메모리에 데이터 값을 직접 저장하는 타입이다.
참조 타입은 메모리 주소 값을 통해 객체를 참조하는 타입이다.
문자열, 배열, enum, 클래스 등이 있다.
참조 타입은 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다. 하지만 기본 타입은 null 지정이 불가능하다.
기본 타입을 참조 타입으로 변환시킬 때 Wrapper class를 사용한다.
래퍼 클래스는 위 8가지의 기본 타입에 해당하는 데이터를 객체로 포장해주는 클래스이다.
기본 타입 | 래퍼 클래스 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
박싱 : 기본 타입 → 래퍼 클래스
언박싱 : 래퍼 클래스 → 기본 타입
자바 컴파일러는 이를 자동으로 처리해준다.
Character ch = 'g' // 오토 박싱
char c = ch; //오토 언박싱
sout(c); // g가 정상적으로 출력
하지만 아래 경우는 조심해야한다.
Integer num1 = new Integer(7); // 박싱
Integer num1 = new Integer(100); // 박싱
Integer num2 = new Integer(100); // 박싱
Integer num3 = new Integer(200); //박싱
sou(num1 < num3) // true
sout(num1 == num2) // false
sout(num1.equals(num2)) //true
}
래퍼 클래스의 비교연산은 오토 언박싱으로 알아서 100과 200을 비교해준다. 하지만 동등 여부 판단은 객체끼리의 비교가 되어 주소값을 비교한다. 때문에 값이 어떤 값이든 무조건 false가 나오게 된다!!
비교를 위해서는 equals() 메소드를 사용해야한다.
기본 타입은 직접 값을 할당해 ‘Stack’에 값이 존재하고
참조 타입의 경우는 ‘Stack’에는 주소 정보만 있고 실제 데이터는 ‘Heap’에 있다.
따라서 값을 가져오는 속도나 메모리 둘 다 기본 타입이 낫다고 할 수 있다.
이유는 null을 사용할 수 있는지 여부에 있다.
기본 타입에서는 기본값이 0인데 그렇다면 request를 받았을 때 id값이 실제로 0인것인지 값이 없어서 0인지 구분하기 어렵다.
Wrapper 타입인 Long을 사용하면 id가 없는 경우에는 확실히 null이고, 그 자체로 id가 없다는 걸 보장할 수 있다.