코드 그라데이션

Day11-1. 다차원 배열과 가변 배열 본문

Java/Mega

Day11-1. 다차원 배열과 가변 배열

완벽한 장면 2023. 3. 29. 01:45

조심할 부분

예제) 이런 코드가 있습니다.

int[][][] b= new int[2][2][2];

이 때,

b의 자료형? Int[ ][ ][ ]

b[0]의 자료형? Int[ ][ ]

b[0][0]의 자료형? Int[ ] 

b[0][0][0] 자료형? Int

 

이 때? b =10 가능? 

No

why?

주어진 코드에서 b의 자료형은 int[ ][ ][ ]이다. 즉, 3차원 배열이란 소리.

먼저,

b[0]은 배열의 첫 번째 차원에서 첫 요소인 int[ ][ ] 타입의 배열이다. 이 배열은 2차원 배열이다.

b[0][0]은 b[0]에서 첫 번째 요소인 int[ ] 타입의 배열이다.

마지막으로 b[0][0][0]은 b[0]에서 첫 번째 요소인 int 타입의 값이다.

 

따라서  b=10; 은 잘못된 문법이다.

b는 3차원 배열인데, 10은 int 타입의 값이므로, b에 int 타입 10의 값을 할당할 수는 없다.

 

올바른 방법은 b 배열의 각 요소에 값을 할당하는 것

ex) b[0][0][0] =10; 

(b 배열의 첫 번째 차원에서 첫 번째 요소, 두 번째 차원에서 첫 번째 요소, 세 번째 차원에서 첫 번째 요소에 10을 할당)

 

이해하기 쉽도록

 

가변 배열

: 다차원 배열에서 각 차원의 크기가 서로 다른 배열

 

[사용하는 상황]

  • 각 행마다 열의 개수가 다른 2차원 배열
  • 각 페이지마다 행과 열의 개수가 다른 3차원 배열
  • 서로 다른 길이의 문자열을 저장하는 1차원 배열

[생성 방법]

* 다차원 배열을 생성할 때, 각 차원의 크기를 지정하지 않음

--> 배열을 생성한 후에 각 차원별로 크기를 지정해준다.

* 가장 먼저 바깥쪽 차원의 크기를 정해야 한다.

* 그 다음에 각 차원별로 배열을 생성하여 저장한다.

 

ex. 2차원 가변 배열을 생성하는 경우

int[][] d = new int[3][];

d[0] = new int[5];
d[1] = new int[2];
d[2] = new int[3];

이럴 때,

첫 번째 차원의 크기는 3으로 고정되었다.(즉, 행은 3행으로 고정되었다는 말이겠지)

 

그리고  두 번째 차원의 크기는 지정되지 않았다.

 

이후

첫 번째 행(d[0])에는 5개의 원소를 가지는 1차원 배열을 생성하고,

두 번째 행(d[1])에는 2개의 원소를 가지는 배열을 생성하며,

세 번째 행(d[2])에는 3개의 원소를 가지는 배열을 생성했다.

만든 배열의 모양

대충 위와 같은 모양이 나올 것이다.

 

공간으로 따지자면

이런 형태일 것이다.

 

가변 배열을 사용할 때는, 각 차원의 크기를 확인해서 배열에 접근해야 한다.

 

각 차원의 크기는 배열의 length 속성을 통해 확인할 수 있다.

(선생님이 말씀하시길, 우리가 습관적으로 i<5; 뭐 요렇게 쓰던 것은 가변 배열에서 통하지 않는다는...)

(왜나하면 가변 배열은 고정이 안 되어 있으므로 상수를 사용할 수 없지.)

 

가변 배열은 다양한 형태로 사용할 수 있으며, 다차원 배열을 더욱 유연하게 다룰 수 있도록 도와준다.

 

3차원 배열도 방법은 동일하다.

Int [][][] k = new int[5][][];

K[0] = new int[2][2];

이런 식으로...

---------------------------------

 

수업 예제

MultiArray1

package Day11;

public class MultyArrayTest1 {
	public static void main(String[] args) {
		int[][] d = new int[3][];
		d[0] = new int[5];
		d[1] = new int[2];
		d[2] = new int[3];
		
		for(int i = 0;i<d.length;i++) {
			for(int j=0;j<d[i].length;j++) {
				d[i][j] = 9;
				System.out.print(d[i][j]+"\t");
			}
			System.out.println();
		}
		
		int [][][] k = new int[5][][];
		
		k[0] = new int[5][3];
		
	}
}

 

코드의 흐름

* 2차원 배열 d 생성

** d : 3개의 배열 가지며 각 배열은 크기 다름

(첫 번째 5개 / 두 번째 2개 / 세 번째 3개)

* 이중 for문을 돌면서 모든 원소를 9로 초기화여 출력한다.

* 마지막으로 3차원 배열 k생성

** k : 5개의 배열 가지며, 각 배열은 2차원 배열을 가진다.

*** 여기서 첫 번째 배열은 5개의 2차원 배열을 가진다.

 

실행결과

9	9	9	9	9	
9	9	
9	9	9

 

 

MultiArray2

package Day11;

public class MultyArrayTest2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][][] b= new int[2][2][2];
		
		int count = 1;
		
		for(int i = 0;i<b.length;i++) {
			for(int j = 0;j<b[i].length;j++) {
				for(int x = 0;x<b[i][j].length;x++) {
					b[i][j][x] = count++;
				}
			}
		}
		for(int i = 0;i<b.length;i++) {
			for(int j = 0;j<b[i].length;j++) {
				for(int x = 0;x<b[i][j].length;x++) {
					System.out.print(b[i][j][x]+"\t");
				}
				System.out.println();
			}
			System.out.println();
		}
		
	}

}

 

코드의 흐름

* 먼저, 3차원 배열 "b"를 생성. "b"는 크기가 2x2x2인 배열.

* 이중 for 루프와 삼중 for 루프를 사용하여 "b" 배열의 모든 원소를 1부터 8까지의 숫자로 초기화.

* 초기화된 배열을 출력하기 위해 다시 이중 for 루프와 삼중 for 루프를 사용한다.

** 이중 for 루프는 3차원 배열의 앞 두 차원을 순회하고, 삼중 for 루프는 마지막 차원을 순회한다.

* 각 원소를 출력하고 줄바꿈을 하여 3차원 배열의 구조를 보여준다.

 

실행 결과

(3차원이라 정확하게 보이지는 않음.)

1	2	
3	4	

5	6	
7	8
728x90
Comments