본문 바로가기
Java/Java 기초문법

[JAVA 기초] 자바 배열(Array) - 다차원 배열, deepToString, arraycopy 메서드

by dev수니 2021. 3. 6.
반응형

 

 1  2차원 배열의 선언과 생성

 

 

 

2차원 배열의 선언 방법을 1차원 배열을 선언하는 부분에 괄호[]를 하나 더 추가한다. 대괄호가 두개이므로 2차원 배열이다.

 

타입[][] 배열이름;
ex) int[][] student;
String[][] name;

 

 

 

참고로 3차원은 괄호[]를 3개 써주면 되며 그 이상은 차원의 수만큼 추가하면 된다.

 

ex) 6차원 배열을 생성할 때

int [][][][][][] b = new int [3][3][2][2][2][2];

 

 

 

 

2차원 배열을 생성할 때 첫 번째 괄호에 들어가는 수는 2차원 배열의 행이 되고 두 번째 괄호에 들어가는 수는 2차원 배열의 열이 된다.

 

타입[][] 배열이름 = new 타입[][];
ex) int[][] student = new int[3][3];
String[][] name = new String[3][2];

 

 

 


 

 

 

 2  2차원 배열의 인덱스

 

 

2차원 배열은 행과 열로 구성되어 있다. 첫 번째 괄호의 인덱스가 행을 두 번째 괄호의 인덱스가 열을 의미한다. 

예를 들어 3행 4열의 2차원 배열을 만들었다면 총 요소의 개수는 12개이며 행의 인덱스는 0부터 2까지, 열의 인덱스는 0부터 3까지의 값을 가진다. 

 

 

int[][] a = new int[3][4];

a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]

 

2행3열에 있는 요소를 가지고 작업을 하고 싶다면 a[1][2]를 사용하면된다.

 

 

 

 

 


 

 

 3  2차원 배열의 초기화와 출력

 

 

1. 2차원 배열을 초기화하는 방법은 여러가지가 있다. 먼저 배열의 타입과 배열이름을 선언한 후 각요소 하나하나 값을 넣어주는 방법이다.

int[][] num;
num = new int[4][3];
num[0][0] = 100;
num[0][1] = 200;
num[0][2] = 300;
num[1][0] = 400;
num[1][1] = 500;
num[1][2] = 600;
num[2][0] = 700;
num[2][1] = 800;
num[2][2] = 900;
num[3][0] = 200;
num[3][1] = 400;
num[3][2] = 500;

 

 

위와 같은 방법은 코드의 길이가 길어지고 반복되는 구조가 되므로 다음과 같이 사용할 수도 있다.

int[][] num = new int[4][3];
num[0] = new int[] {100,200,300};
num[1] = new int[] {400,500,600};
num[2] = new int[] {700,800,900};
num[3] = new int[] {200,400,500};

 

 

 

다음과 같은 방법으로 초기화 해주어 더 짧게 선언해줄 수도 있다.

int[][] num = {{100,200,300}, {400,500,600}, {700,800,900}, {200,400,500}};

 

 

 

다만 2차원 배열인 것을 눈으로 쉽게 확인하기 위해 다음과 같은 방법을 권장한다.

 

int[][] a = {
     {100,200,300},
     {400,500,600},
     {700,800,900},
     {200,400,500}
};

 

 

 

 

 

 

 

2. 다음은 2차원 배열을 출력하는 방법이다. 2차원 배열을 출력하기 위해서는 여러가지 방법이 있다.

 

 

먼저 다중 for문을 이용해 출력하는 방법이다.

첫번째 for문은 행을 두번째 for문은 열을 나타낸다. 조건식의 크기는 각각 행길이와 열길이로 설정해 주면된다.

(행은 arr.length로, 열은 arr[].length로)

int[][] arr = {
     {100,200,300},
     {400,500,600},
     {700,800,900},
     {200,400,500}
};

// 출력부분
for (int i = 0; i<arr.length; i++) {
     for (int j = 0; j<arr[i].length; j++) {
          System.out.print(arr[i][j] + " ");
     }
     System.out.println();    // 행이 끝났을 때 줄바꿈
}


// 결과
100 200 300
400 500 600
700 800 900
200 400 500

 

 

 

다음은 Array.toString() 메서드로 출력하는 방법이다.

 

1차원 배열에서 배열을 출력하는 방법으로 쓰였지만 2차원에서는 단순히 Array.toString() 메서드만으로 배열을 출력할 수 없다. 배열 안에 배열이 있는 구조이기 때문이다. 따라서 for문을 이용하여 다음과 같이 출력할 수 있다.

*import java.util.Arrays;    // import 필수

int[][] arr = {

     {100,200,300},
     {400,500,600},
     {700,800,900},
     {200,400,500}
};

