같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열(array)
이라고 한다.
선언방법 | 선언 예 |
---|---|
타입[ ] 변수이름; | int[ ] score; String[ ] name; |
타입 변수이름[ ]; | int score[ ]; String name[ ]; |
배열은 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다. 배열을 생성하기 위해서는 연산자 new
와 함게 배열의 타입 길이를 지정해 주어야 한다.
타입[] 변수이름; // 배열을 선언 (배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이]; // 배열을 생성 (실제 저장공간을 생성)
int[] score;
score = new int[5];
int[] score = new int[5];
생성된 배열의 각 저장공간을 배열의 요소(element)
라고 하며, 배열이름[인덱스]
의 형식으로 배열의 요소에 접근한다. 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.
인덱스(index)의 범위는 0부터 '배열길이-1' 까지이다.
배열의 또 다른 장점은 index로 상수 대신 변수나 수식을 사용할 수 있다. 배열을 다룰 때 주의해야할 점은 index의 범위를 벗어난 값을 index로 사용하지 않아야 한다는 것이다.
배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수다. 배열의 길이는 양의 정수이어야 하며 최대값은 int타입의 최대값이다.
int[] arr = new int[0];
위와 같이 길이가 0인 배열도 생성이 가능하다.
자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, 배열이름.length
를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.
int[] arr = new int[5]; // 길이가 5인 배열
int tmp = arr.length; // arr.length = 5
배열의 길이를 변경하는 방법
1. 더 큰 배열을 새로 생성한다.
2. 기존 배열의 내용을 새로운 배열에 복사한다.
배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만, 원하는 값을 저장하려면 아래와 같이 각 요소마다 값을 지정해 줘야한다.
int[] score = new int[5];
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;
int[] score = {50, 60, 70, 80, 90}; //new int[] 생략 가능
int[] score;
score = new int[]{50, 60, 70, 80, 90}; //ok
score = {50, 60, 70, 80, 90}; //error
그리고 괄호{} 안에 아무것도 넣지 않으면, 길이가 0인 배열이 생성된다. 참조변수의 기본 값은 null이지만, 배열을 가리키는 참조변수는 null대신 길이가 0인 배열로 초기화하기도 한다.
아래 세 문장은 모두 길이가 0인 배열을 생성한다.
int[] score = new int[0];
int[] score = new int[];
int[] score = {};
int[] arr = new int[5];
...
int[] tmp = new int[arr.length*2];
for (int i=0; i < arr.length; i++) {
tmp[i] = arr[i];
}
arr = tmp; // 참조변수 arr이 새로운 배열을 가리키게 한다.
System.arraycopy(num, 0, newNum, 0, num.length);
//num[0]에서 newNum[0]으로 num.length개의 데이터를 복사
String[] name = new String[3];
참조형 변수의 기본값은 null이므로 각 요소의 값은 null로 초기화된다.
지금까지 배운건 1차원 배열인데, 2차원 이상의 배열, 즉 다차원 배열도 선언해서 사용할 수 있다.
선언 방법 | 선언 예 |
---|---|
타입[ ][ ] 변수이름; | int[ ][ ] score; |
타입 변수이름[ ][ ]; | int score[ ][ ]; |
타입[ ] 변수이름[ ]; | int[ ] score[ ]; |
2차원 배열은 주로 테이블 형태의 데이터를 담는데 사용되며, 만일 4행 3열의 데이터를 담기 위한 배열을 생성하려면 다음과 같이 한다.
int[][] score = new int[4][3]
2차원 배열을 행과 열로 구성되어 있기 때문에 index도 행과 열에 각각 하나씩 존재한다.
0 | 1 | 2 | |
---|---|---|---|
0 | score[0][0] | score[0][1] | score[0][2] |
1 | score[1][0] | score[1][1] | score[1][2] |
2 | score[2][0] | score[2][1] | score[2][2] |
3 | score[3][0] | score[3][1] | score[3][2] |
2차원 배열도 괄호{}를 사용해서 생성과 초기화를 동시에 할 수 있다.
int[][] arr = {
{1, 2, 3},
{4, 5, 6}
};
자바에서는 2차원 이상의 배열을 배열의 배열
의 형태로 처리한다는 사실을 이용하면 보다 자유로운 형태의 배열을 구성할 수 있다.
int [][] score = new int[3][];
score[0] = new int[4];
score[1] = new int[5];
score[2] = new int[2];
위와 같이 2차원 배열을 생성하면 각 행마다 다른 길이의 배열을 생성하는 것이 가능하다.