기록공간

[TIL] 이노베이션 캠프 in 동북 Part 04. 배열 본문

카테고리 없음

[TIL] 이노베이션 캠프 in 동북 Part 04. 배열

mkm101 2023. 4. 27. 17:31
반응형
Part04. 배열
배열의 선언과 생성
배열의 길이와 초기화
배열 연습하기
배열의 출력
총합과 평균
최대과 최소값
랜덤으로 숫자섞기
String 배열
2차원 배열
Ch05.연습문제

Part 04. 배열

 

배열이란?

 -> 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 의미한다.

 

배열의 선언과 생성


배열의 선언방법

  • 타입[] 변수이름; (Ex: int[] age;, String[] name;)
  • 타입 변수 이름[]; (Ex int age[]; String name[];)

배열의 생성 : 실제 저장공간을 생성한다. 

  • 타입[] 변수이름 = new 타입[길이];

  • int[] age; : int 타입의 배열을 다루기 위한 참조 변수 age를 선언
  • age = new int[5];  int 타입의 값 5개를 저장할 수 있는 배열을 생성 (new 연산자)
  • 참조변수와 배열이 연결되어있고, 참조변수를 이용해 배열을 다룰 수 있다.

배열의 인덱스 : 각 요소(저장공간)에 자동으로 붙는 일련 번호

  • 인덱스(index)의 범위는 0부터 '배열길이 -1'까지 이다.

int[] age = new int[5];
age[3] = 28; ( 배열 age의 4번 째 요소에 28이 저장되는 모습 )
int beatitudoAge = age[3]; (배열 age의 4번 째 요소값을 읽어서 beatitudoAge에 변수를 저장하는 모습)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Arrays1_1 {
    public static void main(String[] args) {
//        int[] age; // 참조변수 베열 age 생성
//        age = new int[5]; // 배열의 생성
        int[] age = new int[5]; // 선언과 생성 동시에
        age[3= 28;
        System.out.println("age[3] = " + age[3]);
 
        int beatitudoAge = age[3];
        System.out.println("beatitudoAge = " + beatitudoAge);
 
        System.out.println("age 배열의 전체값 확인");
        System.out.println("age[0] = " + age[0]);
        System.out.println("age[1] = " + age[1]);
        System.out.println("age[2] = " + age[2]);
        System.out.println("age[3] = " + age[3]);
        System.out.println("age[4] = " + age[4]);
    }
}
cs

 

출력결과

배열의 길이와 초기화


배열의 길이

  • 배열이름.length;
  • int[] arr = new int[5]; : 배열의 길이가 5인 int 배열
  • int len = arr.length; : arr.length의 값은 5이고 len 변수에 저장된다.

배열은 한번 생성되면, 컴파일 이후 실행되는 동안 그 길이(크기)를 바꿀 수 없다.

 

배열의 한계점

배열의 크기를 바꿀 수 없는 이유?

  • new int[5];로 배열을 생성하면, int 가 4byte이기 때문에, 총 20byte를 저장하기 위한 연속적인 메모리 공간을 찾는다.
  • 연속적인 공간을 찾아, 주소를 배정한다.
  • 배정이 끝난 후 크기를 5가 아닌 10으로 늘려야 한다고 가정 했을때, 배정받은 주소 뒤에 20byte를 추가적으로 배정해야 하는데, 뒤에 연속적인 메모리 공간이 존재한다는 보장이 없다.
  • 따라서 크기를 바꿀 수 없다.

배열의 크기가 부족할 때의 방법

  • 필요한 만큼의 크기의 배열을 새롭게 만든다.
  • 새로 만든 배열에 기존 배열의 값을 복사해서 저장한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Arrays2_1 {
    public static void main(String[] args) {
        int[] arr = new int[10];
        System.out.println("배열의 길이 = " + arr.length);
 
        for (int i = 0; i < arr.length; i++) {
            System.out.println("arr[" + i + "] = " + arr[i]);
        }
        System.out.println();
        // index 범위를 벗어나는 경우 Error 발생
        for (int i = 0; i < arr.length + 1; i++) {
            System.out.println("arr[" + i + "] = " + arr[i]);
        }
    }
}
cs

 

출력결과

배열의 초기화 : 배열의 각 요소에 처음으로 값을 저장하는 것을 의미

  • 배열은 기본적으로 저장 하려는 값의 타입의 기본값으로 자동 초기화 해준다.

초기화 방법

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

2. int[] num = {1,2,3,4,5,6,7,8,9}; ( new int[] 생략 가능 )

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
class Arrays2_2 {
    public static void main(String[] args) {
        int[] num1 = new int[]{1,2,3,4,5,6,7,8,9};
        int[] num2 = {1,2,3,4,5,6,7,8,9};
 
        for (int i = 0; i < num1.length; i++) {
            System.out.println("num1[" ++ "] = " + num1[i]);
        }
        System.out.println();
        for (int i = 0; i < num2.length; i++) {
            System.out.println("num2[" ++ "] = " + num2[i]);
        }
 
        System.out.println();
        
        // 주의 할 점!
        int[] num3;
        // num3 = {1,2,3,4,5,6,7,8,9}; // Error 발생합니다.
 
        // 위처럼 나눠서 표현을 해야 한다면 아래처럼 초기화 하셔야 합니다.
        int[] num4;
        num4 = new int[]{1,2,3,4,5,6,7,8,9};
 
        for (int i = 0; i < num4.length; i++) {
            System.out.println("num4[" ++ "] = " + num4[i]);
        }
    }
}
cs

 

출력결과

배열 연습하기


배열의 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Arrays3_1 {
    public static void main(String[] args) {
        int[] arr = {100908070605040302010};
        //  배열을 가리키는 참조 변수 arr 을 출력
        System.out.println("arr = " + arr); 
        // 메모리 주소와 비슷한 문자열이 출력 -> 실제 주소는 아닙니다.
        // [I@7a81197d -> [(배열을 뜻함), I(int 타입을 뜻함), @(위치를 뜻함)
 
        // 예외 확인 하기 - char[]
        char[] chArr = {'a''b''c''d'};
        System.out.println(chArr); // abcd 가 출력되는데 이는 println 메서드의 기능 때문!
 
        // 배열의 요소 하나씩 출력하기
        for (int i = 0; i < arr.length; i++) {
            System.out.println("arr[" + i + "] = " + arr[i]);
        }
        
        // Arrays.toString(배열) : 배열의 모든 요소를 문자열로 만들어서 반환한다.
        System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));
    }
}
cs

 

