프로그래밍 언어/자바

자바 11. 배열-2

닉네임못짓는사람 2020. 8. 24. 10:31
반응형

배열에 대해서 이어서 알아보도록 하겠습니다.

다차원 배열


우리가 지금까지 보았던 배열은 모두 '1차원 배열'이라고 부르는 것들입니다.

복수의 자료형을 메모리 공간상에 선형, 즉 1차원으로 잡혀있기 때문에 이처럼 부르는 것입니다.

자바에서는 1차원 배열 외에도 2차원 이상의 배열도 사용할 수 있도록 허용하고 있습니다.

물론 메모리 공간에서는 동일하게 연속적인 공간일 뿐이고, 편의상 이처럼 부르는 것입니다.

 

이렇게 2차원 이상의 배열들을 다차원 배열이라고 이야기하는데,

다차원 배열들은 각각 자신보다 한 단계 아래 차원의 배열들을 요소로 하는 배열입니다.

예를 들어 2차원 배열은 1차원 배열들을 각 요소로 가지며,

3차원 배열들은 1차원 배열을 각 요소로 하는 2차원 배열을 요소로 가지게 됩니다.

즉 '배열의 배열'형태를 가지게 되는데, 2차원 배열을 그림으로 표현하면 다음과 같습니다.

 

2차원, 3차원 배열을 선언하는 방법은 다음과 같습니다.

타입[][] 변수 이름 = new 타입[크기][크기]
타입[][][] 변수 이름 = new 타입[크기][크기][크기]

기본 구조는 1차원 배열과 크게 다르지 않으며, 가장 앞의 대괄호부터

3차원, 2차원, 1차원 배열의 순서로 각 배열의 요소를 지정할 수 있습니다.

 

간단한 예제를 통해 2차원 배열의 사용법을 알아보도록 합시다.

public class example{
    public static void main(String[] args){
        int[][] score = {{100, 90}, {10, 20}, {30, 40}, {50, 70}};
        for(int i = 0; i < score.length; i++){
            System.out.println(score[i][0] + " " + score[i][1]);
        }
    }
}

위의 예제는 크기가 2인 1차원 배열 4개를 각 요소로 가지는 2차원 배열입니다.

이전에 배열명.length를 사용해 배열의 크기를 구하는 방법을 알아봤었는데,

위와 같이 다차원배열에 length를 사용하게 되면 이는 배열의 가장 높은 차수의 크기를 반환합니다.

따라서 위의 배열의 경우 2차원 배열의 크기가 4이기 때문에 score.length = 4가 됩니다.

1차원 배열의 크기를 구하고 싶을 경우 score[0].length와 같이 사용해주시면 됩니다.

가변 배열


자바에서는 위에서 봤던 다차원 배열에 대해서 좀 더 자유로운 형태의 배열을 구성할 수 있는데,

다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 크기를 지정하지 않고,

추후에 다른 크기의 배열을 생성함으로써 유동적인 크기의 가변 배열을 구성할 수 있습니다.

 

예를 들어 위에서 사용한 4x2크기의 2차원 배열을 다음과 같이 생성할 수 있습니다.

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

위와 같이 배열을 생성하면 4x2크기의 직사각형 배열이 생성되는데,

이 방법을 사용해서 각 1차원 배월의 크기를 서로 다르게 생성할 수 있습니다.

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

이처럼 2차원 배열에 서로 다른 2, 4, 3, 5 크기의 1차원 배열들을 요소로 가지게 할 수 있습니다.

이를 그림으로 표현하면 다음과 같습니다

또한 가변배열도 중괄호를 사용해 new int를 사용하지 않고 초기화가 가능합니다.

int[][] score = {{100, 200, 300}, {100, 200}, {300, 400, 500, 100}, {500, 300}};

배열의 복사


배열은 한번 생성하면 그 크기를 변경할 수 없습니다.

때문에 기존에 만들어 놓은 배열의 데이터를 포함한 더 많은 데이터를 저장하기 위해서는

새로운 배열을 생성하고, 기존 배열의 데이터를 복사해야 합니다.

 

이러한 배열간 데이터를 복사하는 방법은 for문을 사용하거나, System클래스의 arraycopy()를 사용하면 됩니다.

예제를 통해서 사용법을 알아보도록 합시다.

public class example{
    public static void main(String[] args){
        int[] num = {1, 2, 3, 4, 5};
        int[] newNum = new int[10];
        for(int i = 0; i < num.length; i++){
            newNum[i] = num[i];
        }
        for(int i = 0; i < num.length; i++){
            System.out.print(newNum[i]);
        }
    }
}

먼저 for문을 사용한 방법인데, 기존 5크기의 num배열의 각 요소를

10크기의 newNum의 각 요소에 그대로 대입하는 방법입니다.

또한 배열 생성 시 값을 따로 초기화하지 않은 값들은 기본적으로 0으로 초기화된 것을 볼 수 있습니다.

 

이런 방법 외에도 arraycopy()를 사용하면 보다 간단히 배열을 복사할 수 있습니다.

arraycopy의 사용방법은 다음과 같습니다.

System.arraycopy(num, 0, newNum, 0, num.length);

위와 같이 사용하면 num배열의 0번 인덱스의 요소부터 num.length만큼 데이터를 복사해,

newNum의 0번 인덱스부터 각 요소를 붙여 넣습니다.

이때 배열의 위치를 적절히 지정해주지 않아 newNum의 범위를 넘어갈 경우 오류가 발생하니 주의하시기 바랍니다.

간단한 예제로 사용법을 확인해보도록 하겠습니다.

public class example{
    public static void main(String[] args){
        int[] num = {1, 2, 3, 4, 5};
        int[] newNum = new int[10];
        System.arraycopy(num, 0, newNum, 2, num.length);
        for(int i = 0; i < newNum.length; i++){
            System.out.print(newNum[i]);
        }
    }
}

위의 예제에서 num배열의 0번 인덱스부터 5개의 배열 요소를 복사해

newNum의 2번 인덱스에 데이터를 붙여 넣은 것을 확인할 수 있습니다.

 

이상으로 배열에 대한 설명은 마치도록 하겠습니다.

감사합니다.

반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

자바 13. 변수의 종류, 메서드  (0) 2020.08.26
자바 12. 클래스와 객체  (0) 2020.08.25
자바 10. 배열-1  (0) 2020.08.14
자바 9. 반복문  (0) 2020.08.13
자바 8. 조건문  (0) 2020.08.12