이번에는 배열에 대해서 알아보겠습니다.
배열은 같은 타입의 변수를 여러 개 저장할 때 사용합니다. 예를 들면 같은 반 학생들의 학번을 저장한다고 했을 때 배열을 사용하지 않으면 하나하나 학생 수만큼 선언해야 하는 방면, 배열을 사용하면 인원수만큼 선언이 가능합니다.
그럼 배열의 정의부터 시작하겠습니다.
배열이란 타입이 같은 둘 이상의 데이터를 저장할 수 있는 1차원 구조의 메모리공간을 뜻합니다.
배열을 사용하려면 선언을 먼저 해야 합니다.
int[] arr1 = new int[5]; int arr2[] = new int[5];
위와 같이 []의 순서를 바꾸는 방법으로 다르게 선언이 가능합니다.
자바에서는 첫 번째 방법으로 주로 선언을 합니다. 이유는 실제 협업으로 코딩을 하게되면 여러명에서 코딩을 하기때문에 각자의 방식으로 코딩을 하게됩니다. 하지만 코드의 통일성을 주기위해서 첫 번째 방법으로 주로 코드를 구성합니다.
배열은 참조변수로 Stack영역에 할당이 되어 배열공간의 주소를 저장합니다.
배열 공간의 주소를 이용해 인덱스를 참조하는 방식으로 값을 처리합니다.

배열에 값을 저장할 때는 선언과 동시에 값을 초기화 시켜줄수도 있고, 선언후에 따로 값을 초기화하는 방법도 있습니다.
int arr1[] = {1, 2, 3, 4, 5}; int arr2[] = new int[] {1, 2, 3, 4, 5}; int arr3[]; arr3[0] = 1; arr3[1] = 2; arr3[2] = 3; arr3[3] = 4; arr3[4] = 5;
배열에 값을 초기화했으면 읽는 방법도 알아야합니다. 배열에 값을 초기화한 후에 배열을 불러오면 배열은 참조변수이기 때문에 주소값을 표시하게 됩니다. 따라서 배열의 값을 불러오기 위해서는 배열이름 뒤에 인덱스값을 붙여줌으로써 값을 불러올수 있습니다.
int arr[] = {1, 2, 3, 4, 5}; for(int i = 0; i < arr.length; i++) { System.out.printf("%d "arr[i]); // 1 2 3 4 5 } System.out.println(arr);
위와 같이 정수배열을 선언하고 출력하는 코드를 작성하면 배열에 들어가있는 순서대로 출력됩니다.
하지만 코드의 맨아래 문장과 같이 배열을 그대로 출력하면 arr이라는 배열이 가리키고있는 주소값이 출력됩니다.
배열을 복사하는 방법에는 두가지가 있습니다. 바로 얕은 복사와 깊은 복사입니다.
얕은 복사는 객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는것 입니다.

int arr1[] = {1, 2, 3, 4}; int arr2[] = arr1; arr2[0] = 5; for(int i = 0; i < arr2.length; i++) { System.out.printf("%d "arr2[i]); // 5 2 3 4 }
얕은 복사를 코드로 표현한다면 위와같습니다. 얕은 복사는 위의 그림과 같이 '주소값'을 복사하는 것이기 때문에 arr2의 값을 다른값으로 초기화 한다면 arr1의 값도 변경됩니다.
깊은 복사는 새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것입니다.

//방법1 int arr1[] = {1, 2, 3, 4}; int arr2[] = new int[4]; for(int i = 0; i < arr2.length; i++) { arr2[i] = arr1[i]; System.out.printf("%d ", arr2[i]); } //방법2 System.arraycopy(arr1, 0, arr2, 0, arr1.length); //방법3 arr2 = Arrays.copyOf(arr1, arr1.length); //방법4 arr2 = arr1.clone();
위와 같이 깊은복사는 여러가지 방법이 있습니다. 방법은 많지만 원리는 새로운 배열을 선언하여 새로운 주소값을 부여하고 값을 따로 복사하게 되면, 값은 동일하지만 주소값이 달라 전혀다른 배열이됩니다.