// 출력부분
for(int i=0; i<arr.length; i++{
    System.out.println(Arrays.toString(arr[i]));
};


// 결과
[100, 200, 300]
[400, 500, 600]
[700, 800, 900]
[200, 400, 500]

 

 

 

 

같은 Arrays패키지의 메서드로 deepToSting() 도 있다. 이 메서드는 다차원배열을 위한 것이다.

사용방법은 Arrays.deepToString(배열이름) 으로 다음과 같다.

int[][] arr = {
     {100,200,300},
     {400,500,600},
     {700,800,900},
     {200,400,500}
};

// 출력방법
System.out.println(Arrays.deepToString(arr));


// 결과
[[100, 200, 300], [400, 500, 600], [700, 800, 900], [200, 400, 500]]

 

 


 

 

 4  2차원 배열의 사용 예제

 

1. 다음 2차원 배열을 반시계방향으로 90º 회전하라.

int int[][] arr = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
};

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package java_practice;
 
import java.util.Arrays;
 
public class Array_2_Rota {
 
    public static void main(String[] args) {
        int[][] arr = {
                {1,2,3},
                {4,5,6},
                {7,8,9}
        };
        int[][] arr2 = new int[3][3];
        
        for(int i=0; i<arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr2[i][j] = arr[j][2-i];
            }
            System.out.println(Arrays.toString(arr2[i]));
        }
    }
}
cs

 

 

 

 

이 문제를 풀기 위해 먼저 같은 길이를 갖는 새로운 배열을 선언해준다.

int[][] arr2 = new int[3][3];

 

arr 배열을 반시계방향으로 90º 회전하면 다음과 같다.

 

3  6  9

2  5  8

1  4  7

 

arr[0][0]이 [2][0]로 이동, [0][1]이 [1][0]로 이동한 것이다.

 

 

arr[0][0] = arr2[2][0], arr[0][1] = arr2[1][0]인 것이다.

 

 

따라서 이를 이중 for문을 이용해서 풀면 된다는 것을 예상해볼 수 있다.

 

 

for(int i=0; i<arr.length; i++)

    for (int j = 0; j < arr[i].length; j++)

          arr2[i][j]

 

다음과 같이 for문 생성 후 arr[0][0] = arr2[2][0] 인 것을 참고해 i값이 2, j값이 0일때 arr[0][0] 이 되어야 한다. 따라서 arr[j][2-i]가 되어야 한다.

 

맞는지 확인을 위해 arr[0][1] = arr2[1][0] 인 것을 참고해 i값이 1, j값이 0으로 하자. 그러면 arr[j][2-i]가 성립한다.

 

따라서 

for(int i=0; i<arr.length; i++)

    for (int j = 0; j < arr[i].length; j++)

          arr2[i][j] = arr[j][2-i];

 

출력결과는 다음과 같다.

[3, 6, 9]
[2, 5, 8]
[1, 4, 7]

 

 

 

 

 

 

 

 

2. 다음은 2차원 배열의 복제예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package java_practice;
 
import java.util.Arrays;
 
public class Array_2_Copy {
    public static void main(String[] args) {
        int[][] arr1 = {
                {1,2,3},
                {100,200,400,500,600},
                {40,60,70,80},
                {25,45,65,75,95}
        };
        int[][] arr2 = new int[arr1.length][];
        arr2[2= new int[] {7000,8000};
        arr2[3= new int[] {50};
        System.out.println("arr2 : " + Arrays.deepToString(arr2));
        
        System.arraycopy(arr1, 1, arr2, 02);
        
        System.out.println("arr1 : " + Arrays.deepToString(arr1));
        System.out.println("arr2 : " + Arrays.deepToString(arr2));
    }
}
cs

출력 결과는 다음과 같다.

arr2 : [null, null, [7000, 8000], [50]]
arr1 : [[1, 2, 3], [100, 200, 400, 500, 600], [40, 60, 70, 80], [25, 45, 65, 75, 95]]
arr2 : [[100, 200, 400, 500, 600], [40, 60, 70, 80], [7000, 8000], [50]]

 

 
일반적으로 2차원배열의 구조는 다음과 같다.

arraycopy() 의 경우 복제하고자 하는 배열a의 행전체를 따오게 된다.

따라서 arr1[1] 의 열 전체부터 arr1[2] 열 전체를 가져와 arr2[0] 과 arr2[1]에 각각 복사된 것이다.

 

 

 

 

 

 

3. 3x3배열에 1부터 10까지 랜덤하게 숫자를 뽑고 짝수가 몇개인지 출력하는 프로그램이다.

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
package java_practice;
 
import java.util.Arrays;
 
public class Array_2_Random_Even {
 
    public static void main(String[] args) {
        int[][] arr = new int[3][3];    // 수를 입력받을 2차원배열 선언
        int count = 0;        // 짝수갯수 입력받을 변수를 0으로
        
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                arr[i][j] = (int)(Math.random()*10)+1;    // random함수 이용해 1~10까지 정수 추출
            }
            System.out.println(Arrays.toString(arr[i]));    // 추출된 배열을 출력
        }
        
        // 조건문으로 짝수를 추출해냄
        System.out.print("짝수는 ");
        for (int k = 0; k < arr.length; k++) {
            for (int k2 = 0; k2 < arr.length; k2++) {
                if (arr[k][k2]%2==0) {
                    System.out.printf("arr[%d][%d]=%d ",k,k2,arr[k][k2]); // 짝수가 무엇인지 출력
                    count++;        // 짝수의 갯수 
                }
            }
        }
        System.out.printf("\n%d개 입니다.", count);
    }
}
cs
 
