
์์ ๋ณต์ฌ(Shallow Copy)๋ ์ฃผ์๊ฐ์ ๋ณต์ฌํ๋ ๊ฒ์ ๋งํ๋ค. (์คํ ์์ญ)
๊น์ ๋ณต์ฌ(Deep Copy)๋ ์ค์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํ๋ ๊ฒ์ ๋งํ๋ค. (ํ ์์ญ)
1. ์์ ๋ณต์ฌ(Shallow Copy) ๐

์์ ๋ณต์ฌ(Shallow Copy)๋ ์ฃผ์๊ฐ์ ๋ณต์ฌํ๋ ๊ฒ์ด๋ค. ์ฐธ์กฐ๊ฐ์ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค. ๊ทธ๋์ ๊ธฐ์กด์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ๋ณต์ฌ๋ ๊ฐ๋ ๋ฐ๋๊ฒ ๋๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
public class User {
String name;
int age;
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
----------
public class ShallowCopy {
public static void main(String[] args) {
User userA = new User("amenable", 24);
User userB = userA;
System.out.println(userA.name); // amenable
System.out.println(userB.name); // amenable
userA.name = "sunny"; // useA์ name๋ง ๋ฐ๊พผ ์ํฉ
System.out.println(userA.name); // sunny
System.out.println(userB.name); // sunny
}
}
์ด๋ฅผ ์๋ํ ๊ฒ์ด๋ผ๋ฉด ์๊ด์ด ์์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๊ฐํ๋ ๊ฒ์ฒ๋ผ ๋ณต์ฌ๋ ๊ฐ์ด ๊ธฐ์กด ๊ฐ์ ์ํด ์ํฅ์ ๋ฐ์ง ์์ผ๋ ค๋ฉด ๊น์ ๋ณต์ฌ๋ฅผ ํด์ผ ํ๋ค.
2. ๊น์ ๋ณต์ฌ(Deep Copy) ๐

๊น์ ๋ณต์ฌ(Deep Copy)๋ ์ค์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํ๋ ๊ฒ์ด๋ค. ๋ณต์ฌ๋ ๊ฐ์ ๊ธฐ์กด ๊ฐ์ ๋ณ๊ฒฝ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ๊น์ ๋ณต์ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ 3๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
1. ๋ณต์ฌ ์์ฑ์ ๋๋ ๋ณต์ฌ ํฉํฐ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
public class User {
String name;
int age;
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
// ๋ณต์ฌ ์์ฑ์
public User(User user) {
this.name = user.name;
this.age = user.age;
}
// ๋ณต์ฌ ํฉํฐ๋ฆฌ
public static User copyFactory(User user) {
User copyUser = new User(user.name, user.age);
return copyUser;
}
}
----------
public class DeepCopy {
public static void main(String[] args) {
User userA = new User("amenable", 24);
User userB = new User(userA);
User userC = User.copyFactory(userA);
System.out.println(userA.name); // amenable
System.out.println(userB.name); // amenable
System.out.println(userC.name); // amenable
userA.name = "sunny";
userB.name = "immortal";
System.out.println(userA.name); // sunny
System.out.println(userB.name); // immortal
System.out.println(userC.name); // amenable
}
}
2. ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
public class DeepCopy {
public static void main(String[] args) {
User userA = new User("amenable", 24);
User userB = new User(userA.name, userA.age);
System.out.println(userA.name); // amenable
System.out.println(userB.name); // amenable
userA.name = "sunny";
System.out.println(userA.name); // sunny
System.out.println(userB.name); // amenable
}
}
3. Cloneable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ clone() ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
public class User implements Cloneable {
String name;
int age;
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
----------
public class DeepCopy {
public static void main(String[] args) throws CloneNotSupportedException {
User userA = new User("amenable", 24);
User userB = userA.clone();
System.out.println(userA.name); // amenable
System.out.println(userB.name); // amenable
userA.name = "sunny";
System.out.println(userA.name); // sunny
System.out.println(userB.name); // amenable
}
}
'clone ์ฌ์ ์๋ ์ฃผ์ํด์ ์งํํ๋ผ- ์ดํํฐ๋ธ ์๋ฐ์ ITEM13'(๊ธ1, ๊ธ2)์ ๋ฐ๋ฅด๋ฉด clone() ์ฌ์ ์๋ final ์ธ์คํด์ค ๋๋ ๋ฐฐ์ด์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ๊ถํ์ง ์๋๋ค๋ผ๊ณ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊น์ ๋ณต์ฌ๋ clone์ด ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ด์ฉํ๋๋ก ํ์.
ํด๋น ๊ธ์
์ญ์ฝ๋ฉ ๋์ 'Shallow copy(์์ ๋ณต์ฌ) vs Deep Copy(๊น์ ๋ณต์ฌ)',
์ต๋ธ๋ ๋์ '[Java] Shallow copy์ Deep copy',
์ ์ฐธ๊ณ ํ์์ต๋๋ค.
'๐ JAVA > ์ฃผ์ ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ํผ ํด๋์ค (Wrapper Class) (0) | 2023.05.09 |
---|---|
clone() (0) | 2023.04.07 |
JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (0) | 2023.03.24 |
๋ณ์ (0) | 2023.03.21 |
๊ณต๋ณ ๋ฐํํ์ (Convariant Return Type) (0) | 2023.03.09 |