선릉역 1번 출구
4. 얕은 복사 vs 깊은 복사 본문
객체 배열 = 요소가 되는 객체의 주소가 들어갈(4바이트, 8바이트) 메모리만 할당되고(null) 각 요소 객체는 생성하여 저장해야 함
얕은 복사
- 주소만 복사해서 같은 객체를 가리키는 경우 사용
- System.arrayCopy(src, srcPos, dest, destPos, length) 로 사용하면 됨
깊은 복사
- 두 개의 배열이 다른 객체를 사용하는 경우 사용
얕은 복사 예시
public static void main (String[] args) {
Book[] library = new Book[5]; //선언 시에 객체의 주소가 들어갈(4바이트, 8바이트) 메모리만 할당됨(null)
Book[] copyLibaray = new Book[5]; //선언 시에 객체의 주소가 들어갈(4바이트, 8바이트) 메모리만 할당됨(null)
library[0] = new Book("태백산맥1", "조정래"); //library는 null에서 힙을 가리키는 주소가 들어감
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
System.arraycopy(library, 0, copyLibaray, 0, 5); //copyLibrary의 각 인덱스는 library가 가리키는 heap 주소가 들어감(얕은복사)
System.out.println("======library=========");
for( Book book : library) {
System.out.println(book);
}
System.out.println("======copy library=========");
for( Book book : copyLibaray) {
System.out.println(book);
}
}
- Library와 copyLibrary의 값 출력 시 동일한 주소가 출력됨(얕은 복사)
깊은 복사 예시
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].setAuthor(library[i].getAuthor());
copyLibrary[i].setTitle(library[i].getTitle());
} // copyLibrary가 가리키는 멤버 변수에 복사(깊은 복사)
System.out.println("======library=========");
for( Book book : library) {
book.showBookInfo();
}
System.out.println("======copy library=========");
for( Book book : copyLibrary) {
book.showBookInfo();
}
System.out.println("======library=========");
for( Book book : library) {
System.out.println(book);
}
System.out.println("======copy library=========");
for( Book book : copyLibrary) {
System.out.println(book);
}
}
- 서로 값은 동일하지만, 각 변수가 가리키는 힙 메모리는 다른 것을 확인할 수 있음
'Language > Java' 카테고리의 다른 글
6. 자바의 특징 (0) | 2023.11.23 |
---|---|
5. 배열의 정규화 (0) | 2023.11.21 |
3. 싱글톤 패턴(singleton pattern) (0) | 2023.11.21 |
2. 헷갈리는 문법 정리 (0) | 2023.11.21 |
1. 개발 환경 셋팅하기 (0) | 2023.11.17 |
Comments