본문 바로가기

JAVA

[Snack Java] 12. 자바의 배열 (Array)

이전 글 보기

2022.06.06 - [JAVA] - [Snack Java] 11. 자바의 반복문 (WHILE문, DO WHILE문, break, continue)

 

[Snack Java] 11. 자바의 반복문 (WHILE문, DO WHILE문, break, continue)

이전 글 보기 2022.06.05 - [JAVA] - [Snack Java] 10. 자바의 반복문 (FOR문, 향상된 FOR문) [Snack Java] 10. 자바의 반복문 (FOR문, 향상된 FOR문) 이전글 보기 2022.06.05 - [JAVA] - [Snack Java] 9. 자바의..

yunjuniverse.tistory.com

 

앞선 글에서 데이터의 집합형태라고 설명했던 배열(Array)에 대해 알아보겠습니다. 배열은 데이터를 변수마다 하나씩 할당하는 것이 아닌 하나의 변수에 같은 타입의 데이터를 그룹으로 묶은 자료구조입니다.

 

배열은 1차원 배열과 다차원 배열로 나눕니다. 이제부터 배열은 엑셀의 스프레드시트를 떠올리며 이해하면 쉽습니다.

 

 

1차원 배열은 하나의 행으로 구성되어 있는 배열이고 2차원 배열은 행과 열로 이루어진 배열입니다. 엑셀이 2차원 배열로 데이터를 조작하는 대표적인 프로그램입니다. 

 

물론 3차원, 1,000차원 배열도 있습니다. 3차원은 x축(행), y축(열)에 z축이 하나 생긴 형태입니다.

 

 

이런 식으로 차원이 하나씩 중첩되는 것이죠. 안타깝게도 3차원 이상의 배열은 우리가 시각적으로 이해할 수 없습니다. 우리의 차원이 3차원이기 때문이죠. 하지만 수학적으로는 축이 하나 더 생긴 걸로 이해하면 됩니다. 이렇게 여러 차원으로 이루어진 배열이 다차원 배열입니다. 

 

1차원 배열

일단은 1차원 배열에 대해 알아봅시다.

 

한자릿 수 짝수로만 이루어진 데이터를 배열을 이용해 한 곳에 모아 보겠습니다.

 

int[] even = {2, 4, 6, 8};

 

int 타입으로 이루어진 배열을 선언했습니다. 형태를 정리해보죠.

 

배열은 동일한 타입만을 담을 수 있습니다. 따라서 배열의 타입을 선언해주어야하는데요 일반 타입 선언과는 다르게 배열이라는 것을 컴퓨터에게 알려주기 위해 대괄호를 바로 뒤에 적어 줍니다. String [], char [] 등.

 

그리고 배열은 {}중괄호로 감싸서 선언하고 각 데이터는 쉼표로 구분해줍니다. 이 배열 안의 데이터는 요소 또는 원소(element) 라고 합니다. 

 

그렇다면 배열의 요소에 접근하기 위해서는 어떻게 해야할까요? 배열의 요소에 접근 할 때는 요소가 가진 순서를 이용합니다. 배열 안에 있는 요소는 순서대로 저장되는데, 0부터 시작하는 번호표를 가지고 있습니다. 프로그래밍 언어는 이 번호표를 인덱스(index)라고 합니다. 자바에서는 배열의 요소를 배열이름[인덱스]의 형태로 선언해 요소에 접근합니다.    

 

public class ArrayExample {
    public static void main(String[] args) {
        int[] even = {2, 4, 6, 8};

        System.out.println(even[0]);
        System.out.println(even[1]);
        System.out.println(even[2]);
        System.out.println(even[3]);
    }
}

/*
출력값
2
4
6
8
*/

 

 

그런데 당장 배열에 담을 데이터가 정해지지 않은 경우는 어떻게 선언할 수 있을까요? 만약 사용자가 정수형 데이터를 입력하는 것을 배열에 담아야한다면, 입력 하기 전까지는 비어있는 공간이 있어야겠죠. 그런데 배열에 데이터가 몇 개가 들어올지도 모를 때도 있습니다. 

 

