배열(array)은 인덱스(index)와 인덱스에 대응하는 데이터들로 이루어진 연속적인 자료 구조로서, 같은 종류의 데이터들이 순차적으로 저장된다.
자바에서 배열의 생성은 C/C++와 달리 다음 두 단계로 이루어진다.
int intArray [];
int [] intArray;
이 선언만으로 배열 공간이 할당되지 않으며 위와 같이 레퍼런스 변수 intArray만 생성된다. intArray는 배열 공간에 대한 주소 값(레퍼런스 값)을 가지며 그 자체가 배열은 아니다. 아직 정수를 저장할 배열 공간이 생성되지 않았으므로 intArray 값은 null이다. 자바에서는 배열의 주소를 레퍼런스라고 부르며, 배열에 대한 주소 값을 가지는 변수를 레퍼런스 변수라고 부른다.
주의할 점은 int intArray[10] 와 같이 배열 선언 시 [ ] 안에 배열의 크기를 지정해서는 안 된다.
intArray - new int [5];
배열 생성은 데이터를 저장할 배열 공간을 할당받는 과정이다. 반드시 new연산자를 이용하여 배열을 생성하며 [ ]안에 생성할 원소 개수를 지정한다.
물론 이 두가지 단계로 나누지 않고 아래와 같이 한 번에 선언과 동시에 생성할 수 있다.
int intArray[] = new int[5];
배열 선언문에서 { }에 원소를 나열하면 초기화된 배열을 만들 수 있다.
int intArray[] = {4,3,2,1,0};
double doubleArray[] = {0.1,0.2,0.3,0.4};

intArray 배열의 크기는 자동으로 5가 되며, doubleArray 배열의 크기는 자동으로 4가 된다. 생성되는 배열의 원소 개수는 { }에 나열된 값의 개수로 정해지므로 [ ]에 크기를 주어서는 안 된다.
배열의 인덱스는 정수만 가능하다. 인덱스는 0부터 시작하며 마지막 원소의 인덱스는 배열 크기 -1이다. 배열의 원소는 인덱스를 이용하여 접근한다. 다음과 같은 예로 가능한 것과 불가능 한 것을 볼 수 있다.
자바에서는 레퍼런스 변수와 배열 공간이 분리되어 있기 때문에, 다수의 레퍼런스 변수가 하나의 배열 공간을 가리키는 배열 공유가 쉽게 이루어진다.
int intArray[] = new int[5];
int myArray[] = intArray;
// 레퍼런스 치환. myArray는 intArray와 동일한 배열 참조

int myArray[ ] = intArray는 레퍼런스 변수 myArray를 생성하고 intArray 변수의 값을 myArray에 치환하는 코드이다. 이 치환으로 intArray 배열이 복사되는 것이 아니라, 레퍼런스 즉 배열에 대한 주소만 복사된다. 그 결과 myArray는 intArray와 동일한 레퍼런스 값을 가지게 되어 myArray는 intArray의 배열을 공유하게 되고, myArray로 intArray의 배열 원소를 마음대로 접근할 수 있다.
기존의 for 문을 변형하여, 배열이나 나열(enumeration)의 크기만큼 루푸를 돌면서 각 원소를 순차적으로 접근하는데 유용하게 만든 for 문을 for-each라고 부른다.
배열 n에 들어 있는 모든 정수를 더하는 코드를 for-each 문으로 작성하면 다음과 같다.
int [] n = { 1,2,3,4,5 };
int sum = 0;
for (int k : n) {
sum += k;
}
System.out.prinln(sum);
위 코드에서 for (int k : n)을 바꾸면 다음과 같다.
for (int i=0; i<n.length; i++) {
int k = n[i];
sum += k;
}
문자열 배열에 있는 모든 문자열을 for-each 문으로 출력하는 코드와 실행 결과는 다음과 같다.
String names[] = { "사과", "배", "바나나", "체리", "딸기", "포도" };
for (String s : names) {
System.out.print(s + " ");
}
실행 결과: 사과 배 바나나 체리 딸기 포도
배열뿐만 아니라 나열 타입(enum)에 대해서도 다음과 같이 for-each 문이 사용된다.
enum Week { 월, 화, 수, 목, 금, 토, 일 }
for (Week day : Week.values())
System.out.print(day + "요일 ");
실행 결과: 월요일 화요일 수요일 목요일 금요일 토요일 일요일)