값 형식과 참조 형식의 차이
[값형식]
-메모리의 Stack에 할당된다.
-변수에 값이 직접 저장됨.(Stack)
-기본 생성자는 예약되어 있음.
(Object와 String을 제외한 모든 형식은 값 기반 형식임)
[참조형식]
-메모리의 Heap에 할당된다.
-Stack의 변수가 Heap의 데이터 내용을 참조하여 저장한다.
=> 두 기반 형식의 가장 큰 차이점은 참조기반 형식은 Heap에 할당이 되고,
값 기반 형식은 Stack에 할당이 된다는 것임.
Heap은 객체를 할당하여, 사용하지 않을 때 제거될 수 있으며,
Stack은 { } 블록 범위에서 메모리가 할당과 해제된다.
박싱과 언박싱
1) 박싱(boxing)
값 타입을 Object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 것
기존에 저장된 Stack 영역에서 Heap 영역에 값 형식을 저장한다.
이처럼 int 값 형식의 변수를 Object라는 참조 형식으로 형 변환 하는 것.
그 목적은?
보통 파라미터로 전달이 되거나 List<Object> 형식으로 모든 값들을 입력받는 목적으로도 사용함
위 작성한 코드는 메모리상에서 아래와 같이 할당됨.
스택 영역에 있는 i 값이 o로 변환 되면서 object 형식으로 선언이 되고, 값이 복사가 된다.
박싱은 보통 암시적으로 되며, 명시적으로도 가능하다.
[박싱의 과정]
1. 값 타입을 Heap에 생성하기 위해 메모리를 Heap 영역에 생성함.
2. 값을 Heap 영역에 할당된 메모리로 복사
3. 참조할 변수에 할당된 메모리 주소를 할당
1) 언박싱(unboxing)
Object 형식에서 값 형식으로, 또는 인터페이스 형식에서 해당 인터페이스를 구현하는 값 형식으로 변환하는 것.
[언박싱의 과정]
1. 개체 인스턴스가 지정한 값 형식을 박싱된 값인지 확인한다.
2. 박싱된 값이라면 값 타입 변수에 복사한다.
3. 박싱한 메모리와 언박싱한 메모리 2개 존재 (가비지 발생)
-> 모든 객체는 값 형식으로 언박싱 될 수 없고, 이전에 박싱이 된 데이터에 한하여 언박싱이 가능하다.
또한, 박싱하기 이전의 타입을 따라야 한다.
위 그림에서 int를 박싱한 o의 객체를 다시 int 타입의 j 값에 넣고 있음.
-> 언박싱을 할 때 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하면 오류가 발생한다.
이 때는 미리 같은 타입인지를 먼저 확인하는 절차를 거쳐야 한다.
is 연산자를 이용해서 미리 같은 타입인지 확인 후에 캐스팅을 해야 안전하다.
=> 박싱과 언박싱에는 많은 시간이 소모된다.
되도록이면 제네릭을 사용해서 박싱과 언박싱이 일어나지 않도록 구성을 해야하며, 사용한다면
그 타입에 맞는 캐스팅을 해서 오류가 없이 처리해야 할 것임.
'팡다츄의 면접준비' 카테고리의 다른 글
유니티 기술면접 준비 // API와 인터페이스 (0) | 2019.12.11 |
---|---|
유니티 기술면접 준비 01 (0) | 2019.12.11 |