따라서 자바는 배열을 크기만 할당하거나 메모리를 미리 할당하지 않고 초기화 없이 선언하는 것도 가능합니다. 배열은 참조 타입이기 때문에 일단 데이터가 들어갈 위치의 시작 주솟값만 가지고 있는 것입니다. 배열을 생성하고 초기화 하는 방법에 대해 알아봅시다. 배열을 생성하기 위해서는 직접 데이터를 입력하거나 객체를 생성하는 것처럼 new 키워드를 사용해 new 데이터 타입[배열크기]를 입력합니다. 예를 들어 new int[3]은 int타입의 요소 3개가 들어올 수 있는 배열을 선언합니다. 예제를 보시죠

 

// 1. 선언과 동시에 초기화
int[] arr1 = new int[3]; // arr -> {0, 0, 0}
// 배열의 요소에 값을 지정하지 않으면 각 요소는 해당 타입의 기본값으로 자동으로 채워집니다.
// int타입은 기본값은 0입니다. 

// 2. 선언 후 초기화 
int[] arr2;
arr2 = new int[3]; // arr -> {0, 0, 0}
// 배열의 요소에 값을 지정하지 않으면 각 요소는 해당 타입의 기본값으로 자동으로 채워집니다.

// 3. 선언과 동시에 값을 넣어 초기화
int[] arr3 = {1, 2, 3};
int[] arr3 = new int[] {1, 2, 3};

 

기존 타입 선언 방법과 같습니다. 하지만 배열의 크기를 선언하는 대괄호에 배열의 요소가 들어갈 수 있는 크기를 넣어줍니다.

 

마지막으로 배열의 길이를 알 수 있는 방법을 알아보겠습니다. 배열이 가지고 있는 길이는 배열이름.length로 확인할 수 있습니다. 예제를 보며 확인하겠습니다.

 

int[] arr1 = new int[3];
int[] arr2 = new int[]{1, 2, 3, 4};
System.out.println(arr1.length); // 출력값: 3
System.out.println(arr2.length); // 출력값: 4

 

주의해야할 점은 배열의 크기는 요소의 개수를 말하는 것입니다. 그런데 배열의 인덱스는 0부터 시작하기 때문에 위 예제에서 4개의 요소를 지닌 arr2는 인덱스가 3번까지 존재합니다. 배열의 길이와 인덱스의 차이는 앞으로 계속 나올 이슈이니 개념을 잘 정립하고 가야합니다.

 

다차원 배열

 

다차원 배열은 배열이 여러 축으로 이루어진 배열입니다. 그 중 가장 이해하기 쉽고 많이 쓰이는 배열인 2차원 배열을 기준으로 다차원 배열을 이해해보겠습니다. 

 

2차원 배열은 배열(행) 안에 배열(열)이 중첩되어 있는 배열입니다. 즉, 배열 안에 배열을 가지고 있는 형태입니다. 스프레드시트 형태를 생각하면 가장 쉽습니다.

 

2차원 이상의 다차원 배열 또한 선언 방법은 1차원 배열과 같습니다. 다만, 배열이 늘어나기 때문에 대괄호를 차원만큼 여러번 써줍니다.  예제를 보겠습니다.

 

// 1. 크기 할당 및 초기화 없이 선언만 하는 경우
int[][] arr1;
int[][][] arr1;

// 2. 선언과 동시에 배열의 크기를 지정하고 0으로 초기화 하는 경우
int[][] arr2 = new int[3][3]; 
/*
{{0, 0, 0},
 {0, 0, 0}
 {0, 0, 0,}}
*/

// 3. 선언과 동시에 값을 넣어 초기화하는 경우
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
int[][] arr = new int[][] {{1, 2, 3}, {4, 5, 6}}; 
/* 
{{1, 2, 3},
 {4, 5, 6}}
*/

 

위의 예제는 바깥 배열의 크기와 내부 배열의 크기가 같은 형태였습니다. 사실 내부 배열의 크기가 모두 같은 경우만 있지는 않습니다. 이럴땐 가변배열로 선언해 메모리를 효율적으로 활용할 수 있습니다.

 

 

위 그림을 보면 행은 3개로 동일하지만 각 행 요소의 수는 모두 다릅니다. 이런 형태로 선언하려면 바깥 배열은 3으로 선언해주고 내부는 비워둡니다.

 

int[][] arr = new int[3][];

 

 

지금까지 다차원배열의 대표주자인 2차원 배열에 대해 확인했습니다.