2차원 이상의 배열을 의미한다. 배열 요소로 또 다른 배열을 가지는 배열이다.
자료형[][] iArr자료형 iArr[][]자료형[] iArr[]자료형[][] 배열의 이름 = new 배열유형[1차원 배열 개수][1차원 배열 크기];자료형[][] 배열의 이름 = new 배열유형[1차원 배열 개수][];자료형[][] 배열의 이름 = new 배열유형 {{}, {}};자료형[][] 배열의 이름 = {{}, {}};
1차원 배열 개수: 행 (=arr.length)
1차원 배열 크기: 열
자료형[][] 배열의 이름 = new 배열유형[1차원 배열 개수][];의 형식으로 생성할 경우, 각각의 1차원 배열을 참조해주어야 한다.
생성과 동시에 값을 초기화할 경우,
new 배열유형은 생략 가능하다.
2차원 배열의 순회는 다음과 같다.

int[][] = arr = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 행 우선 순회
for (int r=0; r<arr.length; r++) {
for (int c=0; c<arr[r].length; c++) {
System.out.print(arr[r][c] + " ");
}
System.out.println();
}
// 열 우선 순회
for (int c=0; c<arr[0].length; c++) {
for (int r=0; r<arr.length; r++) {
System.out.print(arr[r][c] + " ");
}
System.out.println();
}
// 지그재그 순회
for (int r=0; r<arr.length; r++) {
if (r % 2 == 0) {
for (int c=0;, c<arr[r].length; c++) {
System.out.print(arr[r][c] + " ");
}
} else {
for (int c=arr[r].length-1;, c>=0; c--) {
System.out.print(arr[r][c] + " ");
}
}
System.out.println();
}

int[][] arr = new int[4][4];
int cnt = 0;
for (int r=0; r<4, r++) {
for (int c=r; c<4, c++) {
arr[r][c] = ++cnt;
}
}
// 행렬 출력하기
for (int r=0; r<4; r++) {
for (int c=0; c<4; c++) {
if (arr[r][c] == 0) {
System.out.print(" ");
} else {
System.out.printf("%3d", arr[r][c]);
}
}
System.out.println();
}

int[][] arr = new int[4][4];
int cnt = 0;
for (int r=0; r<4, r++) {
for (int c=0; c<4 - r, c++) {
arr[r][c] = ++cnt;
}
}
// 행렬 출력하기
for (int r=0; r<4; r++) {
for (int c=0; c<4; c++) {
if (arr[r][c] == 0) {
System.out.print(" ");
} else {
System.out.printf("%3d", arr[r][c]);
}
}
System.out.println();
}

int[][] arr = new int[4][4];
int cnt = 0;
for (int r=0; r<4, r++) {
for (int c=3; c>=r, c--) {
arr[r][c] = ++cnt;
}
}
// 행렬 출력하기
for (int r=0; r<4; r++) {
for (int c=0; c<4; c++) {
if (arr[r][c] == 0) {
System.out.print(" ");
} else {
System.out.printf("%3d", arr[r][c]);
}
}
System.out.println();
}

int[][] arr = new int[4][4];
int cnt = 0;
for (int c=0; c<4, c++) {
for (int r=c; r<4, r++) {
arr[r][c] = ++cnt;
}
}
// 행렬 출력하기
for (int r=0; r<4; r++) {
for (int c=0; c<4; c++) {
if (arr[r][c] == 0) {
System.out.print(" ");
} else {
System.out.printf("%3d", arr[r][c]);
}
}
System.out.println();
}

int[][] arr = new int[3][5];
int lft = 0;
int rgt = 5;
int cnt = 0
for (int r=0; r<3; r++) {
for (int c=lft; r<rgt; r++) {
arr[r][c] = ++cnt;
}
lft++;
rgt--;
}
// 행렬 출력하기
for (int r=0; r<arr.length; r++) {
for (int c=0; c<arr[c].length; c++) {
if (arr[r][c] == 0) {
System.out.print(" ");
} else {
System.out.printf("%2d", arr[r][c]);
}
}
System.out.println();
}

int[][] arr = new int[5][5];
int lft = 0;
int rgt = 5;
int cnt = 0;
for (int r=0; r<5; r++) {
for (int c=lft; c<rgt; c++) {
arr[r][c] = ++cnt;
}
if (r < 2) {
lft++;
rgt--;
} else {
lft--;
rgt++;
}
}
// 행렬 출력하기
for (int r=0; r<arr.length; r++) {
for (int c=0; c<arr[c].length; c++) {
if (arr[r][c] == 0) {
System.out.print(" ");
} else {
System.out.printf("%3d", arr[r][c]);
}
}
System.out.println();
}

탐색을 위한 델타 배열을 다음과 같이 만들 수 있다.
// 상하좌우
int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};// 상하좌우, 좌상, 우상, 좌하, 우하
int[] dr = {-1, 1, 0, 0, -1, -1, 1, 1};
int[] dc = {0, 0, -1, 1, -1, 1, -1, 1};// 다음 배열에서 1이 들어있는 칸의 상하좌우에 인접한 칸에 2를 채워 넣으시오.
int [][] arr = {
{0, 0, 0, 0, 0},
{0, 1, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 1, 0},
{0, 0, 0, 0, 0}
};
int N = 5;
int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};
for (int r=0; r<N; r++) {
for (int c=0; r<N; r++) {
if (arr[r][c] == 1) {
for (int d=0; d<4; d++) {
int nr = r + dr[d];
int nc = c + dc[d];
if (nr >= 0 && nr < N && nc >= 0 && nc < N)
arr[nr][nc] = 2;
}
}
}
}
// 행렬 출력하기
for (int r=0; r<N; r++) {
for (int c=0; c<N; c++)
System.out.printf("%2d", arr[r][c]);
}
System.out.println();
}
// 다음 배열에서 1이 들어있는 칸의 상하좌우 방향으로 길이가 2인 막대를 이어 붙인다.
int [][] arr = {
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
};
int N = 7;
int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};
for (int r=0; r<N; r++) {
for (int c=0; r<N; r++) {
if (arr[r][c] == 1) {
for (int d=0; d<4; d++) {
for (int l=2; l<=2; l++) {
int nr = r + dr[d] * l;
int nc = c + dc[d] * l;
if (nr >= 0 && nr < N && nc >= 0 && nc < N)
arr[nr][nc] = 2;
}
}
}
}
}
// 행렬 출력하기
for (int r=0; r<N; r++) {
for (int c=0; c<N; c++)
System.out.printf("%2d", arr[r][c]);
}
System.out.println();
}
// 다음 배열에서 1이 들어있는 칸을 포함한 행과 열에 모두 2를 채워 넣는다. (1이 들어있는 칸은 제외)
int [][] arr = {
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
};
int N = 7;
int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};
for (int r=0; r<N; r++) {
for (int c=0; r<N; r++) {
if (arr[r][c] == 1) {
for (int d=0; d<4; d++) {
int nr = r + dr[d];
int nc = c + dc[d];
while (nr >= 0 && nr < N && nc >= 0 && nc < N) {
arr[nr][nc] = 2;
nr += dr[d];
nc += dc[d];
}
}
}
}
}
// 행렬 출력하기
for (int r=0; r<N; r++) {
for (int c=0; c<N; c++)
System.out.printf("%2d", arr[r][c]);
}
System.out.println();
}
cmd+shift+f: 자동 정렬