호쌤
호쌤 Just For Fun

[Java] 2차 배열

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Java] 2차 배열≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Java] 2차 배열

의 개념만 존재하는 1차 배열에 의 개념을 추가한 형태가 2차 배열 입니다. 좀 더 정확한 개념은 1차 배열의 각 원소가 다른 배열로 구성된 형태라고 보는 것이 맞습니다.

#01. 2차 배열 사용하기

1) 배열의 생성

선언

변수 선언시 데이터 타입 뒤에 행과 열을 의미하는 대괄호([])를 각각 명시

1
int[][] myarr;

할당

new 키워드 뒤에 데이터 타입을 명시하고 대괄호 안에 행과 열의 수를 결정해 준다.

1
myarr = new int[2][3];    // 2행3열

선언과 할당의 통합

1
int[][] myarr = new int[2][3];

2) 배열 원소에 값을 대입하기

각 원소에 직접 대입하기

2행 3열인 경우 의 인덱스는 0부터 1까지, 의 인덱스는 0부터 2까지 존재한다.

배열에 저장된 원소에 접근하기 위해서는 변수이름 뒤에 행,열의 순서로 인덱스를 명시한다.

대입 방법은 일반 변수와 동일하다.

1
2
3
4
5
6
7
myarr[0][0] = 1;    // 0행0열
myarr[0][1] = 2;    // 0행1열
myarr[0][2] = 3;    // 0행2열

myarr[1][0] = 10;    // 1행0열
myarr[1][1] = 20;    // 1행1열
myarr[1][2] = 30;    // 1행2열
  0번째 열 1번째 열 2번째 열
0번째 행 (0,0) = 1 (0,1) = 2 (0,2) = 3
1번째 행 (1,0) = 10 (1,1) = 20 (1,2) = 30

선언, 할당, 값 대입을 일괄 처리하기

1
int[][] myarr = new int[][] { {1, 2, 3}, {10, 20, 30} };

new int[][]는 생략 가능

1
int[][] myarr = { {1, 2, 3}, {10, 20, 30} };

배열은 값을 대입하지 않고 크기만 할당해 놓을 경우 모든 원소는 0으로 자동 초기화 된다.

3) 가변배열

2차 배열의 정확한 개념은 1차 배열의 각 원소가 다른 배열로 구성된 형태이다.

TwoDimArray1.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TwoDimArray1 {
    public static void main(String[] args) {
        // 독립적인 1차 배열 구성
        int[] arr1 = {1, 2, 3};
        int[] arr2 = {10, 20, 30};

        int[][] twoArray = { arr1, arr2 };

        System.out.print(twoArray[0][0] + ", ");
        System.out.print(twoArray[0][1] + ", ");
        System.out.println(twoArray[0][2]);
        System.out.print(twoArray[1][0] + ", ");
        System.out.print(twoArray[1][1] + ", ");
        System.out.println(twoArray[1][2]);
    }
}
출력결과
1
2
1, 2, 3
10, 20, 30

TwoDimArray2.java

TwoDimArray1.java 예제와 같이 항상 배열의 모든 행이 동일한 열로 구성되는 것은 아니다. (모든 줄의 칸 수가 같다는 보장은 없다는 의미)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TwoDimArray2 {
    public static void main(String[] args) {
        // 독립적인 1차 배열 구성
        int[] arr1 = {1, 2};
        int[] arr2 = {10, 20, 30, 40};

        // 1차 배열을 원소로 갖는 2차 배열 구성
        int[][] twoArray = { arr1, arr2 };

        System.out.print(twoArray[0][0] + ", ");
        System.out.println(twoArray[0][1]);
        System.out.print(twoArray[1][0] + ", ");
        System.out.print(twoArray[1][1] + ", ");
        System.out.print(twoArray[1][2] + ", ");
        System.out.println(twoArray[1][3]);
    }
}

TwoDimArray3.java

위의 코드에 대한 원소 배치를 일괄 처리하면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class TwoDimArray3 {
    public static void main(String[] args) {
        // 1차 배열을 원소로 갖는 2차 배열 구성
        int[][] twoArray = { {1, 2}, {10, 20, 30, 40} };

        System.out.print(twoArray[0][0] + ", ");
        System.out.println(twoArray[0][1]);
        System.out.print(twoArray[1][0] + ", ");
        System.out.print(twoArray[1][1] + ", ");
        System.out.print(twoArray[1][2] + ", ");
        System.out.println(twoArray[1][3]);
    }
}
출력결과
1
2
1, 2
10, 20, 30, 40

