본문 바로가기
JAVA

[JAVA] 자바 배열 (Array) - 2차원 배열

by Amy IT 2022. 5. 21.

지난 글에 이어 2차원 배열에 대해 알아보겠습니다. 2차원 배열 역시 세 가지 방법으로 생성 가능합니다. 차례대로 보도록 하겠습니다. 

 

 

(1) new 키워드 이용

 

① 배열 선언 : 2개의 대괄호를 사용하여 배열을 선언합니다.

데이터형 [][] 배열명;

 

② 배열 생성 : new 키워드를 사용하고 크기를 지정하여 배열을 생성합니다. 행과 열 크기를 모두 지정하면 정방형의 2차원 배열이 생성되고, 열크기를 지정하지 않으면 비정방형의 2차원 배열이 생성됩니다. 이후 열 크기를 동적으로 지정할 수 있습니다. 배열 선언과 생성은 한 줄 또는 두 줄 작성 모두 가능 합니다. 생성된 배열의 각 방에는 초기값으로 기본값이 저장됩니다.

배열명 = new 데이터형[행크기][열크기];

 

③ 배열 초기화 : 실제 원하는 값을 저장합니다.

배열명[행인덱스][열인덱스] = 값;

 

 

* 정방형 배열

 

2행 3열로 총 6개의 방을 갖는 int 타입 정방형 배열을 생성하고 각 방에 값을 저장하는 프로그램입니다. 

int [][] num;
num = new int[2][3];

num[0][0] =10;
num[0][1] =20;
num[0][2] =30;
num[1][0] =40;
num[1][1] =50;
num[1][2] =60;

 

2차원 배열은 배열 안에 배열이 들어가는 형태입니다. 다음의 그림으로 이해할 수 있습니다.

 

배열 선언 후 배열을 생성하면 지정한 개수만큼 각 방이 만들어집니다. 전체 방에 대한 주소는 num 변수에 참조되고, 각각 3개 방을 갖는 배열에 대한 주소가 0번 방, 1번 방에 참조됩니다. 따라서 다음과 같이 num, num[0]을 출력하면 주소값이 나옵니다. 

System.out.println(num);
System.out.println(num[0]);
System.out.println(num[0][0]);

 

for문을 사용해 배열의 모든 데이터와 총 합계를 출력해 보겠습니다. 2차원 배열은 각 행에 대한 각 열을 모두 돌아야 하기 때문에 이중 for문이 필요합니다. num.length는 행의 개수를, num[i].length는 각 행의 열의 개수를 의미합니다. 

int total = 0;
for (int i = 0; i < num.length; i++) {
	for (int j = 0; j < num[i].length; j++) {
		total += num[i][j];
		System.out.print(num[i][j]+" ");
	}
}
System.out.println("배열 총합 : "+total);

i가 0일 때 안쪽 for문에서 j는 0부터 1, 2까지 증가하여 결과적으로 0번 방의 모든 배열을 지나게 됩니다. 안쪽 for문이 끝나면 바깥 for문에서 i가 1로 증가하여 다시 안쪽 for문을 반복합니다. 이렇게 하면 행과 열의 개수와 상관없이 2차원 배열이 갖는 모든 데이터를 검사할 수 있게 됩니다. 

 

for-each문도 마찬가지로 이중으로 작성해야 합니다. 바깥 for-each문에서는 각 행에 저장된 배열을 꺼내오기 위해 다시 int 타입의 배열로 데이터를 받고 있고, 안쪽 for-each문에서 실제 저장된 데이터 값을 꺼내오고 있습니다. 

int total1 = 0;
for (int[] is : num) {
	for (int data : is) {
		total1 += data;
		System.out.print(data+" ");
	}
}
System.out.println("for each문 총합 : "+total1);

 

 

* 비정방형 배열

 

이번엔 2행만 지정하여 비정방형 배열을 생성하는 프로그램입니다. 0번 방에는 3개 방을 갖는 배열이, 1번 방에는 2개 방을 갖는 배열이 들어가도록 지정하였습니다.

int [][] num = new int[2][];

num[0] = new int[3];
num[1] = new int[2];
num[0][0] = 10;
num[0][1] = 20;
num[0][2] = 30;
num[1][0] = 40;
num[1][1] = 50;

각 행이 갖는 열의 개수를 동적으로 지정할 수 있다는 차이만 있을 뿐, 크게 다른 점은 없습니다. for문과 for-each문을 사용하여 모든 데이터를 꺼내올 때도, length 속성을 이용하면 각 행과 각 열의 길이를 알아서 고려하게 되므로 위와 동일한 방법으로 가능합니다. 

 

 

 

(2) 리터럴 이용

 

리터럴을 이용한 2차원 배열 생성 방법입니다. 지정된 값의 개수만큼 자동으로 배열 크기가 설정되며, 배열 선언과 생성 및 초기화를 한 문장으로만 작성해야 합니다. 

데이터형 [][] 배열명 = { {값1,값2}, {값3,값4}, {값5,값6,값7} };

 

다음과 같이 비정방형의 2차원 배열을 생성할 수 있습니다. 3행에 첫 번째 행의 열은 10, 20, 30을 저장하고, 두 번째 행은 40을, 마지막 행은 50, 60을 저장하게 됩니다. 

int [][] num = {{10,20,30}, {40}, {50,60}};

 

 

 

(3) new 키워드와 리터럴 혼용

 

new 키워드와 리터럴을 혼용한 이차원 배열 생성 방법입니다. 이때 행과 열의 크기는 값의 개수로 결정되기 때문에 대괄호 안에 행과 열 크기를 지정하면 안 됩니다. 배열 선언과 생성 및 초기화를 한 줄 또는 두 줄로 모두 작성 가능합니다.

데이터형 [][] 배열명;
배열명 = new 데이터형[][]{ {값1,값2}, {값3,값4}, {값5,값6,값7} };

 

다음과 같이 활용 가능합니다.

int [][] num;
num = new int[][]{{10,20,30}, {40}, {50,60}};

 

 

이상으로 2차원 배열에 대한 내용을 정리해 보았습니다.

 

 

댓글