값 형식과 참조 형식의 차이

[값형식]

-메모리의 Stack에 할당된다.

-변수에 값이 직접 저장됨.(Stack)

-기본 생성자는 예약되어 있음.

(Object와 String을 제외한 모든 형식은 값 기반 형식임)

[참조형식]

-메모리의 Heap에 할당된다.

-Stack의 변수가 Heap의 데이터 내용을 참조하여 저장한다.

=> 두 기반 형식의 가장 큰 차이점은 참조기반 형식은 Heap에 할당이 되고, 

값 기반 형식은  Stack에 할당이 된다는 것임.

Heap은 객체를 할당하여, 사용하지 않을 때 제거될 수 있으며,

Stack은 { } 블록 범위에서 메모리가 할당과 해제된다.

박싱과 언박싱 

1) 박싱(boxing)

값 타입을 Object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 것

기존에 저장된 Stack 영역에서 Heap 영역에 값 형식을 저장한다.

이처럼 int 값 형식의 변수를 Object라는 참조 형식으로 형 변환 하는 것.

그 목적은?

보통 파라미터로 전달이 되거나 List<Object> 형식으로 모든 값들을 입력받는 목적으로도 사용함

위 작성한 코드는 메모리상에서 아래와 같이 할당됨.

출처 : https://hongjinhyeon.tistory.com/90

스택 영역에 있는 i 값이 o로 변환 되면서 object 형식으로 선언이 되고, 값이 복사가 된다.

박싱은 보통 암시적으로 되며, 명시적으로도 가능하다.

[박싱의 과정]

1. 값 타입을 Heap에 생성하기 위해 메모리를 Heap 영역에 생성함.

2. 값을 Heap 영역에 할당된 메모리로 복사

3. 참조할 변수에 할당된 메모리 주소를 할당

1) 언박싱(unboxing)

Object 형식에서 값 형식으로, 또는 인터페이스 형식에서 해당 인터페이스를 구현하는 값 형식으로 변환하는 것.

[언박싱의 과정]

1. 개체 인스턴스가 지정한 값 형식을 박싱된 값인지 확인한다.

2. 박싱된 값이라면 값 타입 변수에 복사한다.

3. 박싱한 메모리와 언박싱한 메모리 2개 존재 (가비지 발생)

-> 모든 객체는 값 형식으로 언박싱 될 수 없고, 이전에 박싱이 된 데이터에 한하여 언박싱이 가능하다.

또한, 박싱하기 이전의 타입을 따라야 한다.

출처 : https://hongjinhyeon.tistory.com/90

위 그림에서 int를 박싱한 o의 객체를 다시 int 타입의 j 값에 넣고 있음.

-> 언박싱을 할 때 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하면 오류가 발생한다.

이 때는 미리 같은 타입인지를 먼저 확인하는 절차를 거쳐야 한다.

is 연산자를 이용해서 미리 같은 타입인지 확인 후에 캐스팅을 해야 안전하다.

=> 박싱과 언박싱에는 많은 시간이 소모된다.

되도록이면 제네릭을 사용해서 박싱과 언박싱이 일어나지 않도록 구성을 해야하며, 사용한다면

그 타입에 맞는 캐스팅을 해서 오류가 없이 처리해야 할 것임.

 

Posted by 팡다츄
,