얕은 복사와 깊은 복사
class Book {
private String name; // 책 이름
private Author author; // 저자
public Book(String name, Author author) {
this.name = name;
this.author = author;
}
public Book shallowCopy() { // 얕은 복사
return new Book(this.name, this.author);
}
public Book deepCopy() { // 깊은 복사
Author copiedAuthor = new Author(this.author.getName());
return new Book(this.name, copiedAuthor);
}
public void changeAuthor(String name) { // 저자 이름 변경
author.setName(name);
}
@Override
public String toString() {
return "Book name : " + name + ", " + author;
}
static class Author {
private String name; // 저자 이름
public Author(String name) {
this.name = name;
}
public String getName() { // 저자 이름 반환
return name;
}
public void setName(String name) { // 저자 이름 변경
this.name = name;
}
@Override
public String toString() {
return "Author : " + name;
}
}
public static void main(String[] args) {
Author author1 = new Author("조슈아 블로크");
Book book1 = new Book("이펙티브 자바", author1);
// 얕은 복사 후 변경
Book shallowCopyBook = book1.shallowCopy();
shallowCopyBook.changeAuthor("Joshua Bloch");
// 얕은 복사 결과 출력
System.out.println("After shallow copy and change:");
System.out.println("Original book1: " + book1);
System.out.println("Shallow copied book: " + shallowCopyBook);
Author author2 = new Author("마틴 파울러");
Book book2 = new Book("리팩터링", author2);
// 깊은 복사 후 변경
Book deepCopyBook = book2.deepCopy();
deepCopyBook.changeAuthor("Martin Fowler");
// 깊은 복사 결과 출력
System.out.println("After deep copy and change:");
System.out.println("Original book2: " + book2);
System.out.println("Deep copied book: " + deepCopyBook);
}
}
After shallow copy and change:
Original book1: Book name : 이펙티브 자바, Author : Joshua Bloch
Shallow copied book: Book name : 이펙티브 자바, Author : Joshua Bloch
After deep copy and change:
Original book2: Book name : 리팩터링, Author : 마틴 파울러
Deep copied book: Book name : 리팩터링, Author : Martin Fowler