출력결과

[5, 3, 3]
[1, 9, 3]
[9, 4, 5]
짝수는 arr[2][1]=4 
1개 입니다.

 

 

먼저 수를 입력받을 2차원배열을 [3][3]로 선언하고 짝수의 갯수를 입력받을 변수를 선언과 동시에 0으로 초기화시켜준다.

 

그리고 이중 for문을 통해 배열의 i행과 j열의 모든 요소에 random값을 입력해준다.

random함수는 0.0이상 1.0미만의 실수를 추출하므로 여기에 10을 곱해주고 정수형으로 형변환시켜주면 0부터 9까지의 정수를 얻을 수 있다. 하지만 우리는 1부터 10까지의 수를 얻어야 하기 때문에 +1해주면 된다.

따라서 (int)(Math.random()*10)+1; 의 식이 나온다.

 

그리고 짝수를 추출해내야 하는데 일단 배열의 모든 값을 보기위해 이중for문으로 배열의 값을 빼내고 조건문 if를 통해 짝수조건(값%2==0)을 걸어준다.

그리고나서 조건에 해당되는 짝수들을 출력해 보여주고 갯수를 세기위한 count를 ++로 증가시켜준다.

 

따라서 count값은 짝수가 나온 갯수만큼 증가했기 때문에 출력해주면 짝수갯수만큼 출력된다.

 

 

 

 

 

 

4. 다음은 세 학생의 과목별 점수를 입력받고 합계와 평균을 구하는 프로그램이다.

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
36
37
38
39
40
41
42
package java_practice;
 
import java.util.Scanner;
 
public class Array_2_Score {
    
//    세 학생의 각 과목의 점수를 입력받은 후
//    각 학생마다 총합과 평균과 전체학생의 평균을 구하자.
//        국어 수학 과학    영어 합계    평균
//    학생1 
//    학생2
//    학생3
    
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
 
        int[][] score = new int[3][4];
        int perTot = 0, total = 0; // perTot은 학생개인의 점수합계,total은 모든학생의 점수합계

//scanner를 통해 점수입력.
        for (int i = 0; i < score.length; i++) {
            System.out.println("학생"+(i+1)+"의 점수를 입력해주세요.\n(국어,수학,과학,영어순)");
            for (int j = 0; j < score[i].length; j++) {
                score[i][j] = sc.nextInt();
            }
        }

// 출력
        System.out.println("\t국어\t수학\t과학\t영어");
        
        for (int i = 0; i < score.length; i++) {
            System.out.print("학생"+ (i+1+ "\t");
            for (int j = 0; j < score[i].length; j++) {
                System.out.print(score[i][j]+"\t");
                perTot += score[i][j];
                total += score[i][j];
            }
            System.out.printf("(합계 : %d\t평균 : %.2f)\n", perTot,(perTot/4.0));
            perTot = 0;
        }
        System.out.printf("전체학생 평균 : %.2f", total/12.0);
        sc.close();
    }
}
cs
 

 

배열자체는 4x3으로 만들어 졌으며 for문을 이용하여 해당 배열들의 과목의 점수를 입력받아 저장하고 출력하였다.

 

각 점수가 어느 학생에게 해당되는 것인지 확인을 위해 두번째 for문이 시작하기 전에 줄바꿈 없이 학생+(i+1)로 학생의 이름을 알려주었고 두번째 for문 안에서 학생(i+1)의 점수를 줄바꿈없이 출력 후 perTot값에 합계를 저장해주고 total값에도 합계를 저장해주었다. 두번째 for문을 빠져나와서 학생(i+1)의 합계와 평균을 줄바꿈 없이 내주고 줄바꿈 해주었다. 그리고 다음 학생의 점수 합계를 위해 perTot값을 0으로 재설정해주었다. 

 

전체학생의 평균을 정확히 내기 위해 total값을 소수점 둘째자리에서 반올림해주었다.

total값이 int형이기 때문에 실수를 곱해주어 자동형변환 시켜주고 format형식으로 출력(printf)할 때 소수점 둘째자리에서 반올림 하도록 설정해 주었다.

soonipy.tistory.com/18?category=1005894

 

[JAVA 기초] 자바의 특수문자와 printf 서식문자

자바에서 백슬러쉬와 따옴표는 출력되지 않는 특수문자이다. 또한 printf를 사용해야만 하는 서식 문자도 있는데 이의 종류는 다음과 같다.  1 문자(역슬래쉬) \\ : \ \' : 작은 따옴표 \" : 큰 따옴표

soonipy.tistory.com

 

 

반응형

댓글