

배열로 값을 저장하게 된다면 연속된 주소에 저장할수 있다.
그림을 보면 알 수 있듯 배열의 변수는 값을 저장하는 게 아닌 배열 객체의 참조값을 저장하고 있다.
선언하는 방법은 간단하다.
두 가지 중 어느 것을 사용해도 상관없지만 배열인 것을 쉽게 알아볼 수 있게
1번의 방식을 선호한다.
배열을 선언하는 것은 배열을 다루기 위한 참조변수의 공간을 만들 뿐이다.
생성을 해야지만 실제 다룰 값을 저장할 공간이 만들어진다.
생성하는 방법은 연산자 new와 함께 배열의 타입과 길이를 지정해야한다.
타입[] 변수이름; // 배열을 선언(배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이]; // 배열을 생성(실제 저장공간을 생성)

5개의 요소가 들어갈 수 있는 배열의 인덱스는 0부터 4까지이다.
배열의 값을 저장하고 읽어오는 방법은 변수와 같다.
단지 변수이름 대신 배열이름[인덱스] 를 사용한다.
score[3] = 100; // 배열 score의 4번째 요소에 100을 저장
int value = score[3]; // 배열 score의 4번째 요소에 저장된 값을 value에 저장
배열을 다룰 때 주의할 점은 index의 범위를 벗어난 값을 index로 사용하지 않아야 한다.
예를 들어 위와 같은 배열의 인덱스는 0~4인데 score[5]로 접근하게 된다면 예외가 발생한다.
int[] score = new int[5];
score[5] = 100;
앞서 배열을 생성할 때 괄호[ ] 안에 배열의 길이를 적어주었다.
배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수다.
자바에서는 배열의 길이가 0인 배열도 만들 수 있다.
int[] arr = new int[0];
배열이름.length 를 사용하여 배열의 길이를 알 수 있다.
int[] arr = new int[5]; // 길이가 5인 int형 배열
int tmp = arr.length; // arr.length의 값은 5이고 tmp에 5 저장
int[] score = new int[5];
for(int i=0; i<score.length; i++) {
System.out.println(score[i]);
}
for문의 조건식의 상수값 대신 배열의 길이를 넣어서 배열의 요소의 개수만큼 반복할 수 있다.
배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화된다.
만약 원하는 값을 저장하려면 아래와 같이 각 요소마다 값을 지정해주어야 한다.
int[] score = new int[5];
score[0] = 100; // 각 요소에 값 직접 저장
score[1] = 200;
score[2] = 300;
score[3] = 400;
score[4] = 500;
// for 문을 이용하여 한번에 저장도 가능하다
for(int i=0; i<score.length; i++) {
score[i] = 100 * (i+1);
}
배열의 생성과 동시에 초기화를 할 수 있는 방법도 있다.
// 생성과 동시에 { } 안에 쉼표로 구분해서 값을 나열하여 초기화할 수 있다.
int[] score = new int[]{50, 60, 70, 80, 90};
// 선언과 동시에 초기화를 한다면 new int[]를 생략할 수 있다.
int[] score = {50, 60, 70, 80, 90};
// 선언과 생성을 따로한다면 new int[]를 생략해서는 안된다.
int[] score;
score = {50, 60, 70, 80, 90}; // 에러. new int[] 생략 불가능
score = new int[]{50, 60, 70, 80, 90};
{ } 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에
[ ] 안에 배열의 길이를 생략해도 된다.
그러나!! 배열의 길이를 명시와 동시에 초기화하면 컴파일 에러가 뜬다!!
int[] i = new int[5]{10,20,30,40,50};
이렇게 실행을 해보면 array creation with both dimension expression and initialization is illegal 의 에러가 뜬다.
배열의 값들을 출력해보고 싶다면 어떻게 해야 할까?
배열 변수를 직접 출력해보자
int[] arr = {100, 95, 80, 70, 55};
System.out.println(arr);
실행 결과 :
[I@4eec7777
기대했던 결과와는 다르게 '타입@주소'의 형태로 출력되었다.
@ 앞의 것은 객체의 클래스 타입 이름이고, @ 뒤의 내용은 객체의 주소값이다.
우리가 기대했던 배열에 담겨있는 값들을 출력하고 싶다면 요소에 직접 접근하여 출력시켜주어야 한다.
int[] arr = {100, 95, 80, 70, 55};
for(int i=0; i<arr.length; i++) {
System.out.println(arr[i]);
}
for 문을 이용하여 배열의 요소에 직접 접근하여 출력해야 배열의 요소 값들이 출력된다.
배열을 다루기 위한 메소드들을 모아 놓은 Arrays클래스의 toString(배열이름) 메소드를 사용하면 더 쉬운 방법으로 출력할 수 있다.
Arrays 클래스의 메소드를 사용하기 위해서는
import java.util.Arrays 를 선언해주어야 한다.
int[] arr = {100, 95, 80, 70, 55};
System.out.println(Arrays.toString(arr);
예외적으로, char배열은 print 메소드로 출력하면 각 요소가 구분자 없이 그대로 출력된다.
char[] chArr = {'a', 'b', 'c', 'd'};
System.out.println(chArr);
실행 결과 :
abcd
자바에서는 배열을 한 번 생성하면 길이를 변경할 수 없기 때문에 더 많은 저장공간이 필요하다면 더 큰 배열을 생성하고 이전 배열의 값을 복사해야한다.
for 문을 이용하여 배열을 복사하는 방법
int[] arr = {1,2,3,4,5};
int[] tmp = new int[arr.length * 2];
for(int i=0; i<arr.length; i++) {
tmp[i] = arr[i];
}
이렇게 직접 새로운 배열을 생성하고 값을 일일이 넣어주는 방법이 있다.
그리고 또 다른 방법은 Arrays.copyOf 메소드를 사용하는 것이다.
Arrays.copyOf(원본 배열, 새로 만들 배열의 길이)
int[] arr = {1,2,3,4,5};
int[] tmp = Arrays.copyOf(arr, 10);
2차원 배열을 선언하는 방법은 1차원 배열과 같다. 다만 배열 안에 배열이 들어가는 것이기 때문에 괄호[ ]가 하나 더 들어갈 뿐이다.

그림처럼 2차원 배열은 배열 안의 요소가 배열을 가리키는 것이다.
초기화하는 방법도 1차원 배열과 방법이 동일하다.
2차원 이상의 배열을 만들 때 마지막 배열 차수의 길이를 지정하지 않고 유동적으로 다른 길이의 배열을 생성함으로써 가변 배열을 만들 수 있다.
일반적인 2차원 배열 생성 : int[ ][ ] arr = new int[5][3];
위처럼 배열을 생성하지 않고 int[ ][ ] arr = new int[5][ ]; 같이 생성하면
각 행마다 다른 길이의 배열을 생성할 수 있다.
int[][] A = new int[5][];
A[0] = new int[4];
A[1] = new int[2];
A[2] = new int[5];
A[3] = new int[3];
A[4] = new int[4];
이렇게 이차원 배열을 생성하면 밑의 그림처럼 각 요소가 가리키고 있는 배열들의 길이가 다르게 만들 수 있다.