총합과 평균

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Arrays3_2 {
    public static void main(String[] args) {
        int sum = 0// 총합을 저장
        float avg = 0f; // 평균을 저장
 
        int[] score = {1004033507729};
 
        for (int i = 0; i < score.length; i++) {
            System.out.println("score[" + i + "] = " + score[i]);
            sum += score[i];
        }
 
        avg = sum / (float) (score.length); // 계산결과를 float 타입으로 얻기 위해 형변환
 
        System.out.println("총합 = " + sum);
        System.out.println("평균 = " + avg);
    }
}
cs

최대값과 최소값

배열의 요소 중에서 가장 큰 값과 가장 작은 값을 찾기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Arrays3_3 {
    public static void main(String[] args) {
        int[] score = {65978843339128};
 
        int max = score[0]; // 최대값을 배열의 첫 번째 값으로 초기화 한다.
        int min = score[0]; // 최소값을 배열의 첫 번째 값으로 초기화 한다.
 
        for (int i = 0; i < score.length; i++) {
            if (score[i] > max) {
                max = score[i];
            } else if(score[i] < min) {
                min = score[i];
            }
        }
 
        System.out.println("최대값 = " + max);
        System.out.println("최소값 = " + min);
    }
}
cs

 

랜덤으로 숫자 섞기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Arrays3_4 {
    public static void main(String[] args) {
        int[] numArr = {0123456789};
        System.out.println("원본 = " + Arrays.toString(numArr));
 
        for (int i = 0; i < numArr.length; i++) {
            int num = (int) (Math.random() * 10); // 0 ~ 9 의 랜덤 수
 
            int tmp = numArr[0]; // 배열의 첫 번째 수로 계속 초기화 된다.
 
            // 랜덤한 위치의 값과 배열의 첫 번째 수가 서로 바뀐다.
            numArr[0= numArr[num];
            numArr[num] = tmp;
 
            System.out.println(i + 1 + " 번째 변경 : " + Arrays.toString(numArr));
        }
 
        System.out.println("결과 = " + Arrays.toString(numArr));
    }
}
cs

String 배열 

String 클래스 ( char[] 와 메서드(기능) 을 결합한 것 )

  • String str = "행복";
  • String str = new String("행복");
  • String 클래스는 내용을 변경할 수 없다.
  • String name = "choi";
  • String firstName = "wb";
  • name = name + firstName;

 

String 클래스의 주요 메서드

메서드 설명
char charAt(int index) 문자열에서 해당 위치 (index)에 있는 문자를 반환
int length()  문자열의 길이를 반환
String substring(int form,int to) 문자열에서 해당 범위(from~to)의 문자열을 반환한다. (to는 포함안됨)
char[] toCharArray() 문자열의 문자배열(char[])로 변환해서 반환한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Arrays4_1 {
    public static void main(String[] args) {
        String str = "ABCDEFG";
        char ch = str.charAt(3);
        System.out.println("ch = " + ch); // ch = D
 
        String str2 = str.substring(14);
        System.out.println("str2 = " + str2); // str2 = BCD
 
        String str3 = str.substring(1);
        System.out.println("str3 = " + str3); // str3 = BCDEFG
 
        String str4 = str.substring(1, str.length());
        System.out.println("str4 = " + str4); // str4 = BCDEFG
 
        char[] chArr = str.toCharArray();
        System.out.println("Arrays.toString(chArr) = " + Arrays.toString(chArr));
    }
}
cs

String 배열의 선언과 생성

String[] name = new Stirng[3];

  • 3개의 문자열을 담을 수 있는 배열을 생성한다
  • 참조형 이기 때문에 기본값 null로 초기화된다.
1
2
3
4
5
6
7
8
9
class Arrays4_2 {
    public static void main(String[] args) {
        String[] strArr = {"축구""야구""골프""테니스"};
        System.out.println("Arrays.toString(strArr) = " + Arrays.toString(strArr));
        
        String[] strArr2 = new String[4];
        System.out.println("Arrays.toString(strArr2) = " + Arrays.toString(strArr2));
    }
}
cs

 

 

2차원 배열


  • 테이블 형태의 데이터를 저장하기 위한 배열이다.

 

 

2차원 배열의 생성과 선언

  • int[][] score= new int[4][3];
  • 4행 3열의 2차원 배열 score가 생성된다.

 2차원 배열의 초기화

  • int[][] score = new int[][] {{},{},{},{}};
  • int[][] score = {{},{},{},{}}
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
class Arrays5_1 {
    public static void main(String[] args) {
        int[][] score = {
                {8835100},
                {846055},
                {1009972}, 
                {335477}
        };
        
        //길이 확인하기
        System.out.println("score.length = " + score.length);
        System.out.println("score[0].length = " + score[0].length);
        
        System.out.println();
        // 출력 예 1 : Arrays.toString()
        System.out.println("Arrays.toString()");
        System.out.println("Arrays.toString(score[0]) = " + Arrays.toString(score[0]));
        System.out.println("Arrays.toString(score[1]) = " + Arrays.toString(score[1]));
        System.out.println("Arrays.toString(score[2]) = " + Arrays.toString(score[2]));
        System.out.println("Arrays.toString(score[3]) = " + Arrays.toString(score[3]));
 
        System.out.println();
        // 출력 예 2 : for
        System.out.println("for");
        for (int i = 0; i < score.length; i++) {
            for (int j = 0; j < score[i].length; j++) {
                System.out.println("score[" + i + "][" + j + "] = " + score[i][j]);
            }
            System.out.println();
 
        }
 
        System.out.println();
        // 출력 예 3 : 향상된 for
        System.out.println("향상된 for");
        for (int[] ints : score) {
            for (int it : ints) {
                System.out.println("anInt = " + it);
            }
            System.out.println();
        }
    }
}
cs

 

Arrays

문자열 비교와 출력 ( equals(), toString() ) 

 

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
class Arrays6_1 {
    public static void main(String[] args) {
        int[] num = {012};
        int[][] score = {
                {8835100},
                {846055},
                {1009972},
                {335477}
        };
 
        System.out.println("Arrays.toString(num) = " + Arrays.toString(num));
        System.out.println("Arrays.deepToString(score) = " + Arrays.deepToString(score));
        System.out.println();
 
        String[][] strArr1 = {
                {"AAA","BBB","CCC"},
                {"aaa","bbb","ccc"},
        };
        String[][] strArr2 = {
                {"AAA","BBB","CCC"},
                {"aaa","bbb","ccc"},
        };
 
        // 1 차원 비교에는 equals
        System.out.println("Arrays.equals(strArr1[0], strArr2[0]) = " + Arrays.equals(strArr1[0], strArr2[0])); // true
        System.out.println("Arrays.equals(strArr1[1], strArr2[0]) = " + Arrays.equals(strArr1[1], strArr2[0])); // false
 
        System.out.println("Arrays.equals(strArr1, strArr2) = " + Arrays.equals(strArr1, strArr2)); // false
 
        System.out.println();
        // 다차원 비교에는 deepEquals
        System.out.println("Arrays.deepEquals(strArr1, strArr2) = " + Arrays.deepEquals(strArr1, strArr2)); // true
    }
}
cs

 

배열 복사

  • copyOf(),copyOfRange()

copyOf(배열명,index) : 배열명의 요소들을 0부터 index 까지 복사한다. (만약 배열의 길이보다 index가 더 크면, 배열의 길이 다음에는 초기화값이 들어간다);

copyOfRange(배열명,초기 index, 마지막 index ) : 배열의 초기 index부터 마지막 index까지의 값을 복사한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Arrays6_2 {
    public static void main(String[] args) {
        int[] arr = {0,1,2,3,4};
        System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));
        
        System.out.println();
        // copyOf
        int[] arr2 = Arrays.copyOf(arr, arr.length);
        System.out.println("Arrays.toString(arr2) = " + Arrays.toString(arr2));
        int[] arr3 = Arrays.copyOf(arr, 3);
        System.out.println("Arrays.toString(arr3) = " + Arrays.toString(arr3));
        int[] arr4 = Arrays.copyOf(arr, 7); // 범위가 넘어가는 복사는 초기화값이 들어간다.
        System.out.println("Arrays.toString(arr4) = " + Arrays.toString(arr4));
 
        System.out.println();
        // copyOfRange
        int[] arr5 = Arrays.copyOfRange(arr, 24);
        System.out.println("Arrays.toString(arr5) = " + Arrays.toString(arr5));
        int[] arr6 = Arrays.copyOfRange(arr, 07);// 범위가 넘어가는 복사는 초기화값이 들어간다.
        System.out.println("Arrays.toString(arr6) = " + Arrays.toString(arr6));
    }
}
cs

