Java/Java 올인원 패키지
11. 객체 배열, 다차원 배열 (Java)
GrapeMilk
2020. 3. 15. 23:38
Goal
- 기본자료형 배열과 객체 배열에 대해 알아본다
- 배열을 복사하는 방법에 대해 알아본다.
- 2차원 배열에 대해 알아본다.
1. 기본자료형 배열과 객체 배열
- 기본자료형 배열은 배열안에 실제 값을 갖는다.
- 객체 배열은 배열안에 실제 값을 가르키는 주소값을 갖는다. 실제 값은 heap 메모리 영역에 존재한다.
2. 기본자료형 배열의 복사
- System.arraycopy(복사대상 배열, 복사시작인덱스, 복사 배열, 복사 배열의 바뀌는 값의 시작 인덱스, 끝 인덱스) 메서드를 사용하여 만든다.
public class ArrayCopy {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30, 40};
int[] arr2 = {1, 2, 3, 4, 5};
System.arraycopy(arr1, 0, arr2, 1, 3);
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}
3. 객체 배열의 복사
- 객체 배열의 복사에는, 객체를 통해 생성된 인스턴스가 heap메모리 영역에 저장되는 특성으로 인해, 얕은 복사와 깊은 복사의 2가지 개념이 존재한다.
3-1 얕은복사
- 한 객체 배열에서 주소값을 복사한 새로운 객체 배열을 만든다.
- 두 객체 배열의 element의 주소값이 같기 때문에, 복사한 객체배열의 element 값을 바꾸면, 복사 대상의 객체배열의 element 값도 바뀐다.
- System.arraycopy 메서드를 사용하여 만든다.
사진 1) 얕은 복사 메커니즘
- 두 객체배열의 element가 가르키는 객체가 같기 때문에, 주소값이 같다.
예제 1) 얕은 복사 코드 구현
public class ObjectCopy {
public static void main(String[] args) {
Book[] library = new Book[5];
Book[] copylibrary = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
//arraycopy 메서드를 이용한 얕은 복사.
System.arraycopy(library, 0, copylibrary, 0, 5);
//향상된 for 문
for (Book book : copylibrary) {
book.showBookInfo();
}
library[0].setBookName("나목"); //library[0] 값을 바꾸면, copylibrary값도 바뀌는 것을 알 수 있다.
library[0].setAuthor("박완서");
for (Book book : library) {
book.showBookInfo();
}
System.out.println("===============");
for (Book book : copylibrary) {
book.showBookInfo();
}
}
}
3-2 깊은복사
- 복사 대상 객체 배열의 값을 하나하나 복사하여, 해당 배열과 같은 값을 갖고 주소값이 다른 새로운 배열을 만든다.
- 새로운 인스턴스를 만들어주기 때문에, 기존 복사 객체 배열과 주소값이 다르다.
Book[] library = new Book[5];
Book[] copylibrary = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
copylibrary[0] = new Book(); //새로운 인스턴스를 생성했기 때문에, 주소값이 다르다.
copylibrary[1] = new Book();
copylibrary[2] = new Book();
copylibrary[3] = new Book();
copylibrary[4] = new Book();
//향상된 for 문
for (int i = 0; i < library.length; i++) {
copylibrary[i].setBookName(library[i].getBookName());
copylibrary[i].setAuthor(library[i].getAuthor());
}
4. 2차원 배열
예제 2) 2차원 배열 코드 구현
public class TowDimension {
public static void main(String[] args) {
//2차원 배열 생성과 동시에 초기화
int[][] arr = { {1, 2, 3}, {4, 5, 6, 7}};
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();
}
}
}