본문 바로가기
Java

[Java] 이차원 배열/다차원 배열(Dimensional Array) 그리고 가변배열

by 나는 개발자 2021. 1. 4.
TIL: 스스로 이해한 것을 바탕으로 정리하였기에 오류가 있을 수 있습니다. 틀린 부분은 댓글로 알려주시면 감사하겠습니다.

 

 

 

 

이차원배열/다차원배열 (Dimensional Array)

 

1차원 배열들의 묶음,

일차원 배열 여러개를 하나로 묶은 것을 이차원 또는 다차원배열이라고 부른다. 

(2차원배열의 묶음은 3차원배열이 된다.)

 

 

 

 

이차원 배열 선언

1)     자료형 배열명[ ] [ ] ;
2)     자료형[ ]  배열명[ ] ;
3)     자료형[ ] [ ] 배열명 ;


int arr[ ][ ] ;
int[ ] arr[ ] ;
int[ ][ ] arr ;

 

 

 

 

이차원 배열 할당(크기지정)

배열명 = new 자료형 [행크기] [열크기] ;

arr = new int [ 2 ] [ 3 ] ;

 

 

 

 

이차원 배열 선언과 동시에 할당

자료형[ ][ ] 배열명 = new 자료형 [행크기] [열크기] ;

 

 

 

 

 

호출 값을 보면, 

System.out.println(arr);        ==> stack에 있는 주소 값이 호출된다. 

System.out.println(arr[0]);     ==> heap에 있는 첫 번째 행의 주소 값이 호출된다.

System.out.println(arr[0][0]);  ==> 윗 첫 번째 행 주소값 속 첫번째 인덱스가 호출된다.

이해가 어려울 것 같아서 그림을 가지고 왔다.

좌측에 있는 그림은 메모리 속 배열의 저장을 그려 넣은 것이다. (Static은 빠져있다.)

 

int[ ][ ] arr = new int[2][4]; 의 이차원 배열을 선언했다고 쳤을 때, 

1. 일단 배열을 선언과 동시에 Heap이라는 공간에 박스(그림에서의 세로 박스/2행)가 만들어진다.

2. 그리고 그의 주소 값, 0a123을 담은 배열박스가 Stack에 동시에 만들어진다. 

3. 하지만, 이것이 이차열 배열이 되면 Heap공간에 새로운 박스(가로 박스/4열)가 생성되고, 행의 박스에 열의 주소 값이 담기게 된다. 

 

Stack속 주소 값을 담은 박스의 자료형은 int[ ][ ] 로서,  이 박스인 (arr)을 출력시키면 heap에 있는 int[ ](행)의 주소 값이 출력된다.

그다음, heap으로 들어가있는 행의 자료형은 int[ ] 으로서, [ ]하나가 스며들었다고 보면된다. 이 박스(arr[0])를 출력시키면, 그 안에 담긴 열의 주소값을 출력시킨다.

그 다음, 하나만 남은 열의 박스를 출력시키면 그제야 해당 인덱스를 출력시키는 것이다.

 

 

 

 

 

예시 1) for문과 이차원배열을 사용해서 별 찍기 (바깥쪽은 행, 안쪽은 열)

 

int [ ] [ ] arr = new int [3] [5] ;

 

for(int i= 0;  i<arr.length; i++) {

      for(int j=0; j<arr.length; j++) {

           System.out.print(arr[i][j]+" ");

      }

       System.out.println();

}

 

 

 

 

 

 

 

 

 

가변 배열 

행은 정해져 있으나 각 행에 대한 열의 개수가 정해져 있지 않은 상태

위 좌측의 그림처럼 열의 길이가 꼭 같을 필요는 없다. 

또한 우측의 그림처럼 열이 존재하지 않을 경우 heap행에 있는 열의 주소 값은 null이다. (주소가 아직 존재하지 않음)

 

 

 

 

 

가변 배열의 할당

자료형[ ][ ] 배열명 = new 자료형 [행크기][ ] ;

배열명[행 인덱스] = new 자료형 [열크기];

ex.
int[ ][ ] arr = new int [3] [ ] ;

arr[0] = new int[2]; //첫번째 행의 열박스 두개 생성; 
arr[1] = new int[1]; //두번째 행의 열박스 하나 생성;
arr[2] = new int[3]; //세번째 행의 열박스 하나 생성;

 

댓글