์ถ์ฒ
ChatGPT
์์ ๋ณต์ฌ Shallow Copy
์ ์
์์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ์ต์์ ๋ ๋ฒจ์์๋ง ๋ณต์ฌ ์์ ์ ์ํํ๋ค. ์ฆ, ๊ฐ์ฒด ์์ฒด๋ ์๋ก ์์ฑ๋์ง๋ง, ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ๋ณต์ฌํ์ง ์๊ณ ์๋ณธ ๊ฐ์ฒด์ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ค. -> ์ฐธ์กฐ๋ง ๋ณต์ฌ๋๋ค. ๋ณต์ฌ๋ณธ์ ์์ ํ๋ฉด ์๋ณธ๋ ์์ ๋๋ค.
๋ฐฉ๋ฒ
์๋ฐ์์๋ Object ํด๋์ค์ clone() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ณต์ฌ๋ฅผ ์ํํ ์ ์๋ค. clone() ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฒด์ ํ๋ ๊ฐ์ ๋ณต์ฌํ์ง๋ง, ์ฐธ์กฐ ํ์ ์ ํ๋๋ ์ฐธ์กฐ๋ง ๋ณต์ฌํ๋ฏ๋ก ์ค์ ๊ฐ์ฒด๋ ๋ณต์ฌํ์ง ์๋๋ค.
์์
class Address {
private String city;
private String street;
public Address(String city, String street) {
this.city = city;
this.street = street;
}
// Getters and Setters
}
class Person implements Cloneable {
private String name;
private int age;
private Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // ์์ ๋ณต์ฌ
}
// Getters and Setters
}
์ฌ์ฉ ์
์์ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋จํ ๋ณต์ฌํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ฒด์ ์ต์์ ๋ ๋ฒจ๋ง ๋ณต์ฌํ๊ณ ๋ด๋ถ์ ๊ฐ์ฒด๋ค์ ๊ณต์ ํด๋ ์๊ด์๋ ๊ฒฝ์ฐ์ ์ ํฉํ๋ค.
์ํฉ
- Configuration ๊ฐ์ฒด ๋ณต์ฌ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ (configuration) ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ ์์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด ์ค์ ๊ฐ์ฒด๋ ๋ค์ํ ์ค์ ๊ฐ์ ํฌํจํ๋ฉฐ, ๋ณต์ฌ๋ ์ค์ ๊ฐ์ฒด๋ ์๋ณธ๊ณผ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ฐ๋ ์์ฑ์ ๊ฐ์ง ์ ์๋ค. ์ค์ ๊ฐ์ ๊ณต์ ํด๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ์ ์์ ๋ณต์ฌ๊ฐ ์ ํฉ๋ค.
์์์ฝ๋
class Configuration implements Cloneable {
private String name;
private Map<String, String> settings;
public Configuration(String name, Map<String, String> settings) {
this.name = name;
this.settings = settings;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // ์์ ๋ณต์ฌ
}
// Getters and Setters
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Map<String, String> settings = new HashMap<>();
settings.put("theme", "dark");
Configuration original = new Configuration("appConfig", settings);
Configuration copy = (Configuration) original.clone();
// Both original and copy share the same settings map
copy.getSettings().put("language", "en");
System.out.println(original.getSettings()); // Output: {theme=dark, language=en}
System.out.println(copy.getSettings()); // Output: {theme=dark, language=en}
}
}
์ค๋ช
- Configuration ๊ฐ์ฒด๋ฅผ ์์ ๋ณต์ฌํ๋ฉด, settings ๋งต์ ์๋ณธ๊ณผ ๋ณต์ฌ๋ณธ์ด ๋์ผํ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํ๋ค. ๋ฐ๋ผ์ copy์์ settings๋ฅผ ์์ ํ๋ฉด original์์๋ ๊ฐ์ ๋ณ๊ฒฝ์ด ๋ํ๋๋ค. ์ด ๊ฒฝ์ฐ, ์ค์ ๊ฐ์ ๊ณต์ ํด๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊น์ ๋ณต์ฌ Deep Copy
์ ์
๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ณต์ฌํ๋ค. ๋ฐ๋ผ์ ์๋ณธ ๊ฐ์ฒด์ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ ์์ ํ ๋ ๋ฆฝ์ ์ธ ์ํ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ค๋ ๋ชจ๋ ์๋ก ์์ฑ๋๋ค.-> ๋ณต์ฌ๋ณธ์ ์์ ํด๋ ์๋ณธ์ ์ํฅ ๋ฐ์ง ์๋๋ค.
๋ฐฉ๋ฒ
- ๊น์ ๋ณต์ฌ๋ฅผ ๊ตฌํํ๋ ค๋ฉด clone() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์ฐธ์กฐ ํ์ ์ ํ๋๊น์ง ๋ณต์ฌํด์ผ ํ๋ค. ๋๋ ๊ฐ์ฒด์ ๋ณต์ฌ ์์ฑ์(constructor) ๋๋ ๋ณต์ฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์์
class Address implements Cloneable {
private String city;
private String street;
public Address(String city, String street) {
this.city = city;
this.street = street;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // Address ๊ฐ์ฒด์ ์์ ๋ณต์ฌ
}
// Getters and Setters
}
class Person implements Cloneable {
private String name;
private int age;
private Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
cloned.address = (Address) address.clone(); // Address ๊ฐ์ฒด์ ๊น์ ๋ณต์ฌ
return cloned;
}
// Getters and Setters
}
์ฌ์ฉ ์
๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ์ฒด๊น์ง ์์ ํ ๋ ๋ฆฝ์ ์ธ ๋ณต์ฌ๋ณธ์ ์์ฑํ ๋ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ฒด์ ์ํ๊ฐ ๋ด๋ถ ๊ฐ์ฒด์ ์ํ์ ์์กดํ๋ ๊ฒฝ์ฐ, ๋ณต์ฌ๋ ๊ฐ์ฒด๊ฐ ์๋ณธ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ก ํ ๋ ์ ์ฉํ๋ค.
์ํฉ
- ๊ฒ์ ์บ๋ฆญํฐ ๋ณต์ฌ: ๊ฒ์์์ ์บ๋ฆญํฐ๋ฅผ ๋ณต์ฌํ ๋, ๊ฐ ์บ๋ฆญํฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๊ณ ์์ ์ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ค. ์บ๋ฆญํฐ๊ฐ ์ฅ์ฐฉํ ์์ดํ ์ด๋ ์ํ ์ ๋ณด๊น์ง ์์ ํ ๋ ๋ฆฝ์ ์ผ๋ก ๋ณต์ฌํด์ผ ํ ๊ฒฝ์ฐ ๊น์ ๋ณต์ฌ๊ฐ ํ์ํ๋ค.
์์ ์ฝ๋
class Item implements Cloneable {
private String name;
public Item(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // ์์ ๋ณต์ฌ
}
// Getters and Setters
}
class Character implements Cloneable {
private String name;
private List<Item> items;
public Character(String name, List<Item> items) {
this.name = name;
this.items = items;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Character cloned = (Character) super.clone();
cloned.items = new ArrayList<>();
for (Item item : this.items) {
cloned.items.add((Item) item.clone()); // ๊น์ ๋ณต์ฌ
}
return cloned;
}
// Getters and Setters
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
List<Item> items = new ArrayList<>();
items.add(new Item("Sword"));
Character original = new Character("Hero", items);
Character copy = (Character) original.clone();
// Modify the copied character's items
copy.getItems().get(0).setName("Shield");
System.out.println(original.getItems().get(0).getName()); // Output: Sword
System.out.println(copy.getItems().get(0).getName()); // Output: Shield
}
}
์ค๋ช
- Character ๊ฐ์ฒด์ ๋ณต์ฌ๋ณธ์ ๊น์ ๋ณต์ฌํ๋ฉด, ๊ฐ ์บ๋ฆญํฐ์ items ๋ฆฌ์คํธ์ ๋ฆฌ์คํธ์ ์์ดํ ๋ค๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋ณต์ฌ๋๋ค. ๋ฐ๋ผ์ copy์์ ์์ดํ ์ ์์ ํด๋ original์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค. ์ด์ฒ๋ผ ๊ฐ์ฒด์ ์ํ๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ง๋์ด์ผ ํ ๊ฒฝ์ฐ, ๊น์ ๋ณต์ฌ๊ฐ ์ ํฉ๋ค.
์ฐจ์ด์
1. ๋ณต์ฌ ๋ฒ์
- ์์ ๋ณต์ฌ: ๊ฐ์ฒด ์์ฒด๋ ๋ณต์ฌ๋์ง๋ง, ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ค์ ๋ณต์ฌ๋์ง ์๊ณ ์ฐธ์กฐ๋ง ๋ณต์ฌ๋๋ค.
- ๊น์ ๋ณต์ฌ: ๊ฐ์ฒด์ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ์ฒด๊ฐ ์ฌ๊ท์ ์ผ๋ก ๋ณต์ฌ๋๋ค.
2. ๋ ๋ฆฝ์ฑ
- ์์ ๋ณต์ฌ: ๋ณต์ฌ๋ ๊ฐ์ฒด์ ์๋ณธ ๊ฐ์ฒด๋ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ค์ ๊ณต์ ํ๋ค.
- ๊น์ ๋ณต์ฌ: ๋ณต์ฌ๋ ๊ฐ์ฒด์ ์๋ณธ ๊ฐ์ฒด๋ ์์ ํ ๋ ๋ฆฝ์ ์ด๋ค.
3. ์ฌ์ฉ ๋ชฉ์
- ์์ ๋ณต์ฌ: ๊ฐ์ฒด์ ์ต์์ ๋ ๋ฒจ๋ง ๋ณต์ฌํ๊ณ ๋ด๋ถ ๊ฐ์ฒด๋ค์ ๊ณต์ ํด๋ ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
- ๊น์ ๋ณต์ฌ: ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์์ ํ ๋ ๋ฆฝ์ ์ผ๋ก ๋ณต์ฌํด์ผ ํ ๋ ์ฌ์ฉํ๋ค.
ChatGPT์ ์ถ์ฒ
์์ ๋ณต์ฌ(Shallow Copy)์ ๊น์ ๋ณต์ฌ(Deep Copy)์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ ์ถ์ฒ์์ ์ฐพ์ ์ ์์ต๋๋ค:
- Oracle Java Documentation
- Object.clone() Method
- ์ด ๋ฌธ์์์๋ clone() ๋ฉ์๋์ ์์ ๋ณต์ฌ์ ๋ํ ์ค๋ช ์ ์ ๊ณตํฉ๋๋ค.
- Java Programming Books
- Effective Java by Joshua Bloch: ์ด ์ฑ ์์๋ Java์์์ ๊ฐ์ฒด ๋ณต์ฌ์ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ฐ์ง ์ฃผ์ ๋ฅผ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
- Java: The Complete Reference by Herbert Schildt: ์ด ์ฑ ์์ ๊ฐ์ฒด ๋ณต์ฌ์ ๊ด๋ จ๋ ๊ธฐ์ด ๊ฐ๋ ์ ์ค๋ช ํฉ๋๋ค.
- Tutorials and Articles
- Baeldung - Shallow Copy vs Deep Copy in Java: ์ด ๋ธ๋ก๊ทธ ํฌ์คํธ๋ ์๋ฐ์์ ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ์ ์ฐจ์ด์ ์ ์์ธํ ์ค๋ช ํฉ๋๋ค.
- GeeksforGeeks - Java Cloneable Interface and Cloning: ์๋ฐ์ Cloneable ์ธํฐํ์ด์ค์ ๊ฐ์ฒด ๋ณต์ฌ์ ๊ดํ ์ค๋ช ์ ์ ๊ณตํฉ๋๋ค.
์ด ์ถ์ฒ๋ค์์๋ ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ์ ๊ฐ๋ ๊ณผ ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ ์๋ฐ์์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง์ ๋ํ ์์ธํ ์ค๋ช ์ ์ฐพ์๋ณผ ์ ์์ต๋๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋ฒํท Butcket (0) | 2024.08.14 |
---|---|
[Java] ์ clone() ๋ฉ์๋๋ฅผ ์ ๊ณตํ ๊น (0) | 2024.08.14 |
[Java] Object ํด๋์ค์ ์ค๋ ๋ ๊ฐ ํต์ ์ ์ํ ๋ฉ์๋๋ค์ด ํฌํจ๋ ์ด์ (0) | 2024.08.14 |
[Java][์ฉ์ด] ๋ชจ๋ํฐ (0) | 2024.08.14 |
[Java] Object ํด๋์ค (0) | 2024.08.14 |