배열은 여러 데이터를 한번에 저장하기 위한 자료구조라고 할 수 있다. 배열을 사용하면 각각의 변수를 생성할 필요가 없으며 데이터를 함께 저장할 수 있을 뿐만 아니라 인덱스를 통한 순차적 접근이 가능해진다.
한 배열에 저장할 데이터들의 자료형은 동일해야 한다.
c언어에서는 배열 생성 시 자료형, 배열의 이름, 배열의 길이를 기재해 배열을 선언과 동시에 생성했었다.
int arr[5]; //배열 생성
자바에서의 배열 생성 과정은 c와는 다르게 레퍼런스 변수를 선언한 후 변수에 배열을 동적으로 할당한다.
int arr[]; //또는 int [] arr;
//배열에 대한 레퍼런스 변수 선언
arr = new int[5]; //레퍼런스 변수에 배열 생성

레퍼런스 변수 선언 시에는 배열 공간이 할당되지 않는다. 아직 변수에 값을 대입하지 않았으므로 레퍼런스 변수의 값은 null이다.
❗자바에서 배열 선언 시 크기를 지정하면 안됨을 주의
new 연산자를 통한 배열 생성 과정이 있어야 배열 공간이 할당된다. 이 때에 배열의 크기를 지정한다.
배열을 선언과 동시에 생성하려는 경우 다음과 같이 작성한다.
int arr[] = new int[5];
다음과 같이 new 연산자를 사용하지 않고 선언과 동시에 초기화할 수 있다.
int arr[] = {1, 2, 3, 4, 5};
이 때 배열의 크기는 데이터 개수에 따라 자동으로 정해지므로 작성해서는 안된다.
배열의 크기가 결정되면 이후 변경할 수 없다.
배열 인덱스는 0부터 시작한다. 음수 인덱스는 사용 불가하며 배열 레퍼런스만 선언하고 배열 공간은 생성하지 않은 경우 인덱스를 사용할 수 없다.
자바에서 여러 레퍼런스 변수를 통해 배열 공간을 공유할 수 있다.

레퍼런스 변수를 선언하고 배열 공간을 할당한 상태에서 새로운 레퍼런스 변수에 동일한 배열 공간을 참조하도록 하였다. 위의 상황에서 두 변수는 하나의 배열을 가리키게 된다. 배열이 복사되는 것이 아니라, 배열에 대한 주소만 복사된다.
다음과 같이 공유 중인 하나의 배열을 여러 변수를 통해 접근할 수 있다.

자바에서의 배열은 객체이다. 배열 객체는 length 필드(속성)이 존재하는데, 이는 배열의 크기 정보를 저장하고 있는 변수이다.
다음과 같이 접근한다.
int arr[] = new int[5];
int size = arr.length;
for-each문을 통해 배열 원소에 순차접근할 수 있다. 다음과 같은 구조를 갖는다.

변수 부분에는 배열에 저장된 데이터의 자료형과 변수 이름이 들어간다. 다음 예시들을 살펴보자.


다차원 배열 또한 레퍼런스 변수 선언 후 배열을 생성한다.
2차원 배열의 레퍼런스 변수는 다음과 같이 선언한다.
int arr[][]; //또는 int [][]arr;
배열 공간 생성 시에는 new 연산자를 이용한다.
arr = new int [3][3];
다음과 같이 new 연산자를 사용하지 않고 선언과 동시에 초기화할 수 있다.
int arr[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
이 때, length는 다음과 같은 의미를 가진다.
arr.length -> 배열의 행의 수
arr[0].length -> 배열의 0번째 행의 열의 수
자바에서는 각 행마다 다른 열의 길이를 가진 비정방형 배열을 생성할 수 있다.
비정방형 배열은 다음과 같이 행의 길이만 기재하고 열의 길이는 비워둔 채 각 행을 따로 생성해준다.
int arr[][] = new int[4][];
arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];
arr[3] = new int[4];
이 경우 각 행의 열의 길이는 다르게 저장된다.
비정방형 배열을 선언과 동시에 초기화하려면 다음과 같이 작성한다.
int arr[][] = {{1}, {1, 2}, {1, 2, 3},{1, 2, 3, 4}}
다음 예시를 보자.
public class Practice {
public static void main(String[] args){
int arr[][] = new int[4][];
arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];
arr[3] = new int[4];
int num = 0;
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[i].length; j++)
arr[i][j] = num++;
}
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[i].length; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
}
}
}
0
1 2
3 4 5
6 7 8 9
메소드에서 배열을 리턴하는 경우, 배열 공간 자체를 리턴하는 것이 아닌 배열에 대한 레퍼런스를 반환한다.
리턴 타입 선언 시 배열의 크기를 지정하지 않는다.
다음은 함수로부터 리턴된 배열을 변수에 저장하는 과정이다.


2차원 배열도 동일하게 배열의 크기를 지정하지 않고 레퍼런스로 받으면 된다.
지금까지 main() 메소드 작성 시 매개변수로 main(String[] args)라는 문자열 배열을 전달했었다. 이는 명령으로 입력된 인자를 문자열 배열로 만들어 메소드에 전달하기 위함이다.
커맨드 라인에서 자바 클래스 실행 시 인자를 전달할 수 있다.