[JAVA] 배열의 생성부터 다차원 가변 배열까지

2023. 11. 23. 21:05프로그래밍 언어/Java

1. 배열의 생성

변수[] 변수이름; 으로 배열을 생성하고

변수이름 = new 타입[길이]; 로 배열 실제 저장공간을 생성한다.

간단하게 int [] score = new int [5];처럼 배열을 생성할 수 있다. 배열의 생성과정을 단계별로 살펴보자.

  1. int [] score;
    int형 배열 참조변수 score를 선언한다. 아직 데이터를 저장할 수 있는 공간은 마련되지 않았다.
  2. score = new int [5];
    new 연산자를 통해 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련된다. 그리고 자동으로 각 배열 요소가 기본값으로 초기화된다. 끝으로 = 연산자에 의해 배열의 주소가 int형 배열 참조변수 score에 저장된다.

2. 배열의 길이

자바에서는 길이가 0인 배열도 생성이 가능하다! 나름 유용한 정보이므로 기억해 두고 넘어가자.

배열은 한번 생성하면 길이를 변경할 수 없다. 배열의 길이를 변경하려면 새로운 배열을 생성하고 기존 배열을 새로운 배열에 복사하는 방법밖에 없다. 혹은 이미 공간이 할당된 기존 배열에 다시 new를 적용하여 새로운 공간을 할당시킬 수 있지만 이 경우 기존 값에 접근할 수 없다.

3. 배열의 초기화

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

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

위의 두 방법으로 배열을 생성하면서 초기화할 수 있다. 괄호 안의 값의 개수에 의해 배열의 길이가 자동으로 결정된다. 주의할 점은 선언과 초기화를 따로 할 경우 new int []를 생략해선 안된다.

int[] score;

score = {50, 60, 70}; //오류

 

그리고 괄호 안에 아무것도 넣지 않으면 길이가 0인 배열이 생성된다. 참조변수의 기본 값은 null이지만, 배열을 가리키는 참조변수의 경우 null대신 길이가 0인 배열로 초기화하기도 한다.

4. 배열의 출력

int[] arr = {10, 20, 30, 40};

System.out.println(arr);

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

위의 방식처럼 배열을 출력할 수 있다. 여기서 주의해야 할 점이 첫 번째 방식처럼 배열을 그냥 출력하면 arr은 참조변수이므로 당연히 배열의 주소가 출력된다. 따라서 Arrays.toString() 메서드를 이용하여 배열의 요소를 출력할 수 있다. 예외적으로 char 배열은 println메서드로 그냥 출력하면 각 요소가 구분자 없이 그대로 출력된다.

5. 배열의 복사

배열의 복사는 어떻게 할 수 있을까? 가장 먼저 떠올릴 수 있는 방법은 두 가지 정도가 있다.

  1. 얕은 복사
    새로운 배열을 만들고, for문을 통해 값들을 하나하나 복사하면서 값만 복사하는 방법이 있다.
  2. 깊은 복사
    참조변수에 그대로 대입하는 방법이 있다. int [] arr2 = arr;과 같이 복사하게 되면 arr2가 arr과 같은 주소를 가리키므로 완전히 같은 배열을 가지게 된다. 여기서의 완전히는 arr2 [i]의 값을 변경하면 arr [i]의 값도 변경될 만큼 같다는 뜻이다.

이런 방법도 있지만 for문보다 System.arraycopy()를 사용하는 것이 효율적이다. arraycopy()는 매개변수를 차례대로 어느 배열의 몇 번째 요소에서 어느 배열로 몇 번째 요소로 몇 개의 값을 복사할 것인지 지정해줘야 한다.

 

System.arraycopy(arr, 0, newArr, 0, arr.length);

 위와 같이 사용하면 배열 arr [0]에서 newArr [0]으로 arr.length만큼 데이터를 복사한다는 뜻이다.

 

이를 활용하면 두 배열을 합쳐서 하나의 배열로 만드는 것도 가능하다.

public class ArrayMergeExample {
    public static void main(String[] args) {
        // 첫 번째 배열
        int[] array1 = {1, 2, 3, 4, 5};
        
        // 두 번째 배열
        int[] array2 = {6, 7, 8, 9, 10};
        
        // 두 배열을 합칠 새로운 배열 생성
        int totalLength = array1.length + array2.length;
        int[] mergedArray = new int[totalLength];
        
        // 첫 번째 배열 복사
        System.arraycopy(array1, 0, mergedArray, 0, array1.length);
        
        // 두 번째 배열 복사
        System.arraycopy(array2, 0, mergedArray, array1.length, array2.length);
        
        // 합쳐진 배열 출력
        System.out.print("Merged Array: ");
        for (int num : mergedArray) {
            System.out.print(num + " ");
        }
    }
}

6. String 배열

String 타입 변수는 원래 참조 변수이지만 int 배열의 선언과 생성방법과 똑같은 방식을 가진다. 다만 초기화 방법이 약간 다르다.

String[] name = new String[2];
name[0] = new String("Hello");
name[1] = "World";

이런 식으로 new 연산자를 생략하여 초기화할 수 있다. 이 경우 메모리는 아래의 그림처럼 형성된다.

 

7. String 클래스

String클래스는 char배열에 메서드를 추가한 것이다. 주요 메서드 몇 가지만 알고 가자.

  • String substring(int from, int to) : from ~ to의 문자열을 반환한다. to는 범위에 포함되지 않는다.
  • boolean equals(Objects obj) : 문자열의 내용이 obj와 같은지 확인한다.

8. 다차원 가변 배열

자바에서는 2차원 이상의 배열을 배열의 배열 형태로 처리한다. 따라서 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고 각기 다른 길이의 배열을 생성할 수 있다.

int[][] score = new int[3][];
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];

위와 같은 방식으로 각 행마다 길이가 다른 배열을 생성할 수 있다.