๋งค์ผ๋ฉ์ผ ๋ฐฑ์๋ ์ง๋ฌธ์ ์ฐธ๊ณ ํด ๊ฐ์ธ์ ์ผ๋ก ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค.
์ค๋ฅ๊ฐ ์๋ค๋ฉด ์ธ์ ๋ ํผ๋๋ฐฑ ์ฃผ์๋ฉด ๋ฐ๋ก ๋ฐ์ํ๊ฒ ์ต๋๋ค..!
์์ํ๊ธฐ ์ ์
๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์๋ ๋ํ์ ์ผ๋ก ์์ ๋ณต์ฌ(Shallow Copy)์ ๊น์ ๋ณต์ฌ(Deep Copy)๊ฐ ์์
๋์ ๋ฐฉ์๊ณผ ๋ณต์ฌ ๋ฒ์์ ๋ฐ๋ผ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๊ฐ ์์ ํ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ ๋ฐฉ์์ ์ฐจ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํจ
๋งค์ผ๋ฉ์ผ์์ ์ ๊ณตํด์ค Book๊ณผ Author๋ผ๋ ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์์ ๋ฅผ ์ดํด๋ณด๋ฉด ์ดํด๊ฐ ์ฌ์
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);
}
}
์์ ๋ณต์ฌ(Shallow Copy)๋?
์์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ํ๋ ๊ฐ๋ง ๋ณต์ฌํ๊ณ , ๋ง์ฝ ๊ทธ ํ๋๊ฐ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด ์ฐธ์กฐ ์ฃผ์๋ง ๋ณต์ฌํจ
=> ๊ป๋ฐ๊ธฐ๋ง ์๋ก ๋ง๋ค๊ณ , ๋ด๋ถ๋ ๊ณต์ ํจ
Author author1 = new Author("์กฐ์์ ๋ธ๋กํฌ");
Book book1 = new Book("์ดํํฐ๋ธ ์๋ฐ", author1);
Book shallowCopyBook = book1.shallowCopy(); // ์์ ๋ณต์ฌ
shallowCopyBook.changeAuthor("Joshua Bloch");
์ด ๊ฒฐ๊ณผ ๊ฐ์ ์ดํด๋ณด๋ฉด
After shallow copy and change:
Original book1: Book name : ์ดํํฐ๋ธ ์๋ฐ, Author : Joshua Bloch
Shallow copied book: Book name : ์ดํํฐ๋ธ ์๋ฐ, Author : Joshua Bloch
shallowCopyBook์ ์ ์ ์ด๋ฆ์ ๋ฐ๊พธ์, book1์ ์ ์๋ ํจ๊ป ๋ฐ๋ ๊ฒ์ ๋ณผ ์ ์์
=> Book ๊ฐ์ฒด๋ ์๋ก ์์ฑ๋์ง๋ง ๋ด๋ถ์ Author ๊ฐ์ฒด๋ ๋์ผํ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์
์ฆ, ๊ฐ์ฒด์ ์ต์์ ๋ ๋ฒจ๋ง ์๋ก ์์ฑํ๊ณ , ๋ด๋ถ์ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๋ ๊ฐ์ ์ฃผ์๋ฅผ ๊ณต์
(book1.author == shallowCopyBook.author ๋ true)
๊น์ ๋ณต์ฌ(Deep Copy)๋?
๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด ์ ์ฒด๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ณต์ฌํด์, ๋ด๋ถ์ ์๋ ๊ฐ์ฒด๋ค๋ ์ ๋ถ ์๋กญ๊ฒ ์์ฑํจ
=> ๋ณต์ฌ๋ณธ๊ณผ ์๋ณธ์ด ์์ ํ ๋
๋ฆฝ์ ์
Author author2 = new Author("๋งํด ํ์ธ๋ฌ");
Book book2 = new Book("๋ฆฌํฉํฐ๋ง", author2);
Book deepCopyBook = book2.deepCopy(); // ๊น์ ๋ณต์ฌ
deepCopyBook.changeAuthor("Martin Fowler");
์ด ๊ฒฐ๊ณผ ๊ฐ์ ์ดํด๋ณด๋ฉด
After deep copy and change:
Original book2: Book name : ๋ฆฌํฉํฐ๋ง, Author : ๋งํด ํ์ธ๋ฌ
Deep copied book: Book name : ๋ฆฌํฉํฐ๋ง, Author : Martin Fowler
deepCopyBook์ ์ ์ ์ด๋ฆ์ ๋ฐ๊พธ์ด๋ book2์ ์ ์๋ ๊ทธ๋๋ก ์ ์ง๋๋ ๊ฒ์ ๋ณผ ์ ์์
=> Book ๊ฐ์ฒด๋, ๋ด๋ถ์ Author ๊ฐ์ฒด๋ ๋ชจ๋ ์๋ก ์์ฑ๋์๊ธฐ ๋๋ฌธ
์ฆ, ๊ฐ์ฒด๋ฟ ์๋๋ผ ๊ทธ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๋ด๋ถ ๊ฐ์ฒด๊น์ง ๋ชจ๋ ์๋ก ๋ณต์ฌ
(book2.author == deepCopyBook.author ๋ false)
์ ๋ฆฌ
| ๊ตฌ๋ถ | ์์ ๋ณต์ฌ (Shallow Copy) | ๊น์ ๋ณต์ฌ (Deep Copy) |
| ๊ฐ์ฒด ์์ฑ | ์ต์์ ๊ฐ์ฒด๋ง ์๋ก ์์ฑ | ํ์ ์ฐธ์กฐ ๊ฐ์ฒด๊น์ง ๋ชจ๋ ์์ฑ |
| ๋ด๋ถ ๊ฐ์ฒด | ๊ธฐ์กด ๊ฐ์ฒด ์ฐธ์กฐ ๊ณต์ | ๋ด๋ถ ๊ฐ์ฒด๊น์ง ์ ์ธ์คํด์ค |
| ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ | ์ ์ | ๋ง์ |
| ๋ณ๊ฒฝ ์ํฅ | ์๋ณธ๊ณผ ๋ณต์ฌ๋ณธ์ด ์๋ก ์ํฅ์ ์ค | ์๋ณธ๊ณผ ๋ณต์ฌ๋ณธ์ด ๋ ๋ฆฝ์ |
| ์ฌ์ฉ ์์ | ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ์๋ ์ฐธ์กฐ, ์ฑ๋ฅ ์ฐ์ ์ | ๊ฐ์ฒด ๋ ๋ฆฝ์ฑ ๋ณด์ฅ์ด ํ์ํ ๋ |
Object.clone()์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ๋ณต์ฌ๋ ๋๋ถ๋ถ ์์ ๋ณต์ฌ์ด๊ธฐ ๋๋ฌธ์ ๊น์ ๋ณต์ฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ํด๋์ค๋ง๋ค ์ง์ deep copy ๋ก์ง์ ๊ตฌํํด์ผํจ
'๐ป CS > ๋งค์ผ๋ฉ์ผ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋์ผ์ฑ๊ณผ ๋๋ฑ์ฑ : == ์ equals() (3) | 2025.08.08 |
|---|---|
| ํฐ์บฃ(Tomcat)์ด๋? (5) | 2025.08.05 |
| RAID(Reduntant Array of Independent Disks) ๊ธฐ์ ์ด๋? (0) | 2025.07.07 |
| ๋ ์ด์ด๋ ์ํคํ ์ฒ(Layered Architecture)๋? (0) | 2025.07.05 |
| ์ฑ๊ธํด ํจํด(Singleton Pattern)์ด๋? (0) | 2025.07.02 |