자바의 배열은 참조자료형이다. 자바는 클래스와 배열 등 모두 동적 할당 하기 때문이다. 따라서 배열을 사용하기 위해서는 참조변수 선언 후 배열 객체를 동적으로 생성해 할당해 주는 과정이 필요하다.
배열 선언으로 실제 배열 객체가 생성되지는 않고 단지 참조변수만 생성된다. 참조변수 선언시에는 크기를 지정하지 않고도 선언 가능하다.
int[] list;
int array[];
이렇게 선언된 참조변수에 new 연산자를 통해 VM이 메모리의 주소를 계산하는데 필요한 정보를 저장한다. 이때, 참조변수에는 id 형태로 참조 id가 저장되는 것이지 메모리가 저장되는 것이 아니다.
list = new int[5]; // 5 대신 size와 같이 가변 길이로 선언도 가능
배열의 요소를 선택할 때는 C언어에서처럼 첨자를 사용하여 접근하면 된다.
list[0] = 90;
이렇게 초기화된 배열을 그림으로 표현해보면 아래와 같다.
초기화를 하는 또 다른 방법으로는 중괄호를 이용할 수 있다.
// 두 가지 모두 가능
int[] list = {10, 20, 30, 40, 50};
int[] arr = new int[]{10, 20, 30, 40, 50};
만약 이렇게 생성과 동시에 초기화를 하지 않는 경우 반복문을 통해 각 요소에 직접 할당해 줘야 한다.
객체 배열 생성시에는 new 연산자를 통해 배열을 동적 할당하는 것은 기본 자료형의 배열 선언과 동일하다. 다른 점은 각 요소에 필요한 객체를 동적 할당을 해줘야 한다는 점이다.
아래는 직접 정의한 Circle 클래스를 객체 배열로 선언하는 예제이다.
Circle[] circles;
circles = new Circle[3];
circles[0] = new Circle(1);
circles[1] = new Circle(10);
circles[2] = new Circle();
아래는 그림으로 나타낸 것이다.
다음 예제는 String 객체 배열의 선언이다. String은 기본 자료형이 아닌 클래스이기 때문이다.
String[] arr;
arr = new String[3];
arr[0] = "Java" // new String("Java")와 동일
arr[1] = "Array" // new String("Array")와 동일
arr[2] = "Test" // new String("Test")와 동일
아래는 위 코드를 그림으로 나타낸 것이다.
String의 특징으로는 한번 할당한 문자열의 수정이 불가능하기 때문에 재할당을 통해 값을 바꿔주는 것이다.
자바에서는 배열의 요소를 참조하기 위해 for-each
반복문을 제공한다. 사용법은 아래와 같다.
String[] arr = {"홍길동", "일지매", "이지매"};
for(String s : arr)
System.out,println(s);
int[][] test1;
test1 = new int[2][3];
2차원 배열은 행과 열로 이해하는 방법도 있지만 각 행은 각 열을 참조하는 형태이기 때문에 행을 그룹으로 생각하는 것이 훨씬 직관적이다.
위 그림은 test1[0]과 test[1] 이라는 두 그룹이 있고, 각 열에 대한 참조값이 그룹에 저장되는 형태이다.
int[][] test2;
test2 = new int[2][];
test2[0] = new int[2];
test2[1] = new int[4];
String[][] test3;
test3 = new String[2][];
test3[0] = new String[2];
test3[1] = new String[3];
test3[0][0] = new String("hi");
test3[0][1] = new String("bye");
test3[1][0] = new String("a");
test3[1][1] = new String("b");
test3[1][2] = new String("c");
int[][] array = { {1, 3, 5}, {2, 4, 6} };
for(int i = 0; i < array.length; i++) {
for(int j = 0; j < array[i].length; j++) {
System.out.println(array[i][j]);
}
}
첫번째 for문을 통해 각 그룹에 접근하고, 두번째 for문을 통해 각 그룹에 대한 열에 접근하는 형태이다.
출처
명품 JAVA programming - 황기태, 김효수
https://www.youtube.com/사람만이