정렬

1
2
3
4
5
6
7
8
9
10
11
class Arrays6_3 {
    public static void main(String[] args) {
       int[] arr = {31859210764};
        System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));
        System.out.println();
 
        Arrays.sort(arr); // 오름차순으로 정렬됩니다.
        System.out.println("sort");
        System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));
    }
}
cs

 

연습문제 


5-1 다음은 배열을 선언하거나 초기화 한것이다. 잘못된 것을 고르고 그 이유를 설명하시오

1. int[] arr[];

2. int[] arr={1,2,3,};

3. int[] arr= new int[5];

4.int[] arr= new int[5] {1,2,3,4,5};

5. int arr[5];

6.int[] arr[] = new int[3][];

 

정답 : 5번, 배열을 선언할 때, 배열의 크기를 지정할 수 없다. 배열 선언 시에는  int [] arr = new int[5]; 형태로 작성되어야한다.

 

5-2 다음과 같은 배열이 있을 때, arr[3].length의 값은 ?

int[][] arr=  {     

                                  {5,5,5,5,5},

                                 {10,10,10},

                                   {20,20,20,20},

                                     {30,30 }

                }

 

답 : 2

 

5-3 배열 arr에 담긴 모든 값을 더하는 프로그램을 완성하시오.

1
2
3
4
5
6
7
8
9
10
11
class Variable1_4 {
    public static void main(String[] args) {
        int[] arr = {10,20,30,40,50};
        int sum =0;
        
        for(int i=0; i<arr.length;i++) {
            sum+= arr[i];
        }
        System.out.println("sum="+ sum);
  }
}
cs

 

