1차원 배열 : 타입이 같은 둘 이상의 데이터를 저장할 수 있는 1차원 구조의 메모리 공간
이 때, 배열에 저장되는 데이터들은 메모리 상에 연속적으로 놓이게 된다.
int[] ref = new int[5];
먼저, 좌변의 int[] ref
의 결과로 int 형 변수로 이루어진 배열을 참조하는 참조 변수를 만들게 된다.
우변의 new int[5]
를 통해서 5 개의 int 형 변수를 위한 공간을 가진 배열 인스턴스를 만든다. 즉, 배열도 인스턴스로 만들어지기 때문에 그 안에 메소드들이 존재한다.
따라서, ref
는 배열 인스턴스를 가리키는 참조 변수이다.
참조 변수의 선언과 배열 인스턴스의 선언이 구분되기 때문에 굳이 한 줄로 적지 않아도 된다.
int[] arr1 = new int[5];
int[] arr2;
arr2 = new int [3];
배열에는 기본 자료형 뿐만 아니라 우리가 정의한 클래스의 인스턴스도 담을 수 있다. 정확히는 배열에 각 인스턴스의 참조값을 담게 된다.
class Box {...}
Box[] arr = new Box[5];
배열의 개별 요소에 접근할 때에는 인덱스를 기반으로 접근할 수 있다.
int[] arr = new int[3];
arr[0] = 7;
arr[1] = 8;
arr[2] = 9;
위의 코드를 생성과 동시에 초기화로 진행할 수 있다.
int[] arr = {7, 8, 9};
배열을 사용하는 큰 이유이자 배열의 장점은 반복문을 통해서 순차적으로 접근할 수 있다는 것이다.
배열의 참조 변수는 하나의 클래스 내에서만 쓰이는 것이 아니라 참조값을 메소드로 전달할 수도 있고 메소드로부터 받을 수도 있다.
// 매개변수로 배열 참조 변수 선언
static int sumOfAry(int[] arr) {...}
// 메소드의 배열 참조값 반환
static int[] makeNewIntAry(int len) {...}
기본 자료형 배열은 모든 요소가 0으로 초기화가 되고,
인스턴스 배열은 모든 요소가 null로 초기화가 된다.
우리가 배열의 초기화 메소드를 이용해서 원하는 값으로 초기화를 시켜줄 수 있다.
// java.util.Arrays 클래스에 정의
// arr 배열의 요소를 7로 초기화
Array.fill(arr, 7)
// arr 배열의 idx 3부터 4까지 7로 초기화
Array.fill(arr, 3, 5, 7)
하나의 배열에서 다른 배열로의 복사도 가능하다.
// java.lang.System 클래스에 정의
// arr1의 idx 0부터 4개의 값을 arr2의 idx 3에 복사
System.arraycopy(arr1, 0, arr2, 3, 4)
main 메소드의 선언 시에 매개변수로 String[]
을 받았다.
이는 지금까지 공부했듯이, String 인스턴스로 이루어진 배열을 매개변수로 받는다는 뜻이다.
실제로 명령 프롬프트에서 자바 파일을 실행할 때 확인해 볼 수 있다.
class Simple {
public static void main(String[] args) {
for(int i=0; i<args.length; i++)
System.out.println(args[i]);
}
}
배열을 사용하는 데에 반복문이 매우 빈번하게 사용된다. 그러나 지금까지 우리가 사용해온 for문을 사용하면 매번 사용하기 귀찮기 때문에 배열을 위한 새로운 반복문을 만들었다.
int[] arr = {1, 2, 3, 4, 5}
// 기존의 for문
for(int i=0; i<arr.length; i++) {
System.out.println(arr[i]);
}
// for-each문
for(int e : arr) {
System.out.println(e);
}
이렇게 작성하게 되면 코드의 양이 줄고 배열의 길이와 요소에 신경 쓸 필요 없다.
대신에 for-each문 안의 자료형은 배열 요소의 자료형과 일치시켜야 한다.
우리가 주로 다루는 배열은 1차원이고 가끔 2차원과 아주 가끔 3차원을 다루게 될 것이다.
2차원 배열은 독립된 1차원 배열의 모임이기 때문에 위와 같이 모든 배열의 길이가 같을 필요가 없다.
또한, 배열 역시 인스턴스임을 잊지 말자.