배열(Array)
은 같은 타입의 여러 데이터를 묶어서 하나의 묶음으로 제공하는 데이터 타입입니다. 변수에서 참조형의 대표 주자가 배열입니다.
배열은 다음과 같이 선언합니다.
타입[] 이름;
이름 = new 타입[n]; //n은 배열의 크기(정수)
이때 타입[] 이름
은 배열에 접근하고 조작하기 위한 참조변수(이름)을 만드는 공간을 선언하는 것이기 때문에 이름 = new 타입[]
을 통해 배열을 생성해주어야 비로소 배열을 생성하고 참조할 수 있게 됩니다.
그렇기 때문에 일반적으로는 아래와 같이 변수 선언과 배열 생성을 동시에 수행합니다.
타입[] 이름 = new 타입[n];
int형 변수 3개를 저장할 수 있는 배열 선언과 생성의 예시 입니다
int[] numbers = new int[3]; //3칸짜리 배열이 생성
이렇게 생성한 배열은 이름[index]
의 형태로 접근합니다. 이때 인덱스는 배열의 공간인데, 우리가 현실에서는 숫자를 1부터 세지만 인덱스는 0부터 센다는 것을 주의해 주세요.
배열에 참조형 변수를 저장하는 경우는 배열 요소에 값이 아닌, 값이 저장된 객체의 주소를 저장합니다.
배열도 초기화가 필요합니다. 초기화를 하지 않을 경우 배열의 공간에 변수 타입의 기본값이 들어갑니다.
타입 | 기본값 |
---|---|
boolean | false |
char | '\u0000' |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0 |
참조형 | null |
배열의 초기화는 다음과 같이 수행합니다.
int[] numbers = new int[3];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
만약 배열의 크기가 커지는 경우는 위와같이 한 줄 씩 초기화 구문을 작성하는 것이 불편할 수도 있습니다. 그래서 자바는 다음과 같이 단축 초기화 구문을 제공하고 있습니다.
int[] numbers = { 1, 2, 3 };
int[] numbers = new int[] { 1, 2, 3 };
단축 초기화 구문을 이용하는 경우 초기화 요소의 갯수에 따라 자동적으로 배열의 크기를 잡아줍니다.
한가지 주의할 점은 둘 중 아무거나 쓰면 안되고 int[] numbers = new int[] {}
를 사용하는 상황이 따로 있습니다. 바로 선언과 초기화가 따로있는 경우엔 위 방식을 사용해야합니다.
int[] numbers;
numbers = {}; //에러발생
int numbers;
numbers = new int[] {}; //선언과 초기화를 따로할땐 이렇게!!!
다음 예제는 배열을 선언하고 초기화까지 한 뒤 모든 요소를 출력하는 예제 코드입니다.
public static void main(String[] args) { int[] numbers = { 1, 2, 3 }; for (int i = 0; i < numbers.length; i++) { System.out.println(numbers[i]); } }
length
는 배열의 길이를 취득하는 프로퍼티입니다. numbers의 길이는 3이므로numbers.length
는3
이 됩니다.
반복문을 순회하는 동안 루프 변수i
는0, 1, 2
가 되므로numbers[i]
를 통해 배열의 0번, 1번, 2번 인덱스에 순차적으로 접근할 수 있게 되는 것 입니다.
자바에서는 다차원 배열도 선언할 수 있습니다. 지금까지 배운 배열은 데이터를 한 줄로만 저장하는 일차원 배열이었습니다.
실제로는 2차원 이상의 다차원 배열을 사용할 일은 거의 없습니다.
2차원을 배우면 그 이상의 다차원 배열은 대괄호[]
를 늘려나가는 식이기 때문에 2차원 배열을 가지고 다차원 배열을 다뤄보도록 하겠습니다.
2차원 배열은 다음과 같이 선언합니다.
int[][] 이름 = new int[n][n];
위와 같이 선언하면 n x n
개의 공간을 가진 배열이 생성됩니다.
그리고 이 2차원 배열의 초기화는 다음과 같이 수행합니다.
int[][] arr = new int[3][3];
arr[0][0] = 01;
arr[0][1] = 02;
arr[0][2] = 03;
arr[1][0] = 11;
(...)
arr[2][2] = 23;
단축구문을 활용해 초기화를 수행할 수도 있습니다.
int[][] arr = new int[][] {
{ 01, 02, 03 },
{ 11, 12, 13 },
{ 21, 22, 23 }
};
[ ][0] | [ ][1] | [ ][1] | |
---|---|---|---|
[0][ ] | 01 | 02 | 03 |
[1][ ] | 11 | 12 | 13 |
[2][ ] | 21 | 22 | 23 |
구조에서 눈치채신 분들도 계시겠지만, 다차원 배열이라는 것은 배열의 요소로 배열을 넣었다라는 것과 동일합니다.
따라서 다음과 같이 2차원 이상의 배열에 서로 다른 크기를 넣을 수도 있습니다.
int[][] arr = new int[3][];
arr[0] = new int[3];
arr[1] = new int[4];
arr[2] = new int[5]
이렇게하면 각각 3, 4, 5칸 짜리 배열을 요소로 갖는 2차원 배열을 만들 수 있습니다.
자바에서는 한 번 생성한 배열은 크기를 변경할 수 없기 때문에 배열의 크기를 늘리고자 한다면 현재 배열보다 큰 크기의 배열을 만든 뒤 기존 배열의 내용을 복사해서 넣는 식으로 해야합니다.
배열을 복사하는 방법에는 for
문을 이용한 방법과 System 클래스의 arraycopy()
메소드를 이용하는 방법이 있습니다.
for
문을 사용해서 요소를 하나씩 옮깁니다.
int[] numbers = { 1, 2, 3 };
int[] newNumbers = new int[5];
for (int i = 0; i < numbers.length; i++) {
newNumbers[i] = numbers[i];
}
다음 코드를 사용해서 복사한
newNumbers
배열의 요소를 출력합니다.for (int i = 0; i < newNumbers.length; i++) { System.out.print(newNumbers[i]); }
arraycopy()
메소드를 사용하면 간단하게 배열을 복사할 수 있습니다.
System.arraycopy(arr1, idx1, arr2, idx2, n);
//arr1[idx1]에서 arr2[idx2]으로 n개를 복사
for문 복사에 사용했던 코드를 arraycopy()
를 사용한 코드로 바꿔보겠습니다.
int[] numbers = { 1, 2, 3 };
int[] newNumbers = new int[5];
System.arraycopy(numbers, 0, newNumbers, 0, 3);
마찬가지로 실행해보면 잘 복사됨을 확인할 수 있습니다.