PART 04 배열

조재형·2023년 5월 5일
0

스터디

목록 보기
4/19

배열

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

배열의 선언과 생성

배열의 선언

  • 배열을 다루기 위한 참조변수의 선언

선언 방법

  • 타입[] 변수이름;
    • int[] age;
    • String[] name;
  • 타입 변수이름[];
    • int age[];
    • String name[];

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

  • 타입[] 변수이름 = new 타입[길이];
  • int[] age; : int 타입의 배열을 다루기 위한 참조변수 age 선언
  • age = new int[5]; : int 타입의 값 5개를 저장할 수 있는 배열을 생성(new)
  • 배열의 시작 주소(메모리 주소)가 참조변수 age 에 저장됨
    age는 저장된 주소를 통해 해당 배열을 가리키고 있음
    즉, 참조변수와 배열이 연결되었고 우리는 참조변수를 이용해 배열을 다룰 수 있다

배열의 인덱스

각 요소(저장공간)에 자동으로 붙는 일련 번호

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

  • int[] age = new int[5];

  • age[3] = 20;
  • 배열 age 의 4번째 요소에 28을 저장

  • int beatitudoAge = age[3];
  • 배열 age의 4번째 요소의 값을 읽어서 beatitudoAge 변수에 저장

.
.
.

  • 예제코드
    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]);
        }
    }

결과

배열의 길이와 초기화

배열의 길이

배열이름.length

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

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

배열의 한계점

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

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

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

  • 필요한 만큼의 크기의 배열을 새롭게 만든다
  • 새로 만든 배열에 기존 배열의 값을 복사해서 저장한다
  • 예제코드
    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]);
            }
        }
    }

결과
(//index 범위를 벗어나지 않는 경우 구문의 위쪽
위의 for 구문 사용)

결과
(index 범위를 벗어난 오류가 난 구문
아랫쪽 for 구문)

배열의 초기화

배열의 각 요소에 처음으로 값을 저장하는 것을 의미한다

자동 초기화

자료형(변수 타입기본값
byte0
short0
int0
long0L
float0.0f
double0.0d
char'\n0000'
boolenfalse
참조형 변수(String or any Object)null
  • 배열은 기본적으로 저장 하려는 값의 타입의 기본값으로 자동 초기화 해 줍니다

초기화 방법

  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[] 를 생략할 수 있다
  • 예제코드
    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[" +i + "] = " + num1[i]);
            }
            System.out.println();
            for (int i = 0; i < num2.length; i++) {
                System.out.println("num2[" +i + "] = " + 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[" +i + "] = " + num4[i]);
            }
        }
    }

배열 연습하기

배열의 출력

  • 예제코드
    class Arrays3_1 {
        public static void main(String[] args) {
            int[] arr = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};
            //  배열을 가리키는 참조 변수 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));
        }
    }

결과

총합과 평균

배열의 모든 요소를 더해서 총합과 평균 구하기

  • 예제코드
    class Arrays3_2 {
        public static void main(String[] args) {
            int sum = 0; // 총합을 저장
            float avg = 0f; // 평균을 저장
    //
            int[] score = {100, 40, 33, 50, 77, 29};
    //
            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);
        }
    }

결과

최대값과 최소값

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

  • 예제코드
    class Arrays3_3 {
        public static void main(String[] args) {
            int[] score = {65, 97, 88, 43, 33, 91, 28};
    //
            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);
        }
    }

랜덤으로 숫자 섞기

  • 예제코드
    class Arrays3_4 {
        public static void main(String[] args) {
            int[] numArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
            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));
        }
    }

결과

String 배열

String 클래스

char[] 와 메서드(기능)를 결합한 것이다

  • 기본형 처럼 사용이 가능한 참조형
    • String str = "행복";
    • String str = new String("행복");
  • 문자열을 많이 사용하기 때문에 특별하게 만들어진 클래스
  • String 클래스는 내용을 변경할 수 없다. 새로운게 만들어진다.
  • String Name = "choi";
    String firstName = "wb";
    name = name + firstName;

String 클래스의 주요 메서드

메서드설명
char charAt(index)문자열에서 해당 위치(index)에 있는 문자를 반환한다
int length()문자열의 길이를 반환한다
String substing(int from, int to)문자열에서 해당 범위(from~to)의 문자열을 반환한다.(to는 포함 안됨)
boolean equals(Object obj)문자열의 내용이 같은지 확인한다. 같으면 true, 다르면 false
char[] toCharArray()문자열을 문자배열(char[])로 변환해서 반환한다.
  • 예제코드
    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(1, 4);
            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));
        }
    }

결과

String 배열의 선언과 생성

String[] name = new String[3];

  • 3개의 문자열을 담을 수 있는 배열을 생성한다
  • 참조형이기 때문에 기본값 null 로 초기화된다
  • 예제코드
    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));
        }
    }

결과

2차원 배열

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

국어영어수학
8835100
846055
1009972
335477

2차원 배열의 선언과 생성

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

  • 4행 3열의 2차원 배열 score 가 생성된다
[0][0][0][1][0][2]
[1][0][1][1][1][2]
[2][0][2][1][2][2]
[3][0][3][1][3][2]
  • score[0][0] = 88;
    • 배열 score 의 1행 1열에 88을 저장한다

2차원 배열의 초기화

int[][] score = new int[][]{{}, {}, {], {}};

int[][] score = {{}, {}, {}, {}};

  • 예제코드
class Arrays5_1 {
    public static void main(String[] args) {
        int[][] score = {
                {88, 35, 100},
                {84, 60, 55},
                {100, 99, 72}, 
                {33, 54, 77}
        };
        
        //길이 확인하기
        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();
        }
    }
}
  • 결과

Arrays

문자열 비교와 출력

equals(), toString()

  • 예제코드
class Arrays6_1 {
    public static void main(String[] args) {
        int[] num = {0, 1, 2};
        int[][] score = {
                {88, 35, 100},
                {84, 60, 55},
                {100, 99, 72},
                {33, 54, 77}
        };

        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
    }
}

결과

배열 복사

copyOf(), copyOfRange()

  • 예제코드
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, 2, 4);
        System.out.println("Arrays.toString(arr5) = " + Arrays.toString(arr5));
        int[] arr6 = Arrays.copyOfRange(arr, 0, 7);// 범위가 넘어가는 복사는 초기화값이 들어간다.
        System.out.println("Arrays.toString(arr6) = " + Arrays.toString(arr6));
    }
}

결과

정렬

sort()

  • 예제코드
class Arrays6_3 {
    public static void main(String[] args) {
       int[] arr = {3, 1, 8, 5, 9, 2, 10, 7, 6, 4};
        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));
    }
}

결과

profile
안녕하세요.

0개의 댓글