Programming Language/Java

[Java] 05. 배열

lumana 2024. 3. 12. 22:17

배열


배열 생성 방법

타입[] 변수이름 = new 타입[길이]
  • 길이가 0인 배열을 생성할 수 있다

  • JVM이 모든 배열의 길이를 별도로 관리하고, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.

  • 배열은 한 번 생성하면 길이를 변경할 수 없다.

  • 공간이 부족해 배열의 길이를 변경해야 하는 경우 더 큰 길이의 새로운 배열을 생성한 다음 기존 배열의 값을 새로운 배열에 복사한다

  • 유효한 인덱스 범위를 넘어서면 ArrayIndexOutOfBoundsException이라는 예외가 발생한다

  • 코드를 변경해 배열의 길이가 바뀔 때, '배열이름.length'는 for문에서 알아서 값을 update 해준다.

배열의 초기화

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

  • 선언과 생성을 동시에 하는 경우 new int[]를 생략할 수 있음

int[] score = new int[]{50, 60, 70, 80, 90};
int[] score = {50, 60, 70, 80, 90}; // new int[]를 생략할 수 있음
  • 선언과 생성을 따로 하는 경우 new int[]를 생략할 수 없음
int[] score;
score = new int[]{50, 60, 70, 80, 90}; 
// 아래 코드는 에러 발생
score = {50, 60, 70, 80, 90};// new int[]를 생략할 수 없음
  • 다음 코드는 모드 길이가 0인 배열을 생성함
int[] score = new int[0]; 
int[] score = new int[]{}; 
int[] score = {}; // new int[]가 생략됨
  • 배열의 요소를 출력하는 두 가지 방법

    • 반복문
int[] iArr = {100, 95, 80, 65, 60};

for (int i = 0; i < iArr.length; i++) {
    System.out.print(iArr[i] + ", ");
}

System.out.println();
  • Arrays.toString(배열이름) 메서드 사용
int[] iArr = {100, 95, 80, 65, 60};
// [100, 95, 80, 65, 60] 이 출력된다
System.out.println(Arrays.toString(iArr));
  • iArr(참조변수)을 출력하면 타입@주소 형태로 출력된다

    • 예외적으로 char 배열은 println 메서드로 출력하면 각 요소가 구분자없이 그대로 출력된다
char[] chArr = { 'a', 'b', 'c', 'd'};
System.out.println(chArr); // abcd가 출력된다.

배열의 복사

  • C와 동일

  • System.arraycopy()를 사용하면 지정된 범위의 값들을 한 번에 통째로 복사하기 때문에, for문을 통해 복사하는 것 보다 효율적이다

System.arraycopy(num, 0, newNum, num.length);
// num[0] 에서 newNum으로 num.length 개의 데이터를 복사

String 클래스 배열과 char 배열

  • String 클래스만 다음과 같이 큰 따옴표만으로 간략이 표현하는 것이 허용됨
String[] name = new String[3];
name[0] = new String("Kim");
name[0] = "Kim";
name[1] = new String("Park");
name[1] = "Park";
name[2] = new String("Yi");
name[2] = "Yi";
  • String 클래스는 char 배열에 기능을 추가한 것이다.

  • String 클래스의 주요 메서드

    • char charAt(int index) // 문자열에서 해당 index에 있는 문자를 반환한다

    • int length() // 문자열의 길이를 반환한다.

    • String substring(int from, int to) // 문자열에서 해당 범위에 있는 문자열을 반환한다(to는 범위에 포함되지 않음)

      • (1,4)면 4는 범위에 포함되지 않는다
    • boolean equals(String str) // 문자열의 내용이 같은지 확인한다

    • char[] toCharArray() // 문자열을 문자배열(char[])로 변환해서 반환한다

다차원 배열

2차원 배열

// 타입[][] 변수이름;
int[][] score = new int[4][3]; // 4행 3열

// 타입 변수이름[][];
int score[][];

// 타입[] 변수이름[];
int[] score[];

2차원 배열의 초기화

int[][] arr = new int[][] { {1, 2, 3}, {4, 5, 6} };
int[][] arr = { {1, 2, 3}, {4, 5, 6} }; // new int[][]가 생략됨

// 가독성을 위해 다음과 같이 줄 바꿈을 해주는 것도 좋다
int[][] arr = { 
    {1, 2, 3}, 
    {4, 5, 6} 
}; // new int[][]가 생략됨

2차원 배열의 길이

  • int score[5][3]에서 length 값은?

    • score.length 의 값은 5

    • score[0].length, score[1].length, score[2].length, score[3].length, score[4].length 의 값은 3

  • 1차원 배열처럼 범위 기반 for문을 사용하면 안 된다

// 에러 발생
for (int i : score) { // 에러, 2차원 배열의 각 요소는 1차원 배열
    sum += i;
}
  • 2차원 배열을 1차원 배열로 받은 후, 1차원 배열 level에서 범위 기반 for문을 사용하자
for (int[] tmp : score) { // score의 각 요소(1차원 배열 주소)를 tmp에 저자
    for (int i : tmp) { // tmp는 1차원 배열을 가리키는 참조변수
        sum += i;
    }
}

가변 배열

  • 자바는 2차원 이상의 배열을 '배열의 배열'의 형태로 처리한다는 사실을 위에서 확인했다.

  • 2차원 이상의 다차원 배열을 생성할 때 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성할 수 있다

    • 유동적인 가변 배열을 구성할 수 있음
int[][] score = new int[5][];
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[2];
score[4] = new int[3];

참조) Java의 정석 3rd edition(남궁성, 도우출판)