hyeonga_code

Java_30_배열_Array 다차원 배열 본문

Java

Java_30_배열_Array 다차원 배열

hyeonga 2023. 9. 26. 10:59
반응형


 - Array_배열
    - 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것입니다.
        - 데이터의 집합입니다.
    - 많은 양의 데이터를 다룰 경우 유용합니다.
    - 배열의 각 요소는 서로 연속적입니다.
    - 배열 생성
        '데이터 타입'[] '배열 이름' = new '데이터 타입'['배열 크기'];
        '데이터 타입' '배열 이름' [] = new '데이터 타입'['배열 크기'];
            - 배열의 크기를 선언해주지 않으면 사용할 수 없습니다.
            - 기본형 데이터 타입이므로 new를 통해 초기화하여 Heap에 저장합니다.
            - [] : 배열 첨자 연산자
    - 배열의 초기화
        - 생성된 배열에 처음으로 값을 저장합니다.
        - 초기화를 따로 하지 않는경우 0 으로 저장됩니다.
        - 배열은 초기값을 지정하지 않아도 초기값이 자동으로 지정되지만 반드시 초기화합니다.
        - 배열을 선언하는 것은 배열을 다루는 데에 필요한 변수를 생성하는 것입니다.
            - 값을 저장할 공간을 생성하는 것이 아닙니다.
        - 초기값: 정수형(0), 실수형(0.0), 논리형(false)
        '데이터 타입' '배열 이름'[] = new '데이터 타입'[] {'값 1', '값 2', '값 3', '값 4'};
            - 초기화를 같이 진행하는 경우, [] 안에 크기를 지정할 수 없습니다.
        '데이터 타입' '배열 이름'[] = { '값 1', '값 2', '값 3', '값 4' };
            - JVM_Java Virtual Machine 자동으로 new int[]를 실행합니다.
            - 배열의 크기를 따로 지정하지 않아도 값의 개수에 따라 설정됩니다.
    - 배열 활용
        - index를 활용합니다.
        '배열 이름'['원하는 index'] = '저장할 값';
            - 원하는 index에 값을 저장합니다.
        '데이터 타입' '변수 이름' = '배열 이름'['원하는 index']
            - 원하는 index의 값을 변수에 저장합니다.
    - 배열의 개수 확인 
        '배열 이름'.length
        - for 문을 작성할 경우 유연성에 도움이 됩니다.
    - index
        - 배열의 인덱스는 자동으로 부여됩니다.
        - 앞의 데이터를 수정할 때마다 그 뒤의 데이터 처리로 속도가 느려질 수 있습니다.


    - 1차원 배열
        - int[] x = new int[3];
            int[] x;
                = int x[];
            x = new int[3];

        - int[] x = {1, 2, 3};
            int[] x;
            int x[];
            x = new int[3];
            x[0] = 1;
            x[1] = 2;
            x[2] = 3;

    - 2차원 배열
        int[][] x = new int[2][3];
            int[][] x;
                = int[] x[];
                = int x[][];    
            x = new int[row][col];

        int[][] x = {{1, 2, 3}, {4, 5, 6}};
            x[0][0] = 1;
                [1] = 2;
                [2] = 3;
            x[1][0] = 4;
                [1] = 5;
                [2] = 6;

        - 가변 길이 배열입니다.
        int[][] x = new int[3][]    > 오류가 발생하지 않습니다.
            - x[] > null 값입니다.
            - 초기화를 완료해야 합니다.
        x[0] = new int[2];
        x[1] = new int[3];
        x[2] = new int[1];


=====

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package basic.array;
//모든 클래스는 패키지 안에 생성합니다.
 
