Work/Java

[Head First Java] 3_2. 원시변수와 레퍼런스

kevin. 2007. 7. 18. 09:17

자..레퍼런스 변수 입니다.

레퍼런스 변수란 어떤 객체를 가르키는 포인터 같은 것입니다.

MyClass myclass = new MyClass();

와 같이 객체를 생성했다고 하면, myclass를 새로 생성된 MyClass 객체를 핸들링 할 수 있는 레퍼런스 변수라고 합니다.

따라서 레퍼런스 변수가 객체를 의미하지는 않습니다. 그저 객체를 조정할 수 있는 포인터에 불과하지요..

그럼 잠깐 C 얘기를 해볼까요?


int * a;

a = (int *)malloc(sizeof(int) * 10);


이렇게 하면 int 사이즈 곱하기 10개 만큼 사용할 메모리 공간이 확보되고, 그 공간은 "a"라는 변수를 이용해서 접근할 수 있습니다. 그쵸?

그럼 "a"의 사이즈는 얼마인가요? int를 4바이트라고 했을때 말이에요..

4 * 10 = 40 인가요? 아니죠.. 4바이트 입니다. 포인터 변수는 무조건 사이즈가 똑같아요..

사이즈가 똑같음에도 타입(int, char...)이 존재하는 이유는 포인터가 가르키는 위치로 부터 몇 바이트를 읽어올 것인가를 이 타입이 결정해 주기 때문이죠..


이제다시 자바로 돌아와서..

myclass의 크기는 얼마일까요? c 얘기한 걸로 봐서는 레퍼런스 변수가 모두 동일한 크기 일것 같죠?

네.. 맞습니다. 그렇지만 그 크기는 SUN만 알고 있을겁니다.

말씀드렸다시피 레퍼런스 변수는 객체를 의미하지 않기 때문에 객체에 대한 정보만을 담고 있지, 그 모든 값이나 메소드를 담고 있는것은 아닙니다.

그래서 모든 레퍼런스 변수는 동일한 크기를 가지고 있습니다.


레퍼런스 변수와 객체, 그리고 객체가 살고 있는 힙, 마지막으로 가비지 컬렉션에대해 잠시 이야기 해볼께요..

객체는 힙 이라는 공간에서 생성됩니다. 그런데 이 힙은 다른 메모리 공간과는 달리 가비지 컬렉션이 이루어지죠..

뒤에서 자세히 살펴보겠지만 대략 이야기 한다면 가비지 컬렉션은 "이제 쓰지 않는 메모리 공간을 청소하는 작업" 이라고 이해 하시면됩니다.

그럼 쓰는지 안쓰는지는 어떻게 알까요? 여기에는 복잡한 알고리즘이 있지만 우리가 임의로 구성해 볼 수도 있습니다.

아래와 같이요!


Animal a = new Animal();

Animal b = new Animal();

Animal c = b;

// 여기까지는 Animal 객체 2개, 레퍼런스 변수는 3개 입니다.

// b, c는 모두 동일한 Animal 객체를 포인팅하고 있죠~?


a = c;

// 여기서 문제가 발생했군요..

// a가 가르키던 객체는 이제 더 이상 핸들링 할 수 없습니다.

// 왜냐면, 그 객체를 가르키던 a라는 변수가 이제 c가 가르키는 객체를 포인팅하고 있으니까요..

// 이제 쓸모없어진 이전에 a가 가르키던 객체는 가비지 컬렉션 대상이되어 청소될 운명입니다.


레퍼런스 변수는 객체를 가르키기 때문에 값을 저장할 수 없습니다.

이것이 종종 배열에서 사람을 헷갈리게 하는 경우가 있는데요.. 아래를 보시죠~


int[] a = new int[3];

Animal[] b = new Animal[3];


a에다가는 값을 어떻게 넣을까요?

네.. a[0] = 0; a[1] = 1; a[2] = 2 이런식으로 주면 되겠죠?

그럼 레퍼런스 변수인 b는 어떤가요?


b[0] = new Animal();

Animal c = new Animal();

b[1]= c;


이렇게 객체의 레퍼런스를 넣어주어야 합니다. 쉽죠~?


이제 레퍼런스 변수까지 알았으니.. 다음에는 객체를 어떻게 사용하는지 공부해보도록 할ㄲ

tCfC+kcLbZTCPMh1d715bm9M3f0/XIGTe2bvFw9yw6g=

이 글은 스프링노트에서 작성되었습니다.