깊은 복사와 얕은 복사를 알아보기 전에 우선 객체 배열에 대해 알아본다
목차
1. 객체 배열
2. 깊은 복사와 얕은 복사
1. 객체 배열
int[] num=new int[10] 하듯이 객체도 배열을 만들 수 있다.
책 객체 배열을 만들어보자.
Book[] library =new Book[5]이런식으로 만들 수 있다
그렇다면 이렇게 공간을 만들면 Book 인스턴스 5개가 만들어진걸까?
아니다.
아래 예제를 보자.
출력결과가 어떻게 될까
package array;
class Book{
private String bookTitle;
private String author;
public Book() {}
}
public class BookArray {
public static void main(String[] args) {
Book[] library=new Book[5];
for(int i=0;i<library.length;i++) {
System.out.println(library[i]);
}
}
}
아래와 같이 null이 출력되는데 이는 인스턴스가 생성된 것이 아니라 인스턴스 주소가 담길 공간이 5개 생성된 것이다.
아래와 같이 따로 인스턴스를 또 만들어줘야한다
package array;
class Book{
private String bookTitle;
private String author;
public Book() {}
public Book(String bookTitle,String author) {
this.bookTitle=bookTitle;
this.author=author;
}
}
public class BookArray {
public static void main(String[] args) {
Book[] library=new Book[5];
library[0]=new Book("책제목0","홍길일");
library[1]=new Book("책제목1","홍길이");
library[2]=new Book("책제목2","홍길삼");
library[3]=new Book("책제목3","홍길사");
library[4]=new Book("책제목4","홍길오");
}
}
자 이제 본론으로 간다.
2. 깊은 복사와 얕은 복사
일단 한 줄 요약하면
얕은 복사는 인스턴스의 주소가 복사되는 것이고
깊은 복사는 인스턴스의 값이 복사되는 것이다
1) 얕은 복사(shallow copy)
아래와 같이 arraycopy메서드를 이용해서 library 배열에 있는 객체 배열을 library1 배열에 복사를 했다.
그런데 아까 객체 배열은 인스턴스 값을 따로 또 생성해줘야하는데 아래 예제에는 인스턴스 값을 따로 생성해주지 않았는데 library1 배열에 똑같이 값이 복사되었다.
어떻게 가능한 것일까?
이 경우는 바로 객체의 값이 아니라 주소 값이 복사되었기 때문이다.
주소가 동일하므로 값이 똑같이 출력되는 것이다.
그러면 배열을 복사해서 다른 배열로 사용하고 싶으면 어떻게 해야할까?
바로 깊은 복사를 사용하면 된다
package array;
class Book{
private String bookTitle;
private String author;
public Book() {}
public Book(String bookTitle,String author) {
this.bookTitle=bookTitle;
this.author=author;
}
public void showInfo() {
System.out.println(bookTitle+", "+author);
}
}
public class BookArray {
public static void main(String[] args) {
Book[] library=new Book[5];
Book[] library1=new Book[5];
library[0]=new Book("책제목0","홍길일");
library[1]=new Book("책제목1","홍길이");
library[2]=new Book("책제목2","홍길삼");
library[3]=new Book("책제목3","홍길사");
library[4]=new Book("책제목4","홍길오");
System.arraycopy(library, 0, library1, 0, 5);
for(int i=0;i<library.length;i++) {
library1[i].showInfo();
}
}
}
2) 깊은 복사
반복문을 사용하든 System.arraycopy()메서드를 사용하든 객체 배열을 복사하면 항상 인스턴스 주소가 복사되므로 따로 관리 하고 싶다면 깊은 복사를 사용해야한다
아래 예문을 보자
package array;
class Book{
private String bookTitle;
private String author;
public Book() {}
public Book(String bookTitle,String author) {
this.bookTitle=bookTitle;
this.author=author;
}
public String getBookTitle() {
return bookTitle;
}
public void setBookTitle(String bookTitle) {
this.bookTitle = bookTitle;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public void showInfo() {
System.out.println(bookTitle+", "+author);
}
}
public class BookArray {
public static void main(String[] args) {
Book[] library=new Book[2];
Book[] library1=new Book[2];
library[0]=new Book("책제목0","홍길일");
library[1]=new Book("책제목1","홍길이");
library1[0]=new Book();
library1[1]=new Book();
for(int i=0;i<library.length;i++) {
library1[i].setBookTitle(library[i].getBookTitle());
library1[i].setAuthor(library[i].getAuthor());
}
library[0].setBookTitle("책제목3");
for(int i=0;i<library.length;i++) {
library[i].showInfo();
}
System.out.println("---------");
for(int i=0;i<library.length;i++) {
library1[i].showInfo();
}
}
}
아래와 같이 결과값이 분리되는 것을 볼 수 있다
출처 : Do it! 자바 프로그래밍 입문-박은종
'Java' 카테고리의 다른 글
[Java] 굳이 private 멤버변수로 선언한 후 메서드로 접근하는 이유 (0) | 2023.05.14 |
---|---|
[Java] 이클립스 콘솔창 한글깨짐 현상 해결방법 (0) | 2023.04.05 |