public class ArrayEx {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    
    public static void main(String [] args) {
        // Java의 모든 코드는 함수 안에 작성합니다.
        
        int[] arr = {1020304050};
        int sum = 0;
        
        // for 문으로 작성
        for (int i=0, cnt=arr.length; i<cnt; i++) {
            // 배열의 데이터는 0부터 index를 가지게 되므로 총 길이보다 작게 범위를 설정합니다.
            /* 
                i<arr.length
                - for 문 내에 배열 길이의 수정이 없으므로 arr.length는 동일한 값입니다.
                - for 문이 반복되는 동안 연산을 진행하므로 overHead가 발생합니다.
            */ 
            sum += arr[i];
        }
        System.out.println("for_sum arr : " + sum);
        System.out.println("arr.length : " + arr.length);
            /*
                for_sum arr : 150
                arr.length : 5
             */
 
            /* 
                >> 원하는 값을 얻기 위해 부수적인 코딩이 많습니다.
                    - 데이터 중심적인 for 문을 사용합니다.
                    
                - 개선된 for 문
                    - 원하는 값을 얻기 위해 부수적인 코딩을 해야 하는 과정을 생략합니다.
                    - 배열에 사용합니다.
                    for( 변수 선언 : 배열 이름 ) {
                        반복 진행할 코드
                        - 배열 형식으로 작성하지 않고 변수로 활용이 가능합니다.
                    }
            */
        // 개선된 for 문
        sum = 0;
        forint a : arr) {
            // System.out.println(a);
            sum += a;
        }
        System.out.println("enhanced for_sum arr : " + sum);
            /*
                enhanced for_sum arr : 150
            */
 
        // while 문으로 작성
        int i=0;
        sum = 0;
        while (i<arr.length) {
            sum += arr[i];
            i++;
        }
        System.out.println("while_sum arr : " + sum);
            /*
                while_sum arr : 150
             */
    }
}



 - 성적의 합과 평균(소수점)을 출력
=====

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
package basic.array;
//모든 클래스는 패키지 안에 생성합니다.
 
public class ArrayEx2 {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    
    public static void main(String[] args) {
        // Java의 모든 코드는 함수 안에 작성합니다.
 
        int[] scores = {1008810010090};
        int sum = 0;
        double avg;
        
        for ( int score : scores) {
            sum += score;
        }
        
        avg = sum/(double)scores.length;
        
        System.out.println("Sum : " + sum);
        System.out.println("Avg : " + avg);
            /*
                Sum : 478
                Avg : 95.6
             */
    }
}



 - 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
package basic.array;
// 모든 클래스는 패키지 안에 생성합니다.
 
public class ArrayEx {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    
    public static void main(String[] args) {
        // Java의 모든 코드는 함수 안에 작성합니다.
 
        Scanner in = new Scanner(System.in);
        
        int hap[] = new int[5];
        // 크기가 5 인 hap 배열 생성
        int sum = 0;
        for(int i = 0; i < hap.length++i) {
            // 배열 hap의 길이
            System.out.printf("Input %dst number: ",i+1);
            hap[i] = in.nextInt();
            sum += hap[i];
        }
        for(int i = 0; i<4++i) {
            System.out.printf("%d + ", hap[i]);
            // + 가 4개만 출력되어야 하므로
        }
        System.out.printf("%d = %d", hap[4], sum);        
    }
}



 - 총 인원 수를 입력받고 이름과 전화번호를 입력받은 뒤 전부 출력
=====

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
package basic.array;
// 모든 클래스는 패키지 안에 생성합니다.
 
public class ArrayEx {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    
    public static void main(String[] args) {
        // Java의 모든 코드는 함수 안에 작성합니다.
 
        Scanner in = new Scanner(System.in);
 
        System.out.println("Total People: ");
        int to = in.nextInt();
 
        String[] name = new String[to];
        String[] tel = new String[to];
 
        for (int i = 0; i < to; ++i) {
            System.out.println("Input name: ");
            name[i] = in.next();
            System.out.println("Input PH number: ");
            tel[i] = in.next();
        }
 
        for (int i = 0; i < to; ++i) {
            System.out.printf("%s's tel number: %s \n", name[i], tel[i]);
        }    
    }
}




    - 다차원 배열
        - 가변 배열
            - 마지막 차수의 크기를 지정하지 않고 각각 다르게 지정합니다.
        - 선언
            '데이터 타입'[][] '배열 이름' = {
                {값1-1, 값1-2, 값1-3},
                {값2-1, 값2-2, 값2-3},
                ...
            };
