자바 배열 변수를 대입연산자를 통해 복사하는 것이 어떤 의미인지를 정리하기 위해 작성해보았다.
1 | int[][] array_2 = array1; |
복사라고 하면 값을 그대로 가져다 사용하는것처럼 들릴수 있는데 사실 반은 맞고, 반은 틀리다.
대입연산자 =
는 값을 대입하는게 아니라 변수가 참조하는 주소 값을 대입하는 것이다.
1 | array_1[0][1] = 100; |
array_1
의 값중 하나를 바꾸었다. array_1
을 참조하는 배열 array_2
는 어떻게 됐을까?
array_1[0][1]
의 값을 바꾼 후, array_2[0][1]
도 값이 바뀌는지를 확인하기 위해 출력해보기로 했다. 그리고 컴파일해서 실행해보니 array_2[0][1]
도 함께 바뀐 것을 알 수 있다.
위에서 주소값을 참조한다고 했는데, 주소값이란 컴퓨터 메모리(Heap)에서 값에 해당하는 주소를 의미한다. 따라서 int num = 5;
은 int형 객체 변수 num이 5에 해당하는 객체를 참조 또는 가리키고 있다고 할 수 있다.
배열을 선언할 때 new
라는 키워드를 통해 선언을 했는데 이 키워드는 메모리 주소를 갖는 인스턴스를 생성할 때 사용한다. 키워드에 대한 설명은 이 글(JVM의 구조와 역할)을 참고바란다.
배열을 생성하면 프로그래머가 입력한 값을 담고있는 메모리상의 주소를 참조하는 변수가 생성된다는 것을 이해해야한다.
대입연산자 =
를 통해 값을 복사한게 아니라 참조하는 주소값을 대입받았다는 말을 이젠 이해할 수 있을 것이다. 따라서 대입연산자를 사용해서 **복사하는 것이 아니라 메모리 주소값을 가리키도록 명시**하는 것으로 이해해야한다.
자바에서는 JVM에서 메모리 관리를 자동으로 해주기 때문에 프로그래머가 주소값을 명시하거나 알 필요는 없을 수 있으나 그래도 이해는 필요하다고 생각했다.