2차 배열의 행, 열 크기 구하기

2차 배열에 대한 길이를 직접 구하면 행의 크기를 알 수 있다.

1
int rowSize = myarr.length;

2차 배열의 모든 행에 대한 열 크기가 항상 동일하다는 보장이 없기 때문에 열의 크기는 각 행마다 개별적으로 구해야 한다.

1
2
int colSize0 = myarr[0].length; // 0번째 행의 열 크기
int colSize1 = myarr[1].length; // 1번째 행의 열 크기

#02. 2차 배열과 반복문

배열의 모든 원소 스캔하기

2차 배열의 모든 원소를 반복문으로 스캔하기 위해서는 중첩 반복문을 사용해야 한다.

이 때 부모 반복문은 에 대해 관여하고, 자식 반복문은 에 대해 관여한다.

TwoDimArray4.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TwoDimArray4 {
    public static void main(String[] args) {
        // 독립적인 1차 배열 구성
        int[] arr1 = {1, 2};
        int[] arr2 = {10, 20, 30, 40};

        int[][] twoArray = { arr1, arr2 };

        // 배열의 `행`에 대한 반복
        for (int i=0; i<twoArray.length; i++) {
            System.out.println(i + "번째 행 ----------");

            // i번째 행의 `열`에 대한 반복
            for (int j=0; j<twoArray[i].length; j++) {
                System.out.printf("\t%d번째 열 >> %d\n", j, twoArray[i][j]);
            }
        }
    }
}

출력결과

1
2
3
4
5
6
7
8
0번째 행 ----------
        0번째 열 >> 1
        1번째 열 >> 2
1번째 행 ----------
        0번째 열 >> 10
        1번째 열 >> 20
        2번째 열 >> 30
        3번째 열 >> 40

가변배열이 자주 등장하는 것은 아니다. 95% 이상의 경우가 모든 행의 열 크기가 동일한 경우이다.

GradeTable.java

아래의 성적표를 보고 학생 이름을 1차 배열로, 학생들의 점수를 2차 배열로 표현한 뒤 각 학생별로 총점과 평균을 구해 출력하시오.

  국어 영어 수학
철수 92 81 76
영희 72 95 84
민혁 80 86 98
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class GradeTable {
    public static void main(String[] args) {
        // 학생이름 배열
        String[] names = {"철수", "영희", "민혁"};

        // 학생 성적 배열
        int[][] grade = {
            { 92, 81, 76},
            { 72, 95, 84},
            { 80, 86, 98}
        };

        for (int i=0; i<grade.length; i++) {
            // 행 단위의 합계 이므로
            // 행 단위마다 합계를 위한 값이 새롭게 초기화 되어야 한다.
            int sum = 0;

            for (int j=0; j<grade[i].length; j++) {
                sum += grade[i][j];
            }

            // 총점을 과목 수로 나누면 평균을 얻을 수 있다.
            int avg = sum / grade[i].length;

            System.out.printf("[%s] 총점: %d, 평균: %d\n", names[i], sum, avg);
        }
    }
}
출력결과
1
2
3
[철수] 총점: 249, 평균: 83
[영희] 총점: 251, 평균: 83
[민혁] 총점: 264, 평균: 88

NumberTable.java

5행 7열로 구성된 2차 배열을 준비하고 배열의 모든 칸에 1부터 순차적으로 증가하는 값을 대입하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class NumberTable {
    public static void main(String[] args) {
        int[][] cal = new int[5][7];

        int count = 1;

        for (int i=0; i<cal.length; i++) {
            for (int j=0; j<cal[i].length; j++) {
                cal[i][j] = count++;

                // 아래 코드와 같은 의미
                // cal[i][j] = count;
                // count++;

                System.out.printf("%2d\t", cal[i][j]);
            }

            System.out.println();
        }
    }
}

출력결과

1
2
3
4
5
1       2       3       4       5       6       7
8       9      10      11      12      13      14
15      16      17      18      19      20      21
22      23      24      25      26      27      28
29      30      31      32      33      34      35

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Java] 2차 배열≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus