안녕하세요. 2차원 배열의 내용은 짧기 때문에 배열에 이어서 포스팅하겠습니다. 2차원 배열 부분은 설명은 짧지만, 실습 예제가 꽤 복잡합니다. 반복문에서 했던 별 찍기를 떠올리면서 들어가 보도록 하겠습니다.
▤ 목차
1. Java 2차원 배열의 필요성
2차원 배열은 행(row)과 열(column)로 이루어진 배열로, 데이터 테이블이나 행렬(matrix)과 같은 구조를 표현하는 데 유용합니다. 2차원 배열을 사용하면 복잡한 데이터를 체계적으로 관리할 수 있습니다. 실제로 나중에 배울 DB(데이터집합)에서 데이터를 추출해서 화면에 출력할 때 많이 사용합니다.
특징:
- 행과 열로 이루어진 구조
- 테이블 형태의 데이터 저장
- 복잡한 데이터 관리 용이
2차원 배열은 다음과 같은 상황에서 필요합니다:
- 행렬 연산을 수행할 때
- 테이블 형태의 데이터를 저장할 때
- 게임 개발에서 보드 형태의 데이터를 관리할 때
2. 2차원 배열이란?
2차원 배열은 배열의 배열로, 각 요소가 또 다른 배열을 참조하는 구조입니다. 이는 데이터를 행과 열의 형태로 저장할 수 있게 해 줍니다. Java에서는 배열의 각 행이 서로 다른 크기를 가질 수 있는 비정형 배열(Jagged Array)도 지원합니다.
특징:
- 배열의 배열 구조
- 행과 열의 인덱스로 접근
- 정형 배열과 비정형 배열 지원
2차원 배열 선언 방법
Java에서 2차원 배열을 선언하고 초기화하는 방법은 다음과 같습니다.
1. 정형 배열 선언 및 초기화
// 정형 배열 선언
int[][] array2D = new int[3][4];
// 정형 배열 선언과 동시에 초기화
int[][] array2D = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
2. 비정형 배열 선언 및 초기화
// 비정형 배열 선언
int[][] jaggedArray = new int[3][];
// 각 행의 크기를 다르게 초기화
jaggedArray[0] = new int[2];
jaggedArray[1] = new int[3];
jaggedArray[2] = new int[4];
특징:
- 정형 배열: 모든 행의 길이가 동일
- 비정형 배열: 각 행의 길이가 다를 수 있음
2차원 배열 접근 방법
2차원 배열의 각 요소는 행과 열의 인덱스를 사용하여 접근할 수 있습니다.
int[][] array2D = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int value = array2D[1][2]; // 두 번째 행의 세 번째 요소 접근
반복문을 사용하여 2차원 배열의 모든 요소에 접근할 수도 있습니다.
for(int i = 0; i < array2D.length; i++) {
for(int j = 0; j < array2D[i].length; j++) {
System.out.println(array2D[i][j]);
}
}
특징:
- 행과 열의 인덱스를 통한 요소 접근
- 중첩 반복문을 통한 전체 요소 접근
실습
풀이 :
public class Main {
public static void main(String[] args) {
// 1. 정수형 데이터를 저장할 수 있는 5행 5열 크기의 array를 선언하세요.
int[][] array = new int[5][5];
int num = 1;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
array[i][j] = num++;
}
}
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
System.out.print(array[i][j] + "\t"); // 정렬을 위해서 탭만큼 띄어쓰기(4칸정도 소모)
}
System.out.println();
}
}
}
(0, 0)1 | (0, 1)2 | (0, 2)3 | (0,3)4 | (0,4)5 |
(1, 0)6 | (1, 1)7 | (1, 2)8 | (1, 3)9 | (1, 4)10 |
(2, 0)11 | (2, 1)12 | (2, 2)13 | (2, 3)14 | (2, 4)15 |
(3, 0)16 | (3, 1)17 | (3, 2)18 | (3, 3)19 | (3, 4)20 |
(4, 0)21 | (4, 1)22 | (4, 2)23 | (4, 3)24 | (4, 4)25 |
행, 열에 맞춰서 1부터 순차적으로 출력하는 예제이기 때문에 어렵지는 않습니다.
풀이 :
public class Main {
public static void main(String[] args) {
// 1. 정수형 데이터를 저장할 수 있는 5행 5열 크기의 array를 선언하세요.
int[][] array = new int[5][5];
int num = 1;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
array[j][i] = num++; // i와 j의 순서만 바꿔줬다.
}
}
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
System.out.print(array[i][j] + "\t"); // 정렬을 위해서 탭만큼 띄어쓰기(4칸정도 소모)
}
System.out.println();
}
}
}
문제가 어려워졌다고 생각하지 말고, 행과 열이 바뀌었다고 보면 됩니다. 그래서 i와 j의 순서만 바꿔줬습니다. 그리고 출력되는 숫자는 1부터 25로 통일했습니다.
풀이 :
public class Main {
public static void main(String[] args) {
// 1. 정수형 데이터를 저장할 수 있는 5행 5열 크기의 array를 선언하세요.
int[][] array = new int[5][5];
int num = 1;
for (int i = 0; i < array.length; i++) {
if (i % 2 == 0) { // 홀수행 짝수행 구분해서 처리
for (int j = 0; j < array.length; j++) {
array[i][j] = num++;
}
} else {
for (int j = 4; j >= 0; j--) {
array[i][j] = num++;
}
}
}
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
System.out.print(array[i][j] + "\t"); // 정렬을 위해서 탭만큼 띄어쓰기(4칸정도 소모)
}
System.out.println();
}
}
}
짝수행이면 → 방향으로 처리, 홀수행이면 ← 방향으로 처리하게끔 만들었습니다.
풀이 :
public class Main {
public static void main(String[] args) {
// 1. 정수형 데이터를 저장할 수 있는 5행 5열 크기의 array를 선언하세요.
int[][] array = new int[5][5];
int num = 1; // 계속 추가될 숫자
int forNum = 2; // 기준점이 될 숫자
int forNum2 = 2; // 기준점이 될 숫자2
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < forNum; j++) {
System.out.print("0");
System.out.print("\t");
}
for (int j = forNum; j <= forNum2; j++) {
System.out.print(num++);
System.out.print("\t");
}
for (int j = forNum2; j < array.length - 1; j++) {
System.out.print("0");
System.out.print("\t");
}
if (i >= 2) {
forNum += 1;
forNum2 -= 1;
} else {
forNum -= 1;
forNum2 += 1;
}
System.out.println();
}
}
}
전에 for문에서 다이아몬드 별찍기 실습 기억하시나요? 그때의 소스와 비슷합니다. 다만, 해당 실습은 공백이 아니고 0이 출력되어야 해서 뒤에 0 출력 for문을 하나 더해주었습니다.
마무리
현업이 보는 2차원 배열의 필요성
현업에서 2차원 배열은 다양한 분야에서 사용됩니다. 특히, 데이터를 테이블 형태로 저장하거나, 이미지 데이터를 행렬로 처리할 때, 게임 개발에서 보드의 상태를 관리할 때 주로 사용됩니다. 또한, 알고리즘 문제 해결에서도 2차원 배열은 매우 유용합니다.
특징:
- 데이터 테이블 관리
- 이미지 및 그래픽 처리
- 게임 개발에서 보드 상태 관리
- 복잡한 알고리즘 구현
Java에서 2차원 배열은 데이터를 행과 열의 형태로 효율적으로 저장하고 관리할 수 있는 강력한 도구입니다. 2차원 배열의 개념, 선언 방법, 초기화 및 접근 방법을 이해하고, 이를 실무에 효과적으로 적용하는 것이 중요합니다. 특히, 복잡한 데이터를 체계적으로 관리하고 처리하는 데 있어 2차원 배열은 필수적인 자료 구조입니다. 실습을 하면서 많이 어려우셨을 겁니다. 많은 반복과 연습을 통해 익숙해지시길 바랍니다.
'프로그래밍 기초 > Java' 카테고리의 다른 글
[Java] 메소드: 필요성, 기본 구조, 사용 방법 및 오버로딩 (0) | 2024.06.16 |
---|---|
[Java] 배열: 개념, 선언 방법, 데이터 접근 및 초기화 (0) | 2024.06.15 |
[Java] 이중 for문 쉽게 배우기: 초보자를 위한 개념과 예제 (0) | 2024.06.15 |
[Java] 반복문 완벽 가이드 : 초보자를 위한 이해와 예제 (0) | 2024.06.14 |
[Java] 조건문 완벽 가이드 : 정의, 종류, 사용법, 특징 총 정리 (0) | 2024.06.12 |