=====

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package basic.array;
//모든 클래스는 패키지 안에 생성합니다.
 
public class ArrayEx3 {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    
    public static void main(String[] args) {
        // Java의 모든 코드는 함수 안에 작성합니다.
        
        // 2차원 배열
        int[][] scores = {
                { 100100100 },
                { 202020 },
                { 303030 },
                { 404040 },
                { 505050 }
            };
        
        /*
        int korTotal = 0;
        int engTotal = 0;
        int mathTotal = 0;
        
        System.out.println("no kor eng math total average");
        System.out.println("==============================");
        
        for( int i=0, cnt=scores.length; i<cnt; i++){
            int sum = 0;        // 개인별 총점
            float avg = 0.0f;    // 개인별 평균
            
            // 번호 출력
            System.out.print(i+1);
            
            for( int score: scores[i]) {    // 열
                sum += score;    // 과목별 총점입니다.
                
                // 점수 출력
                System.out.print(" " + score + " ");
            }
            avg = sum/(float)scores[i].length;
            
            // 총점, 평균 출력
            System.out.println(" " + sum + " " + avg);
        }
        
        */
        
        int subTotal[] = new int[3];
        float subAvg[] = new float[3];
        String sub_name[] = {"Kor""Eng""Math"};
        
        int stTotal[] = new int[5];
        float stAvg[] = new float[5];
        
        // 학생별 총점/평균
        for(int i=0, cnt=scores.length; i<cnt; i++) {    // 학생별
            for(int score : scores[i]) {    // 학생별 성적
                stTotal[i] += score;        // 학생별 총점
            }
            stAvg[i] = stTotal[i] / (float)scores[i].length// 학생별 평균
        }
        
        // 과목별 총점
        for(int st=0, cnt=scores.length; st<cnt; st++) {    // 학생별
            for(int sub=0, cnt2=subTotal.length; sub<cnt2; sub++) {    // 과목별
                    subTotal[sub] += scores[st][sub];    
                }
        }
        
        // 과목별 평균
        for(int sub=0, cnt2=subTotal.length; sub<cnt2; sub++) {
            subAvg[sub] = subTotal[sub] / (float)scores.length;    
        }
 
        
        // 출력
        System.out.println("Name\tKor\tEng\tMath\tTotal\tAverage");
        System.out.println("=======================================");
        for(int st=0, cnt=scores.length; st<cnt; st++) {
            System.out.print("st" + (st+1));
            for(int sub=0, cnt2=scores[st].length; sub<cnt2; sub++) {
                System.out.print("\t"+scores[st][sub]);
            }
            System.out.println("\t" + stTotal[st] + "\t" 
                                        + String.format("%.2f",stAvg[st]));
        }
        System.out.println();
        
        System.out.println(" Sub\tTotal\tAvgerage");
        System.out.println("=========================");
        for(int sub=0, cnt=subTotal.length; sub<cnt; sub++) {
            System.out.println(" " + sub_name[sub] + "\t" + subTotal[sub] 
                                        + "\t" + String.format("%.2f",subAvg[sub]));
        }
            /*
                Name    Kor        Eng        Math    Total    Average
                ================================================
                st1        100        100        100        300        100.00
                st2         20         20         20         60         20.00
                st3         30         30         30         90         30.00
                st4         40         40         40        120         40.00
                st5         50         50         50        150         50.00
                
                 Sub    Total    Avgerage
                =========================
                 Kor    240        48.00
                 Eng    240        48.00
                 Math    240        48.00
             */
    }
}


    >>> 데이터만 있을 경우, 데이터의 정보를 알 수 없는 경우가 있습니다.
        - 이름을 같이 저장하면 좋겠으나 이름은 정수형이 아니므로 배열에 추가할 수 없습니다.
        1) ID 번호를 사용하여 데이터를 구분할 수 있습니다.
        2) 구조체를 사용하여 여러 데이터 타입의 데이터를 저장할 수 있습니다.

반응형