5-4 2차원 배열 arr에 담긴 모든 값의 총합과 평균을 구하는 프로그램을 완성하시오

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
class Excercise5_4 {
    public static void main(String[] args) {
        int[][] arr = {
                { 5,5,5,5,5 },
                {10,10,10,10,10},
                {20,20,20,20,20},
                {30,30,30,30,30}
        };
        int total = 0;
        float average = 0;
        
        for(int i=0; i<arr.length; i++) {
            for(int j=0; j<arr[i].length; j++) {
                total += arr[i][j];
            }
        }
        
        average = (float) total / (arr.length*arr[0].length); 
        System.out.println("total="+ total);
        System.out.println("Average" + average);
        
        
        
  }
}
cs

 

5-5 다음은 1과 9사이의 중복되지 않은 숫자로 이루어진 3자리 숫자를 만들어내는 프로그램이다. (1) ~(2)에 알맞은 코드를 넣어서 프로그램을 완성하시오.

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
import java.util.Arrays;
 
class Exercise5_5 {
    public static void main(String[] args) {
        int[] ballArr = {1,2,3,4,5,6,7,8,9};
        int[] ball3 = new int[3];
        
        //배열 ballArr의 임의의 요소를 골라서 위치를 바꾼다.
        for (int i =0; i<ballArr.length; i++) {
            int j = (int)(Math.random() * ballArr.length);
            int tmp = 0;
            
            tmp = ballArr[i];
            ballArr[i] = ballArr[j];
            ballArr[j] = tmp;        
            
            }
        // 배열 ballArr의 앞에서 3개의 수를 배열 ball3로 복사한다.
        ball3 = Arrays.copyOf(ballArr,3);
        for(int i=0; i<ball3.length; i++) {
            System.out.print(ball3[i]);
        }
        
        
  }
}
 
