MSM8994의 화룡점정 블로그

[JAVA] 배열을 배열에 담은 것이 2중 배열 본문

코딩

[JAVA] 배열을 배열에 담은 것이 2중 배열

msm8994 2018. 7. 18. 16:30

2중 배열은

배열을 배열에 담은 것인 다중 배열이기에 각 배열끼리는 다른 객체가 되기 때문입니다.

메모리에서 연속된 곳에 저장되어 있지 않는 것이지요.
사람들이 2중배열을 2차원을 표현하는데 쓴다고 2차원 배열이라고도 하는데
그렇게 생각해버리시면 [1][0]이 [0][8]의 다음 원소라거나 9번째 원소라고 생각하시게 될겁니다.
그래서 저는 이걸 잘못 생각한다고 봅니다.


C에서 쓰이는 malloc실행 - free실행 처럼 자바에서는 new실행 - null등 다른거 할당 을 통해 그 변수가 참조할 객체를 동적으로 생성하고 소멸시킬 수 있습니다.
참조형 변수(레퍼런스 타입)는 객체 자체가 아니라 그 객체를 가리키는 주소가 그 변수에 들어있고 객체는 메모리 어딘가에 있다고 들어보셨을겁니다.
2중배열도 같습니다. a라는 변수가 가리키는 메모리 어딘가에 배열을 만들고 그 원소마다 그게 가리키는 메모리 어딘가에 또 다른 배열들을 만들어 넣은거지요.
그렇기에 모양이 삐쭉삐쭉한 배열(a[1]엔 10개짜리, a[2]에는 5개짜리 배열을 할당)도 선언할 수 있습니다.
이것의 각 원소에 접근할 때는 a 배열로 가서 그 원소 배열에서 원하는 원소를 찾는 방식이 되기에 a[0][1] 처럼 인자가 두 개가 필요합니다.


String[][] janggi = {
      {"차","상","마","사"," ","사","상","마","차"},
      {" "," "," "," ","한"," "," "," "," "},
      {" ","포"," "," "," "," "," ","포"," "},
      {"병"," ","병"," ","병"," ","병"," ","병"},
      {" "," "," "," "," "," "," "," "," "},
      {" "," "," "," "," "," "," "," "," "},
      {"졸"," ","졸"," ","졸"," ","졸"," ","졸"},
      {" ","포"," "," "," "," "," ","포"," "},
      {" "," "," "," ","초"," "," "," "," "},
      {"차","상","마","사"," ","사","상","마","차"}
};

for(int row = 0; row < janggi.length; row ++) {
   for(int col = 0; col < janggi[row].length; col++) {
      System.out.print(janggi[row][col]);
   }
   System.out.println();
}


따라서 위 코드는 크기가 10인 배열의 각 원소마다 크기가 9인 배열이 하나씩 들어있으며
바깥쪽 for문에서 janggi라는 변수가 참조하는 배열의 크기를 확인하고
안쪽 for문에서 janggi 배열의 각 원소가 참조하는 배열의 크기를 확인하는 것입니다.
여기에서 
janggi[1] = new String[99];
이걸 for문 전에 실행하면 "한"이 있어야할 배열을 99개짜리 배열로 날려버려서 결과에 nullnullnullnull...nullnullnull이 나올겁니다. 이로써 janggi[0]과 janggi[1]은 다른 배열을 가리키는 것을 아실 수 있겠죠?
janggi[5] = janggi[6];
이걸 for문 전에 실행하면 초나라의 졸병들이 분신술(?)을 쓴게 됩니다.
janggi[6]이 가리키는 배열과 janggi[5]가 가리키는 배열이 같기 때문입니다.
janggi[5]가 가리키던 배열은... 아무도 그를 찾아주는 변수가 없으므로 소멸될 것입니다.

이해하시기 어려운 개념이라 본의 아니게 같은 내용을 여러번 적게 되었네요. ㅠㅠ

이해가 되었으면 좋겠네요


Comments