기본 자료형, 원시 타입
원시 타입의 자료형은 스택 영역에 값이 저장된다.
기초가 되는 기본 자료형이기 때문에 null이 존재하지 않는다. (null도 하나의 type이라고 생각하면 이해하기 쉽다)
래퍼 클래스
원시 타입을 객체화 시켜놓은 클래스다.
원시 타입을 래핑했다고 래퍼 클래스라고 부르고 원시타입의 값을 래퍼클래스로 변환하는 것을 박싱(boxing)이라고한다. 반대의 경우도 있고 이를 언박싱(unboxing)이라 한다.
객체이기 때문에 값은 힙에 주소는 스택에 저장된다. 그러나 래퍼 클래스는 auto boxing, auto unboxing 기능을 지원하기 때문에 원시 타입처럼 선언하고 사용해도 컴파일에러가 날일이 없다.
예를 들어
// 원시 타입처럼 사용해도 에러x
Integer a = 10;
// 객체지만 원시 타입에 대입해도 에러x
int b = a;
// 객체와 원시 타입을 == 비교해도 에러x
int c = 10;
int d = 9;
System.out.println(a == c); //결과 true
System.out.println(a == d); //결과 false
Collection의 경우 힙에다 값을 저장하고 그 값의 주소들을 가지는 개념인데 이 경우 원시 타입을 사용할 수가 없어서 래퍼클래스가 필요해졌다.
그건 아니다 Array의 경우 지정된 크기의 메모리를 힙에서 할당 받고 거기다 원시값을 넣는다. 그러나 Collection과 Array는 비슷하게 생겼지만 전혀 다른 동작 방식을 가지고 있기 때문에 클래스 객체가 필요하다.
*Collection : List, Map, Set 등
둘이 거의 같은 것 같은데 그냥 래퍼 클래스만 사용하지 왜 나눠서 쓰는지 궁금할 수 있다.
이유는 아주 간단하다 그냥 래퍼 클래스는 객체기 때문에 메모리를 더 많이 먹는다.
원시 타입의 할당 메모리 + @ 가 각 원시 타입의 래퍼클래스가 먹는 메모리 크기이다.
Collection을 사용하지도 않고 래퍼 클래스의 내부 함수도 쓸일이 없는 경우에 굳이 메모리를 낭비하면서 쓸 필요가 없기 때문에 원시 타입이 필요한 것이다.