<2차 배열의 선언과 할당, 통합>
int[][] myarr; #선언
myarr = new int[2][3]; // 2행 3열 #할당
int [][] myarr = new int[2][3]; #선언과 할당의 통합
<각 원소에 직접 대입하기>
2행 3열인 경우에는 행의 인덱스는 0부터 1까지, 열의 인덱스는 0부터 2까지
배열에 저장된 원소 접근 -> 행, 열의 순서로 인덱스를 명시
<선언, 할당, 값 대입을 일괄 처리하기>
int[][] myarr = new int[][] {{1, 2, 3}, {10, 20, 30}};
<2차 배열의 의미>
2차 배열은 1차 배열안에 각각 개별적인 1차 배열이 포함되는 형태
<독립적인 1차 배열 구성>
int[] arr1 = {1, 2, 3};
int[] arr2 = {10, 20, 30};
<2차 배열은 1차 배열 안에 또 다른 배열 포함>
int[][] twoArray = {arr1, arr2};
<가변 배열>
2차 배열로 포함되는 배열이 각각 크기가 다름
int[][] myarr = new int [][] {{1, 2, 3, 4} , {10, 20}};
<2차 배열의 행, 열 크기 구하기>
int rowsize = myarr.length;
2차 배열의 모든 원소를 반복문으로 스캔, 중첩 반복문 사용 (부모 반복문은 행, 자식 반복문은 열에 관여)
<2차 배열 예제>
<2차 배열의 생성>
public class Ex01_2차배열의_생성 {
public static void main(String[] args) {
/** 2차배열의 의미 */
// 2차 배열의 선언
int[][] arr1;
// 2차 배열의 할당 --> 2개의 행으로만 생성
arr1 = new int [2][];
// 2차 배열의 원래 의미는 1차 배열의 각 칸에 새로운 배열을 놓는 형태
int [] hello = {10,20,30};
int [] world = {40,50,60};
arr1[0] = hello;
arr1[1] = world;
/** 2차 배열의 생성 */
// 2차 배열의 선언
int[][] arr2;
//2차 배열의 할당 --> 2행, 3열
arr2 = new int[2][3];
arr2[0] = hello;
arr2[1] = world;
System.out.println(arr2[0][0]);
System.out.println(arr2[0][1]);
System.out.println(arr2[0][2]);
System.out.println(arr2[1][0]);
System.out.println(arr2[1][1]);
System.out.println(arr2[1][2]);
System.out.println("-------------------");
/** 3차원 배열의 일괄 지정 */
int[][] arr3 = {{1,2,3}, {10,20,30}};
System.out.println(arr3[0][0]);
System.out.println(arr3[0][1]);
System.out.println(arr3[0][2]);
System.out.println(arr3[1][0]);
System.out.println(arr3[1][1]);
System.out.println(arr3[1][2]);
}
}
<가변 배열>
public class Ex02_가변배열 {
public static void main(String[] args) {
int[] a = {10,20,30};
int[] b = { 100, 200 };
//2차 배열로 선언된 배열의 각 원소가 서로 길이 다른 배열
int [][] foo = { a, b };
System.out.println(foo[0][0]);
System.out.println(foo[0][1]);
System.out.println(foo[0][2]);
System.out.println(foo[1][0]);
System.out.println(foo[1][1]);
System.out.println("----------------------");
/** 2차 배열의 일괄 생성 */
int [][] bar = new int[][] {{1,2,3,4},{10,20}};
System.out.println(bar[0][0]);
System.out.println(bar[0][1]);
System.out.println(bar[0][2]);
System.out.println(bar[0][3]);
System.out.println(bar[1][0]);
System.out.println(bar[1][1]);
}
}
<2차 배열의 탐색>
public class Ex03_2차배열의_탐색 {
public static void main(String[] args) {
int[][] foo = {{1,2,3}, {10,20,30}};
// 부모 반복문은 2차 배열의 행에 관여
for(int i = 0; i < foo.length; i++){
System.out.printf("%d번째의 행\n",i);
//foo[i]번째는 가각 독립적인 1차 배열이므로 그 자체로 탐색이 가능
for (int j = 0; j< foo[i].length; j++) {
System.out.printf("\t %d번째의 열: %d\n", j, foo[i][j]);
}
}
}
}
<2차 배열의 합계와 평균>
public class Ex04_2차배열_합계와_평균 {
public static void main(String[] args) {
String[] names = {"철수", "영희", "민혁"};
int[][] grade = {
{92, 81, 76},
{72,95,84},
{80,86,98}};
// 이 위치는에서의 변수는 2차 배열의 모든 원소에 대한 합계를 의미
int sum = 0;
// 성적배열의 행에 대한 탐색 --> 학생별을 의미
for(int i = 0; i<grade.length; i++) {
// 행단위의 합계는 새로운 행이 시작될 때 마다 변수를 새로 생성
// --> 개인별 합계
int personalSum = 0;
// 성적 배열의 i번째 행에 대한 열을 탐색 --> 특정 학생의 과목별 점수
for (int j = 0; j < grade[i].length; j++) {
sum += grade[i][j];
personalSum += grade[i][j];
}
int personalAvg = personalSum / grade[i].length;
System.out.printf("%d번째 행에 대한 %s의 합계: %d, 평균 : %d\n",
i, names[i],personalSum,personalAvg);
}
System.out.printf("모든 원소에 대한 전체 합계 %d\n", sum);
}
}