자료형이 같은 1차원 배열의 묶음으로 배열 안에 다른 배열이 존재
2차원 배열은 할당된 공간마다 인덱스 번호 두 개 부여 (앞 번호는 행, 뒷 번호는 열([0][0]))
-> 1차원 배열 참조 변수를 묶음으로 다루는 것
--> 2차원 배열 == 1차원 배열 참조변수로 이루어진 배열
√ 인덱스 값 이해
√ 배열 선언
자료형[][] 배열명;
자료형 배열명[][];
자료형[] 배열명[];
√ 배열 할당
자료형[][] 배열명 = new 자료형[행크기][열크기];
자료형 배열명[][] = new 자료형[행크기][열크기];
자료형[] 배열명[] = new 자료형[행크기][열크기];
ex)
int[][] arr = new int[3][4];
int arr[][] = new int[3][4];
√ 인덱스를 이용한 초기화
arr[0][0] = 1;
arr[1][1] = 2;
√ for문을 이용한 초기화
for(int i=0; i<arr.length; i++) {
for(int j=0; j<arr[i].length; j++) {
arr[i][j] = j;
}
}
√ 선언과 동시에 초기화
int[][] arr = {{1, 2, 3, 4}, {5, 6, 7, 8}};
int[][] arr = new int[][] {{1, 2, 3, 4}, {5, 6, 7, 8}};
String fruit[][] = {{"사과", "딸기", "석류"}, {"바나나", "참외", "레몬"}};
다차원 배열 생성 시 마지막 배열차수의 크기를 지정하지 않고 나중에 서로 크기가 다른 배열로 지정한 배열
√ 가변 배열 할당
(2차원 가변 배열)
자료형[][] 배열명 = new 자료형[행크기][];
ex)
int[][] arr = new int[4][];
arr[0] = new int[3];
arr[1] = new int[4];
arr[2] = new int[5];
arr[3] = new int[2];
package edu.kh.array.ex;
public class ArrayEx2 {
// 2차원 배열 사용법 1
public void ex1() {
// 2차원 배열 선언 및 할당
int[][] arr = new int[2][3]; // 2행 3열
System.out.println("행의 길이 : " + arr.length);
System.out.println("열의 길이 : " + arr[0].length);
// 2차원 배열 초기화
// 1) 인덱스를 이용한 초기화
arr[0][0] = 7;
arr[0][1] = 14;
arr[0][2] = 21;
arr[1][0] = 28;
arr[1][1] = 35;
arr[1][2] = 42;
System.out.println("------------------");
// 2) 2중 for문을 이용한 초기화 방법
int number = 0;
for(int row=0;row<arr.length;row++) {
for(int col=0;col<arr[row].length;col++) {
arr[row][col] = number++ * 5;
}
}
System.out.println("------------------");
// 3) 선언 및 초기화
int[][] arr2 = {
{1, 2, 3, 4, 5},
{60, 70, 80, 90, 100},
{11, 22, 33, 44, 55}
};
System.out.println(arr2[1][3]);
System.out.println("------------------");
for(int row=0;row<arr2.length;row++) {
System.out.print(row + "행 : ");
// 한 행에 있는 모든 열의 값 출력
for(int col=0;col<arr2[row].length;col++) {
System.out.print(arr2[row][col] + " ");
}
System.out.println(); // 개행
}
}
// 2차원 배열 응용 1
public void ex2() {
// 3행 3열 짜리 int 2차원 배열에 난수(0~9)를 대입한 후
// 각 행의 합과 전체 합 출력
// 3 2 5
// 9 7 2
// 1 2 3
// 0행의 합 : 10
// 1행의 합 : 18
// 2행의 합 : 6
// 전체 합 : 34
int[][] arr = new int[3][3];
for(int row = 0;row<arr.length;row++) {
for(int col =0;col<arr[row].length;col++) {
arr[row][col] = (int)(Math.random()*10);
System.out.printf("%3d", arr[row][col]);
}
System.out.println();
}
System.out.println();
int total = 0;
for(int row=0;row<arr.length;row++) {
int sum = 0; // 행의 합
for(int col=0;col<arr[row].length;col++) {
sum += arr[row][col];
}
System.out.printf("%d행의 합 : %d\n", row, sum);
total += sum;
}
System.out.println("전체 합 : " + total);
}
public void ex3() {
// 가변 배열
// - 2차원 배열 할당 시
// 마지막 차수(열)의 크기를 지정하지 않고
// 추후에 각행에 새로운 1차원 배열의 주소를 대입하는 배열
char[][] arr = new char[4][];
arr[0] = new char[3];
arr[1] = new char[4];
arr[2] = new char[5];
arr[3] = new char[2];
// 배열의 모든 요소에 a부터 시작하여 하나씩 증가하는 알파벳 대입
char ch = 'a';
for(int row=0;row<arr.length;row++) {
// 각 행의 열의 길이가 다르기 때문에
// 조건식의 값이 행별로 변할 수 있도록
// arr[row].length 사용
for(int col=0;col<arr[row].length;col++) {
arr[row][col] = ch; // 요소에 문자 대입
ch++; // 다음 문자로 증가
System.out.print(arr[row][col]+" "); // 저장된 알파벳 출력
}
System.out.println();
}
}
}