Java(21) - 객체 배열
이전 포스트에서는 기본 자료형 배열에 대해 공부했습니다.
이번 포스테에서는 참조 자료형 배열에 대해 공부하겠습니다.
1. 참조 자료형 배열(객체 배열)
-
기본 자료형 배열 int[] arr = new int[10]
-
참조 자료형 배열(객체 배열) Book[] library = new Book[5]
참조 자료형 배열의 경우 data type을 참조 자료형으로 해주시고 기본 자료형 배열과 똑같이 해주시면 됩니다.
단 주의할 점이 있는데,
참조 자료형 배열에는 값 자체가 들어가는 것이 아닌, 생성할 객체의 주소가 들어갑니다.
그리고 객체 배열을 선언했다고 해서 객체들이 생성되는 것이 아닙니다.
Book book1 = new Book();
이런 식으로 인스턴스를 각각 생성한 후 배열에 대입해줘야합니다.
참조 자료형 배열은 초기화를 안해주면, 기본 자료형 배열과 달리 null로 초기화됩니다.
2. 배열 복사
한 array에서 다른 array로 배열을 복사할 때는
System.arraycopy(src, src position, destination, desPos, length);
을 이용하면 됩니다.
인자는 왼쪽부터 순서대로
- 복사할 배열(source)
- 복사할 배열의 몇번째 부터 인지 (source position)
- 복사될 배열(destination)
- 복사될 배열의 시작 위치(destination position)
- 복사할 배열의 시작 위치부터 몇개인지(length)
System.arraycopy(arr, 0, copyArr, 1, 3);
위 코드의 의미는 arr 배열의 0번째 인덱스부터 3개의 인덱스에 있는 값을,
copyArr배열에 1번째 인덱스부터 복사한다는 의미입니다.
3. 객체 배열 복사
기본 자료형 배열의 경우 System.arraycopy를 사용해도 큰 문제가 없습니다.
그러나 객체 배열의 경우 값 자체를 저장하는 것이 아닌 주소를 저장하기 때문에 문제가 생깁니다.
-
얕은 복사
System.arraycopy를 객체 배열에 사용했을 경우 얕은 복사가 일어납니다.
얕은 복사란 실제로 인스턴스가 생성돼서 복사가 되는 것이 아닌, 주소만 복사하는 것입니다.
즉 객체 배열들이 같은 인스턴스를 가리키는 것을 의미합니다. -
깊은 복사
깊은 복사는 얕은 복사와 달리 서로 다른 인스턴스를 생성해 각각 배열에 넣어주는 방법입니다.
-
예시
얕은 복사
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", "조정래"); System.arraycopy(library, 0, copyLibrary, 0, 5); library[0].setTitle("나목"); library[0].setAuthor("박완서"); for(Book book : library) { book.showBookInfo(); } System.out.println("============"); for(Book book : copyLibrary) { book.showBookInfo(); } } }
깊은 복사
public class ObjectCopy2 { 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", "조정래"); copyLibrary[0] = new Book(); copyLibrary[1] = new Book(); copyLibrary[2] = new Book(); copyLibrary[3] = new Book(); copyLibrary[4] = new Book(); for(int i = 0; i<library.length;i++) { copyLibrary[i].setTitle(library[i].getTitle()); copyLibrary[i].setAuthor(library[i].getAuthor()); } library[0].setTitle("나목"); library[0].setAuthor("박완서"); for(Book book : library) { book.showBookInfo(); } System.out.println("============"); for(Book book : copyLibrary) { book.showBookInfo(); } } }
4. 향상된 for문
for-each문이라고도 하는 향상된 for문(enhanced for)은
배열 요소의 처음부터 끝까지 모든 요소를 참조할 때 편리한 for문 입니다.
for(int e : arr){
System.out.println(e + " ");
}
위의 코드를 보시면 arr은 반복의 대상이 되는 배열입니다.
배열의 모든 요소 각각을 e라 할 때 e가 의미하는 각각의 요소 값을 출력하라는 코드입니다.
즉 향상된 for문은 arr 배열에 있는 요소들을 하나하나 꺼내올 때 마다 변수 e에 넣으면서
arr의 전체를 다 돌 때까지 반복문을 실행합니다.
댓글남기기