배열 참조
앞에서 배열의 선언과 생성은 별개임을 설명하였다. 그러므로 생성된 하나의 배열을 다수의 레퍼런스가 참조할 수도 있다. 다음 예시 코드를 통해서 그 개념에 대해서 알아보도록 하자.
int oldArray[] = {1, 2, 3, 4, 5};
int newArray[] = oldArray;
newArray[1] = 3;
위의 이미지를 보게 되면 stack과 heap이라는 글자가 보일 것이다. JVM내에는 지역변수와 같이 메소드 내에서 발생한 데이터를 저장하는 stack이라는 공간과 객체나 배열등의 인스턴스를 저장하는 heap이라는 공간이 있다. 즉, 메소드 내에서 레퍼런스 변수를 선언하게 되면 stack 공간에 레퍼런스 변수가 생기게 된다. 이어서, 배열을 생성하게 되면 heap 공간에 배열 데이터가 생성되게 된다. 그리고 '=' 연산자를 이용해서 스택 공간에 있는 레퍼런스 변수가 힙 공간의 배열을 가리키도록 만든다.
위의 예시 코드를 보면 oldArray 라는 레퍼런스 변수가 {1,2,3,4,5} 라는 배열을 가리키게 한 뒤에, 새로운 newArray 레퍼런스 변수를 선언한다. 그 다음에, "int newArray[] = oldArray;" 라는 문장을 통해서 newArray가 oldArray와 같은 배열을 가리키도록 만든다. 다시 말해서, oldArray라는 레퍼런스 변수와 newArray라는 레퍼런스 변수는 동일한 배열을 가리키고 있는 상태이다.
그 다음 줄을 보게 되면, "newArray[1] = 3;" 이라는 문장이 보일 것이다. 이 문장을 해석하게 되면, "newArray가 가리키는 배열에서 인덱스가 1인 원소의 값을 3으로 만들어라" 가 된다. 그런데 방금 말했듯이 현재 oldArray와 newArray는 같은 배열을 가리키고 있다. 따라서, 이 문장을 실행시키게 되면 oldArray[1]의 값도 3이 된다.
레퍼런스와 관련된 개념은 자바 프로그래밍에서 매우 중요한 개념이라고 할 수 있다. 따라서, 처음에는 직접 종이에 위의 이미지처럼 힙 스택 공간과 선언한 레퍼런스 변수등을 그려가면서 연습을 하는 것이 중요하다. 꽤 쉬워보이지만, 많은 자바 초보 개발자들이 이 부분에서 실수를 하곤 한다.
'Java > Java 기본' 카테고리의 다른 글
배열의 크기와 인덱스 (0) | 2018.06.12 |
---|---|
배열 원소 접근 (0) | 2018.06.12 |
배열 (Array) (0) | 2018.06.11 |
continue 문과 break 문 (0) | 2018.06.11 |
중첩 반복 (0) | 2018.06.11 |