열심히 끝까지

Java1 day04 본문

Java1(주말)

Java1 day04

노유림 2022. 4. 17. 15:49

[4일차 수업 내용]

배열(Array)

* <= 더 많이 쓰인다 의 축약특수문자

============================================================================

1. 배열(Array)

         1-1 ) 배열이란?

                 - 같은  타입의 여러 변수를 하나의 묶음으로 다루는 것

                 - 여기서 중요한 것은 같은 타입이여야 한다는 것

                 - 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없음.

                         ex ) int [ ] score = new int[5];         // 5개의 int 값을 저장할 수 있는 배열 생성

 

         1-2 ) 배열의 생성

                 - 배열을 선언하는 방법은 타입의 변수를 선언하고 변수 또는 타입의 배열임을 의미하는

                   대괄호[   ]를 붙임

선언 방법 선언 예
*타입[ ] 변수이름; int[ ] score;     String[ ] names;
타입 변수이름[ ]; int score[ ];     String names[ ];

                 * 배열의 생성

                 - 배열을 선언한 다음에는 배열을 생성

                 - 배열을 선언한 것은 단지 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐

                   배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어 짐

 

                         타입[ ] 배열이름;                                 // 배열을 선언(배열을 다루기 위한 참조변수 선언)

                         배열이름 = new 타입[길이];                   // 배열을 생성(실제 저장공간을 생성)

 

         1-3 ) 배열의 길이와 인덱스

                  - 생성된 배열의 각 저장공간을 배열의 요소(element)라고 하며, 배열이름(인덱스)의 형식으로

                    요소에 접근

                 - 인덱스(index)는 배열의 요소마다 붙여진 일련번호, 각 요소를 구별하는데 사용

                         *인덱스의 범위는 0부터 배열의 길이 -1

                                 int[ ] score = new int[8];                 // 길이 : 8, 마지막 index : 7

                 - 배열의 값을 저장하고 읽어오는 방법은 변수와 같음.

                 - 단, 변수이름 대신 배열이름[인덱스]를 사용한다는 점만 다름 

 

                 * 배열의 길이

                 - 배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수

                 - 배열의 길이는 양의 정수

 

         1-4 ) 배열의 초기화

                 - 배열은 생성과 동시에 자동적으로 자신의 타입에 해당되는 기본값으로 초기화하므로

                   배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만 원하는 값을 따로 지정할 수 있음

                         int[ ] score = new int[8];

                         score[0] = 5;

                         score[4] = 12;

                         score[7] = 6;

 

                         int[ ] score = new int[ ]{50, 60, 70, 80, 90};         // 길이 : 5, 마지막 인덱스 : 4

                         int[ ] score = {50, 60, 70, 80, 90};

                 - 저장할 값들을 괄호{ }안에 쉼표로 구분해서 나열하면 되고, 

                   괄호 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 배열의 길이는 쓰지 않아도 괜찮음

 

                         int[ ] score;

                         score = new int[ ]{5, 6, 7, 8, 9};                         // 가능한 방법

                         score = {5, 6, 7, 8, 9};                     // 에러, 선언과 초기화를 따로 하는 경우, new int[ ] 생략 불가

 

         1-5 ) 배열의 출력

                 int[ ] arr = {100, 95, 80, 70, 60};

         

                 for( int i = 0; i < arr.length; i++ ) {         // arr.length : 배열의 길이를 반환

                         System.out.println( arr[ i ] );         // i : 0, 1, 2, 3, 4

                 }

                 // 어제 배운 반복문 중 심화, day03에 자세한 설명 있으니 기억 안나면 다시 볼 것

                 for( int ele : arr){

                         System.out.println(ele);         // 100, 95, 80, 70, 60

                 }

 

         1-6 ) 배열의 복사

                 ① for문을 이용한 복사

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

                         int[ ] tmp = new int[ arr.length * 2 ];  // 복사할 때, 복사할 배열의 2배가 되어야 에러가 안난다고 함

 

                         for(int i = 0; i < arr.length; i++) {         // tmp.length(10)를 넣으면 단위가 달라서 에러

                                 tmp[ i ] = arr[ i ];

                         }

 

                 ② System.arraycopy()를 이용한 배열의 복사

                         - for문 대신 System 클래스의 arraycopy( )를 사용하면 보다 간단하고 빠르게 복사 가능

 

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

                         int[ ] result = new int[ arr.length * 2 ];

 

                         System.arraycopy( 복사할 배열, 복사 시작할 인덱스, 복사받을 배열, 복사 받을 인덱스, 복사 길이);

                         ㄴSystem.arraycopy( arr, 0, result, 0, arr.lengh);

                         ==> arr 배열의 0번 인덱스 값부터 result 배열에 복사

                         ==> 복사를 할 때는 result 배열의 0번 인덱스부터 채워 넣음

                         ==> 이 때 arr 배열의 길이만큼(개수만큼) 복사

 

                                 Arrays.toString(arr);                 // [1, 2, 3, 4, 5]

                                 Arrays.toString(result);              // [1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

 

