03. 자바의 배열
[ 배열이란 ]
배열(array)은 인덱스(index)와 인덱스에 대응하는 일련의 데이터들로 이루어진 연속적인 자료 구조로서, 배열에는 같은 종류의 데이터들이 순차적으로 저장된다.
[ 배열 선언 및 생성 ]
자바에서 배열을 생성하는 방법은 C/C++와 달리 레퍼런스 변수 선언과 배열 생성의 두가지 단계가 필요하며, 5개의 정수 배열을 만드는 과정을 보자.
1) 배열에 대한 레퍼런스 변수 선언
int intArray[]; // 배열에대한 레퍼런스 변수 intArray를 선언한다. 초기화가 되지 않았으므로 사용할 수 없다.
intArray변수는 레퍼런스라고 불리는 배열의 주소 값을 가지며 이 자체가 배열은 아니다. 이 선언문으로 아직 배열이 생성되지 않았으므로 intArray 변수 값은 null이다. 배열에 대한 레퍼런스 변수는 다음 두가지 방법으로 선언할 수 있다.
int intArray[]; 혹은 int [] intArray; >> 선언시 []안에 배열의 크기를 지정하면 안된다. ( int intArray[5]; // 오류 )
2) 배열 생성
배열생성은 배열 공간을 할당받는 과정이다. 반드시 new 연산자를 이용하여 배열을 생성하며 [ ] 안에 생성할 원소 개수를 지정한다. 다음 코드는 5개의 정수 공간을 할당받아 배열을 생성하고, 생성된 배열에 대한 레퍼런스를 intArray에 대입한다.
intArray = new int[5]; >> 이제 intArray를 배열로 사용할 수 있다. 배열은 선언과 생성을 동시에 할 수도 있다.
int intArray = new int[5];
3) 배열 초기화
배열 선언문에서 { }안에 원소를 나열하여 초기화 된 배열을 만들 수 있다.
int intArray={3,5,7,9,11}; > 자동으로 배열의 크기가 5가된다. 배열의 크기는 { } 사이에 나열된 값의 개수로 정한다.
[ 배열 인덱스와 배열 원소 접근 ]
배열의 인덱스는 정수만 가능하다. 인덱스는 0부터 시작하며 마지막 원소의 인덱스는 (배열크기-1)이다. 배열의 원소는 레퍼런스변수와 [] 사이에 원소의 인덱스를 적어서 접근한다.
int intArray = new int[5];
intArray[0] = 5;
intArray[3] = 6;
int n = intArray[3] // 3번인덱스의 값을 읽어서 n에 저장한다. n=6
음수 인덱스로 접근하거나 배열의 범위를 넘어서면 오류가 난다.
int n = intArray[-2]; // 인덱스로 음수는 사용 불가능
int m = intArray[6]; // 인덱스의 범위는 0~4이므로 오류
배열이 생성되지 않은 상태에서 배열을 사용해도 오류가 난다.
int intArray[]; // 레퍼런스만 선언
intArray[1] = 8; // 배열이 생성되지 않음
[ 레퍼런스 치환과 배열 공유 ]
자바에서는 배열 공간과 레퍼런스 변수가 분리되어 있기 때문에 생성된 배열에 대한 공유가 쉽게 이루어진다. 즉 생성된 배열을 다수의 레퍼런스가 참조할 수 있다.
int intArray[] = new int[5];
int myArray[] = intArray; // 레퍼런스 치환. myArray는 intArray와 동일한 배열 참조
이 레퍼런스의 치환은 intArray배열을 복사하여 새로운 배열을 만들어 myArray 배열을 생성하는 것이 아니다. 레퍼런스만 복사되므로 myArray는 intArray의 레퍼런스값을 가지게 되면서 myArray는 intArray의 배열을 공유하게 된다. myArray로 intArray의 배열 원소를 마음대로 접근할 수 있다.
[ 배열의 크기, length 필드]
자바는 배열을 객체로 다룬다. 배열이 생성되면 배열공간과 함께 배열의 크기 값을 가진 length필드가 배열 객체 내에 생성된다. 배열의 크기는 length필드를 이용해서 간단히 알아낼 수 있다.
int intArray[] = new int[5];
int size = intArray.length; // size = 5
length필드를 이용하면 프로그램에서 배열의 크기를 따로 관리할 필요가 없다. length 필드를 이용하여 배열의 모든값을 출력하는 코드는 for( int i = 0; i <intArray.length ; i++) System.out.println(intArray[i]);
[ 배열과 for-each문 ]
for문을 변형한 for-each문은 배열이나 나열의 크기만큼 루프를 돌면서, 각 원소를 순차적으로 접근하는데 매우 유용하다.
for( 변수 : 배열레퍼런스 ) { ... 작업문 .... }