선릉역 1번 출구

4. 얕은 복사 vs 깊은 복사 본문

Language/Java

4. 얕은 복사 vs 깊은 복사

choideu 2023. 11. 21. 17:28

객체 배열 = 요소가 되는 객체의 주소가 들어갈(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