2. 다차원 배열

         - 지금까지 우리가 배운 배열은 1차원 배열인데, 2차원 이상의 배열도 선언해서 사용 가능

                 

         2-1 ) 2차원 배열 선언과 인덱스

선언 방법 선언 예
*타입[ ][ ] 변수이름; int[ ][ ] score;
타입 변수이름[ ][ ]; int score[ ][ ];
타입[ ] 변수이름[ ]; int[ ] score[ ];

                  - 2차원 배열은 행과 열로 구성되어 있기 때문에 index가 행과 열에 각각 하나씩 존재

                  - 행 index의 범위 :  0 ~ 행의 길이-1 / 열 index의 범위 :  0 ~ 열의 길이 -1

                  - 각 요소에 접근하는 방법은 배열이름[행인덱스][열인덱스]

 

         2-2 ) 2차원 배열의 초기화

                 - 2차원 배열도 괄호를 사용, 생성과 초기화를 동시에 가능

                 - 다만, 1차원 배열보다 괄호{ }를 한번 더 써서 행렬로 구분

 

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

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

 

 

 

 

배열 예시

package example 01; // 이 뒤로 나오는 package 생략

 

import java.util.Arrays;  // Arrays + ctrl + space

public class ArrayEx01 {

         public static void main(String[] args) {

                  int[ ] score = new int[5];         // 길이 : 5, 마지막 인덱스 : 4

                  int k = 1;

 

                  score[0] = 50;                 

                  score[1] = 60;

                  score[k+1] = 70;

                  score[2] = 80;                           // 70 -> 80으로 변환

                  score[3] = 90;

 

                  System.out.println("score : " + Arrays.toString(score));

                  System.out,println();

 

                  int imp = score[k+2] + score[4];         // 90

                  System.out.println("tmp : " + tmp);

                  System.out.println();

 

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

                           System.out.println("각 요소의 값 : " + score[i]);

                  }

                  System.out.println();

 

                  for(int ele : score) {

                           System.out.println("각 요소의 값 : " + ele);

                  }

                  System.out.println();

                  // ArrayIndexOutOfBoundsException ==> Index Control (중요!!!!!)

                  // 혼자서 공부하다보면 자주 마주할 에러 기억해 둘 것

         }

}

 

-----------------------------------------------

import java.util.Arrays;

public class ArrayEx02 {
         public static void main(String[] args) {

                  int[ ] arr1 = new int[10];

                  int[ ] arr2 = new int[10];

                  int[ ] arr3 = {100, 95, 80, 70, 60}; // int[ ] arr3 = new int[ ]{100, 95, 80, 70, 60};

                  char[ ] chArr = {'a', 'b', 'c', 'd', '0'};

 

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

                          arr1[ i ] = i + 1;

                  }

                  for(int i = 0; i < arr1.lengthl i++) {

                           System.out.print(arr1[ i ] + " ");  // 1 2 3 4 5 6 7 8 9 10

                  }

                  System.out.println();

 

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

                          arr2[ i ] = (int)(Math.random() * 10) + 1;

                  }

                  for(int ele : arr2 ) {

                           System.out.print(ele + " ");

                  }

                  System.out.println();

                  System.out.println(Arrays.toString(ccArr));                  
         }
}

 

-------------------------------------------------

import java.util.Arrays;

public class ArrayEx03 {
         public static void main(String[] args) {
                  // for문을 이용한 복사

                  int[ ] arr = new int[5];

                  int[ ] tmp = new int[arr.length * 2];

 

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

                           arr[ i ] = (int)(Math.random() * 100) + 1;

                  }

                  System.out.println("arr : " + Arrays.toString(arr));

 

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

                           tmp[ i ] = arr[ i ]; 

                  }

                  System.out.println("tmp : " + Arrays.toString(tmp));
         }
}

 

-----------------------------------------------------

import java.util.Arrays;
public class ArrayEx04 {
         public static void main(String[] args) {
                  // System.arraycopy()를 이용한 복사

 

                  char[ ] abc = {'a', 'b', 'c', 'd'};

                  char[ ] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

                  char[ ] result = new char[abc.length + num.length);

 

                  System.arraycopy(abc, 0, result, 0, abc.length);

                  System.out.println("[abc배열을 result에 복사한 후]");

                  System.out.println("result : " + Arrays.toString(result));

                  

                  System.arraycopy(num, 0, result, abc.length, num.length);

                  System.out.println("[num배열을 result에 복사한 후]");

                  System.out.println("result : " + Arrays.toString(result));

         }
}

 