cs

 

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
class Exercise5_6 {
        String[] words = { "television""computer",  "mouse""phone" };
        
        Scanner scanner = new Scanner(System.in);
        
        for(int i=0; i<words.length; i++) { // words 길이 만큼 반복 (4)
            char[] question = words[i].toCharArray(); // String을 char[]로 변환
            // question[] = {t,e,l,e,v,i,s,i,o,n,c,o,m,p,u,t,e,r,m,o,u,s,e,p,h,o,n,e}l
            for(int j=0; j<question.length; j++) {
                int index = (int)(Math.random()*question.length); //quenstion 길이중 무작위 인덱스 뽑기
                char tmp = question[i]; //
                question[i] = question[index];
                question[index] = tmp;
            }
            System.out.printf("Q%d. %s의 정답을 입력하세요.>", i+1new String(question));
            String answer = scanner.nextLine();
            
            //trim()으로 answer의 좌우 공백 제거 후, equals로 word[i]와 비교
            if(words[i].equals(answer.trim())) 
            {
                System.out.printf("맞았습니다.\n\n");
            }else {
                System.out.printf("틀렸습니다.\n\n");
            }
        }
  }
}
 
cs

위 코드 실행과정 

1. String 배열 words에 4개의 단어를 저장합니다.

2. Scanner를 이용하여 사용자로부터 입력을 받습니다.

3. words 배열의 길이만큼 반복문을 실행합니다.

4. words[i]를 char 배열로 변환하여 question 배열에 저장합니다.

5. question 배열의 문자를 무작위로 섞기 위해 반복문을 실행합니다. 이 때, Math.random() 메소드를 사용하여 무작위 인덱스를 생성하고, 두 문자를 swap합니다.

6. question 배열을 출력하여 사용자에게 보여줍니다.

7. 사용자로부터 입력을 받아 answer 변수에 저장합니다.

8. answer 문자열의 좌우 공백을 제거하고, words[i]와 비교하여 일치 여부를 판단합니다.

9. 맞았을 경우 "맞았습니다."을, 틀렸을 경우 "틀렸습니다."을 출력합니다.

10. 마지막으로, 반복문을 종료하고 프로그램을 종료합니다.

반응형