6.3.1 배열의 참조
이 절에서는 배열의 사용법에 대해서 약간 더 구체적으로 알아보겠습니다. 배열의 복사에서 우리는 다음과 같은 구문을 사용했습니다.
▣ 배열끼리의 할당
◈ int[] ar1 = new int[]{0,1,2,3,4,5,6,7,8,9};
◈ int[] ar2 = ar1;
배열끼리의 할당에서 참조값복사가 이루어집니다. ar2에 ar1이 가지고 있던 참조값이 복사된 것입니다. 이 때 ar1으로 작업을 하든 ar2로 작업을 하든 동일한 결과를 얻을 수 있습니다. 즉 배열은 객체이기 때문에 객체의 참조값만 가지고 있으면 해당 객체를 핸들할 수 있습니다.
▣ 객체의 참조값
◈ 객체의 참조값만 있으면 해당 객체를 핸들할 수 있다.
직접적인 배열끼리의 할당 이외에도 배열이 매개변수로 전달될 경우에도 참조값복사가 일어납니다. 다음은 배열이 매개변수로 전달될 때 참조값복사가 일어나는 예를 보여주고 있습니다.
◈ public int sum(int[] temp){
◈ //...
◈ }
◈ int[] ar = new int[]{0,1,2,3,4,5,6,7,8,9};
▣ 배열이 메서드의 매개변수로 사용될 때
◈ sum(ar); //메서드 호출
◈ ar이 매개변수로 전달될 때 참조값복사 발생
sum(ar)을 호출할 때 배열을 매개변수로 전달하는 과정에서 참조값복사가 일어나는 것입니다. 배열이 매개변수로 사용될 때 참조값복사가 일어나는 과정을 그림으로 나타내면 다음과 같습니다.
매개변수의 참조값복사【chap06\arrayparamcopy.bmp】
위의 그림에서 sum(ar)을 호출하는 순간 다음과 같은 구문이 성립합니다.
▣ 참조값복사
◈ int[] temp = ar; //매개변수로 전달 될 때
배열이 매개변수로 전달될 때 위와 같은 참조값복사가 일어나는 것입니다. 그렇기 때문에 temp에서는 참조값 10001을 갖게 되고, 10001을 이용해서 다시 주소 FFFF:07CA를 찾아가서 실제 메모리에 접근하는 것입니다.
위에서 제시한 직접 할당을 이용한 참조값복사와 매개변수를 이용한 참조값복사를 예제로 작성해 보도록 하겠습니다.