같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열(array)이라고 한다.
서로 다은 타입의 변수들로 구성된 배열은 만들 수 없다.
<배열 사용 예시>
한 학급의 시험 점수를 저장하고자 할 때 배열을 사용하지 않는다면 학생 5명의 점수를 저장하기 위해선 아래와 같이 5개의 변수를 선언해야 한다.
int score1, score2, score3, score4, score5;
배열을 사용하여 다음과 같이 간단히 처리할 수 있다. 변수의 선언과 달리 다뤄야할 데이터의 수가 아무리 많아도 배열의 길이만 바꾸면 된다.
int[] score = new int[5]; // 5개의 int 값을 저장할 수 있는 배열을 생성한다.
배열을 선언하는 방법은 간단하다. 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다. 대괄호[]는 타입 뒤에 붙여도 되고 변수이름 뒤에 붙여도 된다.
<배열의 선언방법과 선언 예>
선언방법 | 선언 예 |
---|---|
타입[] 변수이름 : | int[] score; String[] name; |
타입 변수이름[]; | int score[]; String name[]; |
배열을 선언한 다음에는 배열을 생성해야한다.
배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다.
배열을 생성하기 위해서는 연산자 'new'와 함께 배열의 타입과 길이를 지정해 주어야 한다.
타입[] 변수이름; // 배열을 선언 (배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이]; // 배열을 생성 (실제 저장공간을 생성)
// 길이가 5인 int배열 생성
int[] score; // int타입의 배열을 다루기 위한 참조변수 score선언
score = new int[5]; // int타입의 값 5개를 저장할 수 있는 배열
배열의 선언과 생성을 동시에 하면 간략히 한 줄에 할 수 있다.
타입[] 변수이름 = new 타입[길이]; // 배열의 선언과 생성을 동시에한다.
int[] score = new int[5]; // 길이가 5인 int배열
생성된 배열의 각 저장공간을 '배열의 요소'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다. 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.
변수의 이름을 지을 때 score1, score2, score3과 같이 번호를 붙이는 것과 비슷하다. 다만 인덱스는 1이 아닌 0부터 시작된다.
"인덱스(index)의 범위는 0부터 '배열길이-1'까지"
예를 들어 길이가 5일 배열은 모두 5개의 요소(저장공간)를 가지며 인덱스릐 범위는 1부터 5까지가 아닌 0부터 4까지, 즉 0,1,2,3,4가 된다.
int[] score = new int[5]; // 길이가 5인 int배열
배열에 값을 저장하고 읽어오는 방법은 변수와 같다. 단지 변수이름 대신 '배열이름[인덱스]'를 사용한다는 점만 다르다.
score[3] = 100; // 배열 score의 4번째 요소에 100을 저장한다.
int value = score[3]; // 배열 score의 4번째 요소에 저장된 값을 읽어서 value에 저장
score[0] = 0;
score[1] = 10;
score[2] = 20;
score[3] = 30;
score[4] = 40;
위의 코드를 for문을 사용하여 간단히 할 수 있다.
for (int i=0; i<5; i++) {
score[i] = i * 10;
}
배열의 길이는 int 범위의 양의 정수(0도 포함)이어야 한다.
int[] arr = new int[5]; // 길이가 5일 int배열
int tmp = arr.length; // arr.length의 값은 5이고 tmp에 5가 저장된다.
int[] arr = new int[5];
for (int i=0; i<arr.length; i++) {
System.out.println(arr[i]);
}
배열의 길이를 변경하기 위해서는 더 큰 길이의 새로운 배열을 생성한 다음, 기존의 배열에 저장된 값들을 새로운 배열에 복사하면 된다.
배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화되어 초기화 해주지 않아도 되지만, 원하는 값을 저장하려면 각 요소마다 값을 지정해 줘야한다.
int[] score = new int[5];
score[0] = 50;
score[1] = 40;
score[2] = 30;
score[3] = 20;
score[4] = 10;
배열의 길이가 큰 경우엔 요소 하나하나에 값을 지정하기 보단 for문을 사용하는 것이 좋다.
int[] score = new int[5]; // 길이가 5인 int형 배열을 생성한다.
for(int i=0; i < score.length; i++)
score[i] = i * 10 + 50;
배열에 저장된 값을 확인할 때에는 for문을 사용한다.
int[] iArr = {100, 95, 80, 70, 60};
for(int i=0; i<iArr.length; i++) {
System.out.println(iAr[i]);
}
더 간단한 방법은 Arrays.toString(배열이름) 메서드를 사용하는 것이다.
int[] iArr = {100, 95, 80, 70, 60};
System.out.println(Arrays.toString(iArr));
배열은 한번 생성하면 그 길이를 변경할 수 없다. 더 많은 저장공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야한다.
배열을 복사하는 발법은 두 가지가 있다.
1. for문을 이용해 배열을 복사하는 방법
int[] arr = new int[5];
...
int[] tmp = new int[arr.length*2]; // 기존 배열보다 길이가 2배인 배열 생성
for(int i=0; i<arr.length; i++)
tmp[i] = arr[i]; arr[i]의 값을 tmp[i]에 저장
arr = tmp; // 참조변수 arr이 새로운 배열을 가리키게 한다.
이러한 작업들은 꽤나 비용이 많이 들기 때문에, 처음부터 배열의 길이를 넉넉하게 잡아주는 것이 좋다.
보통 기존의 2배 정도의 길이로 배열을 생성하는 것이 좋다.
2. System.arraycopy()를 이용한 배열의 복사
for문 대신 System클래스의 arraycopy()를 사용하면 보다 간단하고 빠르게 배열을 복사 할 수 있다.
for문은 배열의 요소 하나하나에 접근해서 복사하지만, arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다.
System.arraycopy(num, 0, newNum, 0, num.length);
// num[0]에서 newNum[0]으로 num.length개의 데이터를 복사