- 컴파일 타임에 크기가 결정 => 정적인 영역
- 변수가 코드 블럭을 벗어나면 데이터가 사라짐
- 런 타임에 동적으로 생성 가능
- 데이터가 코드블록의 여부와 상관없이 데이터가 유지 => 가비지컬렉터가 필요
"돈은 여기 있다. 이제 물건을 넘겨" => 물건 : 어떤 것이든 의미할 수 있음
object 타입의 변수는 다른 데이터 형식의 데이터를 다 담을 수 있다.
모든 데이터 형식을 자동으로 object 형식으로부터 상속을 받는다.
따라서 컴파일러는 어떤 형식의 데이터라도 object에 담아 처리할 수 있다.
cf_var과 object는 다르다. var은 자동으로 데이터 형식을 파악해 스택에 할당하고 object는 힙에 할당한다
object 형식은 참조 형식이기 때문에 Heap에 데이터를 할당한다.
그럼 값 형식의 데이터를 object 형식 객체에 담는 과정은 어떻게??
object a = 20;
1. 20은 박스에 담겨 힙에 할당
2. object type 변수 a는 stack에 할당되어 20의 주소를 참조
object a = 20;
int b = (int)a;
1. b가 a가 참조하고 있는 메모리로부터 값을 복사하려는 과정
2. 박싱된 값을 꺼낸다 -> 언박싱을 할 때 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하려면 오류(InvalidCastException)가 발생. 미리 같은 타입인지를 먼저 확인하는 절차 필요. is 연산자를 이용해서 미리 같은 타입인지 확인 후에 캐스팅을 해야 안전
3. 일치하는 값 형식 변수에 저장한다
값을 타입의 형식에 상관없이 저장을 할 수 있어서 사용
ArrayList arryL = new ArrayList();
arrL.add("Rio");
arrL.add(2022); // 박싱
arrL.add(myClassObject);
int thisYear = (int)arrL[1]; //언박싱
성능
캐스팅 여부 확인 및 지연 시간, 메모리 생성과 복사 시간, 가비지 발생 등 가급적 제네릭 사용으로 박싱/언박싱을 피하자