기본 자료형은 변수의 타입으로 쓸 수 있는 자료형이다.
기본자료형은
1. null 값을 허용하지 않는다.
2. 정해진 메모리를 할당한다.
3. 스택(stack)영역에 저장된다.
기본 자료형의 종류로는
정수형 / 문자형 / 실수형 / 논리형 이 있다.
정수형 | 실수형 | 문자형 | 논리형 | |
---|---|---|---|---|
1바이트 | byte | boolean | ||
2바이트 | shot | char | ||
4바이트 | int | float | ||
8바이트 | long | double |
기본 자료형들은 각각, 그것들을 참조자료형을 사용하기 위한 Wrapper class 가 존재한다.
기본자료형이 아닌 모든 자료형이 참조자료형이다.
참조자료형은 인스턴스 자료형을 가리킬 수 있는 자료형이고, 최상위 클래스인 Object를 상속받고 있다.
래퍼 클래스는 기본자료형을 참조자료형처럼 사용할 수 있게 감싸주는 클래스들이다. 모든 기본자료형에 대한 래퍼클래스가 있다.
래퍼 클래스는 String처럼 불변성을 가지고 있다.
(래퍼 클래스 안에 있는 값을 변경할 수 없다. => 상식적으로도 전세계 모든 이들이 약속하고 공통으로 사용되는 문자를 사용하는 방식이라던가, 숫자를 사용하는 방식이 개인적으로 커스텀이 가능하다면 그것은 정말 이상할 것이다.)
Primitive Type | Wrapper class |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
double | Double |
char | Character |
float | Float |
boolean | Boolean |
래퍼 클래스는 왜 존재하는 것일까 ?
먼저, 기본자료형과 참조자료형의 차이를 알고 나면 래퍼 클래스를 사용하는 이유 또한 자연스럽게 알 수 있을 것이다.
말 그대로 기본자료형을 래퍼 클래스로 감싸줄때에는 boxing이라고 표현하고 , 반대의 경우 unboxing 이라고 표현한다.
주로 위에서 언급한 상황들에서 기본자료형들을 boxing 하여 래퍼클래스를 만들어준다.
int primitiveInt = 10;
Integer wrapperInt1 = new Integer(10); //int -> Integer boxing 방법 1.
Integer wrapperInt2 = Integer.valueOf(10); //int -> Integer boxing 방법 2.
primitiveInt = wrapperInt1.IntValue; // Integer -> int unboxing.
primitiveInt = wrapperInt1; //JDK 1.5 이후부터 자바에서 자동으로 언박싱을 해준다.
위에서 언급했듯 자바에서 모든 객체는 힙(Heap)영역에 저장 되고 기본 자료형은 스택(STACK)영역에 저장된다.
저장되는 영역이 다른데, 일반적으로 힙에서 데이터를 불러올 때보다 스택에서 불러오는 것이 속도가 빠르기 때문에 꼭 객체여야 할 필요가 없으면 기본자료형을 사용해서 속도를 향상시키는 방향이 더 좋을 것 같다.