-----------------------------------------------------

public class ArrayEx05 {
         public static void main(String[] args) {
                  // 총합과 평균 구하기

                  int[ ] score = {100, 88, 97, 65, 42};

                  int sum = 0;

                  double average = 0.0;

                  // 총점 : 392, 평균 : 78.4

                  

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

                           sum += score[ i ];
                  } 

                  average = sum / (double)score.length;

                  System.out.println("총점 : " + sum + ", 평균 : " + average);

         }
}

 

-----------------------------------------------------

public class ArrayEx06 {
         public static void main(String[] args) {
                  // 최댓값과 최솟값 찾기
                  int[ ] score = {79, 88, 91, 33, 100, 55, 95};
                  int max = 0;
                  int min = 0;

                  max = score[0]; // 최댓값이라고 가정
                  min = score[0]; // 최솟값이라고 가정

                  for(int i = 1; i < score.length; i++) {
                           if(max < score[ i ]) {
                                    max = score[ i ];
                           }
                           if(min > score[ i ]) {
                                    min = score[ i ];
                           }
                  }
                  System.out.println("최대값 : "+ max);  //100
                  System.out.println("최솟값 : "+ min);  // 33

                  /*
                   *  i == 1일 때
                   *  max == 79, min == 79, score[1] == 88
                   *  score[1] > max ==> 88 > 79 ==> max = score[1]; ==> max = 88
                   *  score[1] < min ==> 88 < 79 ==> false
                   * 
                   *  i == 2일 때
                   *  max == 88, min == 79, score[2] == 91
                   *  최종적으로 max == 91, min == 79
                   * 
                   *  i == 3일 때
                   *  max == 91, min == 79, score[3] == 33
                   *  score[3] > max ==> 33 > 91 ==> false
                   *  score[3] < min ==> 33 < 79 ==> min = score[3]; ==> min = 33
                   */
          }
}

 

---------------------------------------------------------------

import java.util.Arrays;
public class ArrayEx07 {
         public static void main(String[] args) {
                  // 배열 요소 섞기(shuffle)

                  int[ ] numArr = new int[10];

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

                           numArr[ i ] = i;

                  }

                  System.out.println("[섞기 전]");

                  System.out.println("Arrays.toString(numArr));

                  System.out.println();

 

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

                           int n = (int)(Math.random() * 10);         // 난수의 범위 : 0 ~ 9

                         //System.out.println("n : " + n);         // for 최댓값을 작게 설정해 직접 보는 것도 중요  

                           int tmp = numArr[0];

                           numArr[0] = numArr[n];

                           numArr[n] = tmp;

                  }

                  System.out.println("[섞은 후]");

                  System.out.println(Arrays.toString(numArr));
         }
}

 

----------------------------------------------------------

import java.util.Arrays;
public class ArrayEx08 {
         public static void main(String[] args) {
                  // 빈도수 구하기
                  int[ ] numArr = new int[10];
                  int[ ] counter = new int[10];

                  for(int i = 0; i < numArr.length; i++) {
                           numArr[i] = (int)(Math.random() * numArr.length); // 범위 0 ~ 9
                  }
                  System.out.println("배열 : " + Arrays.toString(numArr));
                  System.out.println();

                  for(int i = 0; i < numArr.length; i++) {
                           counter[numArr[i]]++;
                  }         

                  /* 매번 바뀜
                   *  i == 0
                   *   counter[numArr[0]]++ ==> counter[1]++;
                   *  
                   *   i == 1
                   *   counter[numArr[1]]++ ==> counter[4]++;
                   *  
                   *   i == 5 
                   *   counter[numArr[5]]++ ==> counter[9]++;
                   *  
                   *   i == 6
                   *    counter[numArr[6]]++ ==> counter[9]++;
                   */

                  for(int i = 0; i < counter.length; i++) {
                           System.out.println( i + "의 개수 : " + counter[i]);
                  }
          }
}

 

----------------------------------------------------------------

import java.util.Arrays;
public class ArrayEx09 {
         public static void main(String[] args) {
                  int[][] arr = new int[][] { {1, 2, 3}, {4, 5, 6}};
                  System.out.println(arr);
                  System.out.println(arr.length); // 2
                  System.out.println(arr[0].length);  // 3

                  System.out.println(Arrays.deepToString(arr));

                  for(int i = 0; i < arr.length; i++) {
                           for(int j = 0; j < arr[i].length; j++) {
                                    System.out.println(arr[i][j]);
                           }
                  }
        }
}

 

 

'Java1(주말)' 카테고리의 다른 글

Java1 day05  (0) 2022.04.23
Java1 day04 보충  (0) 2022.04.23
Java1 day03 보충  (0) 2022.04.17
Java1 day03  (0) 2022.04.16
Java1 day02 보충 2  (0) 2022.04.16