자바에서는 2가지 형태로 값을 저장한다.
위 사진에서 볼 수 있는 10개의 기본 자료형은 값을 그대로 저장한다. 예를 들어 클래스 필드로
int a = 20;
이라는 값을 갖는다고 생각해보자. 그럼 아래 그림처럼 힙 영역에 a
를 저장하고, 20
이라는 값 자체를 2진수로 바꾸어 저장한다.
int a = 20;
A b = new A();
이번엔 위와 같은 코드가 작성되었다고 가정해보자. 아래에서 볼 수 있듯 new
를 통해 인스턴스 A
를 생성한 뒤 A
의 주소값을 변수 b
에 저장한다.
기본자료형이 아닌 참조 자료형은 이렇게 주소값이 저장됨을 알 수 있다.
그렇다면 래퍼클래스(Integer
, Double
, Byte
, Character
등)는 어떻게 저장될까?
결론부터 말하자면 참조자료형과 똑같이 저장된다. 기본 자료형 외에는 모두 참조 자료형이므로 위에서 본 참조자료형이 저장되는 방식으로 저장된다.
int a = 20; // 기본 자료형
Integer b = new Integer(20); // 래퍼클래스(참조자료형)
위에 그림에서 볼 수 있듯 int
(기본 자료형)로 20
을 선언하면 20
에 해당하는 값을 a
에 2진수로 저장한다.
반면 Integer
(래퍼클래스)로 20
을 선언하면 20
에 해당하는 인스턴스를 생성한 뒤 그 인스턴스의 주소값을 b
에 저장한다.
그럼
int c = (int)b;
를 하면 어떻게 될까?
위 그림처럼 힙에 c
가 생성되고 c
의 값은 주소값이 아닌 b
가 가리키는 인스턴스의 값을 읽어서 c
에 값으로 저장한다.