1. ๊ฐ๋ ๐ทโ๏ธ
clone() ๋ฉ์๋๋ ์์ ์ ๋ณต์ ํ์ฌ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ผ์ ํ๋ค.
2. ์ฌ์ฉ๋ฐฉ๋ฒ ๐ฉโ๏ธ
clone()์ Object ํด๋์ค์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด ์๋ค.
public class Object {
protected native Object clone() throws CloneNotSupportedException;
}
์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์ 2๊ฐ์ง๋ฅผ ์ํํ์ฌ์ผ ํ๋ค.
- Cloneable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
- clone()์ ์ค๋ฒ๋ผ์ด๋ฉํ๋ฉด์ ์ ๊ทผ ์ ์ด์๋ฅผ protected์์ public์ผ๋ก ๋ณ๊ฒฝํ๋ค.
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() {
Object obj = null;
try {
obj = super.clone();
}catch(CloneNotSupportedException e) {}
return (User) obj;
}
}
๋ง์ปค์ธํฐํ์ด์ค์ธ Cloneable์ ๊ตฌํํด์ผ ํ๋ ์ด์ ๋ 'ํด๋์ค ์์ฑ์๊ฐ ๋ณต์ ๋ฅผ ํ์ฉํ๋ค๋ ๊ฒ'์ ์๋ ค์ฃผ๊ธฐ ์ํด์๋ค.
๋ํ, clone()์ ๊ณต๋ณ ๋ฐํํ์ ์ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค๋ ๊ฒ๋ ํ์ธํ์.
// ๊ณต๋ณ ๋ฐํํ์
์ ์ฉ X
@Override
public Object clone() {
Object obj = null;
try {
obj = super.clone();
}catch(CloneNotSupportedException e) {}
return obj;
}
// ๊ณต๋ณ ๋ฐํํ์
์ ์ฉ O
@Override
public User clone() {
Object obj = null;
try {
obj = super.clone();
}catch(CloneNotSupportedException e) {}
return (User) obj;
}
3. ์ฃผ์์ ๐จ๐ง
Object ํด๋์ค์ ์ ์๋ clone()์ ๋จ์ํ ์ธ์คํด์ค๋ณ์์ ๊ฐ๋ง ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐํ์ ์ ์ธ์คํด์ค ๋ณ์๊ฐ ์๋ ํด๋์ค๋ ์์ ํ ์ธ์คํด์ค ๋ณต์ ๊ฐ ์ด๋ฃจ์ด์ง์ง ์๋๋ค.
์๋ฅผ ๋ค์ด ๊ฐ์ฒด ๋ฐฐ์ด์ ๊ทธ ์์ฒด๋ก๋ ์ฐธ์กฐ ํ์ ์ด๊ณ , ๊ฐ์ฒด ๋ฐฐ์ด์ด ๊ฐ์ง๊ณ ์๋ ์์์ ๊ฐ๋ค ์ญ์ ์ฐธ์กฐ ํ์ ์ด๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด ๊ฐ์ฒด ๋ฐฐ์ด์ ๋ณต์ฌํ๊ฒ ๋๋ฉด ์์ ๋ณต์ฌ๊ฐ ์ผ์ด๋๊ฒ ๋๋ค.
public static void main(String[] args) {
User[] usersOrigin = {
new User("amenable", 24),
new User("sunny", 21)
};
User[] usersCopy = usersOrigin.clone();
for(User user : usersOrigin) {
System.out.println(user);
}
// User [name=amenable, age=24]
// User [name=sunny, age=21]
for(User user : usersCopy) {
System.out.println(user);
}
// User [name=amenable, age=24]
// User [name=sunny, age=21]
usersOrigin[0].name = "jay";
usersOrigin[0].age = 30;
for(User user : usersOrigin) {
System.out.println(user);
}
// User [name=jay, age=30]
// User [name=sunny, age=21]
for(User user : usersCopy) {
System.out.println(user);
}
// User [name=jay, age=30] // ์์ ๋ณต์ฌ
// User [name=sunny, age=21]
}
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋ฉด์ ๊ฐ์ฒด๋ง๋ค ๋ณต์ฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
public static void main(String[] args) {
User[] usersOrigin = {
new User("amenable", 24),
new User("sunny", 21)
};
User[] usersCopy = new User[2];
for(int i = 0; i < usersOrigin.length; i++) {
usersCopy[i] = usersOrigin[i].clone();
}
}
์๋์ ์ฝ๋๋ฅผ ๋ณด์์ ๋ ์๋ฌธ์ ์ด ํ๋ ์๊ธธ ์ ์๋ค. String์ ๊ธฐ๋ณธ ๊ฐ์ฒด ํ์ ์ด ์๋๋ฐ ์ด๋ป๊ฒ ๊น์ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๊ฒ ๋๋ ๊ฑธ๊น?
public static void main(String[] args) {
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 // ๊น์๋ณต์ฌ
}
๊ทธ ์ด์ ๋ String์ ํน์ฑ ๋๋ฌธ์ด๋ค. ์๋ฐ์์ String ํด๋์ค๋ ๊ฐ์ฒด์ ๋ฌธ์์ด ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๊ธฐ์กด์ ๋ฌธ์์ด ๊ฐ์ ๊ฐ์ง String ๊ฐ์ฒด๋ ๊ทธ๋๋ก ๋๊ณ ๋ณ๊ฒฝ๋ ๋ฌธ์์ด์ ๊ฐ์ง ์๋ก์ด String ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํน์ง์ด ์๋ค.
์ฆ, String๋ ๊ธฐ๋ณธ ํ์ ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ๊ฐ๋ง ๋ณต์ฌ๋์์ง๋ง ๋ฌธ์์ด ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ฐธ์กฐ๊ฐ์ ์๋กญ๊ฒ ์์ฑ๋ String ๊ฐ์ฒด์ ๊ฐ์ ๋ฐ๋ผ๋ณด๊ฒ ๋๋ค. ์๋์ ๊ทธ๋ฆผ์ ํตํด ์ง๊ด์ ์ผ๋ก ์ดํดํด ๋ณด๋๋ก ํ์.
ํด๋น ๊ธ์
Inpa ๋์ '[JAVA] clone ๋ฉ์๋ ์ฌ์ ์(์์ ๋ณต์ฌ & ๊น์ ๋ณต์ฌ)',
injae ๋์ 'Javaํ๋ก์ ํธํ๋ฉด์ String์ ํน์ฑ์ผ๋ก ์ธํ ๊น์ ๋ณต์ฌ ์ค๋ช ํ๊ธฐ',
๋จ๊ถ์ฑ ๋์ '์๋ฐ์ ์ ์'
์ ์ฐธ๊ณ ํ์์ต๋๋ค.
'๐ JAVA > ์ฃผ์ ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ค๋ฆญ(Generics) - ๊ธฐ๋ณธ ๊ฐ๋ (0) | 2023.05.13 |
---|---|
๋ํผ ํด๋์ค (Wrapper Class) (0) | 2023.05.09 |
์์ ๋ณต์ฌ(Shallow Copy) vs ๊น์ ๋ณต์ฌ(Deep Copy) (0) | 2023.04.07 |
JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (0) | 2023.03.24 |
๋ณ์ (0) | 2023.03.21 |