Object ํด๋์ค์ clone ๋ฉ์๋์ ๊ดํ ๊ฐ๋ตํ ๊ธฐ๋ก์ด๋ค.
clone ๋ฉ์๋๋ Cloneable ์ธํฐํ์ด์ค๋ฅผ ์์ํ์ง ์์ผ๋ฉด ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ ์ CloneNotSupportedException์ ํธ๋ค๋งํด์ผ ํ๋ค. (Checked Exception ์ด๋ฏ๋ก)
์ด๋ฆ์์ ๋๋ต์ ์ผ๋ก ์ ์ถ๊ฐ ๊ฐ๋ฅํ์ง๋ง ์ฃผ์๊ฐ๋ง ๊ฐ์ ธ์ค๋ ์์ ๋ณต์ฌ๊ฐ ์๋ ๋ด์ฉ์ด ๊ฐ๊ณ ์ฃผ์๊ฐ ๋ค๋ฅธ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊น์ ๋ณต์ฌ๋ฅผ ์คํํ๋ค.
๋ค์๊ณผ ๊ฐ์ด Cloneable ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ CloneableObject ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ค.
public class CloneableObject implements Cloneable {
String msg;
public CloneableObject(String msg) {
this.msg = msg;
}
@Override
public CloneableObject clone() {
try {
return (CloneableObject) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ฒด๋ฅผ ์ค์ ๋ก ์์ฑํ๊ณ clone ๋ฉ์๋๋ฅผ ํตํด ๋ณต์ฌ๋ฅผ ์คํํ ํ ์ฃผ์๊ฐ๊ณผ ๊ฐ์ฒด์ ๋ด์ฉ์ ๋น๊ตํด๋ณด๋๋ก ํ์.
@Test
public void cloneTest() {
//given
CloneableObject objectA = new CloneableObject("MSG");
//when
CloneableObject objectB = objectA.clone();
//then
System.out.println("objectA = " + objectA);
System.out.println("objectB = " + objectB);
System.out.println("objectA.hash = " + objectA.hashCode());
System.out.println("objectB.hash = " + objectB.hashCode());
System.out.println("objectA.msg = " + objectA.msg);
System.out.println("objectB.msg = " + objectB.msg);
Assertions.assertThat(objectA).isNotSameAs(objectB);
Assertions.assertThat(objectA).isNotEqualTo(objectB);
Assertions.assertThat(objectA.msg).isEqualTo(objectB.msg);
}
๊ฐ์ฒด์ ์ฃผ์๊ฐ, ํด์ฌ์ฝ๋ ๋ชจ๋ ๊ธฐ์กด ๊ฐ์ฒด์ ๋ค๋ฅธ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋์์ง๋ง, ๋ฉค๋ฒ ๋ณ์๊ฐ ๊ฐ๋ ๊ฐ์ ๋์ผํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํน์ CloneableObject ์ ๋ฉค๋ฒ ๋ณ์๋ก ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ์ ํฌํจํ๋ค๋ฉด, clone ๋ฉ์๋ ์ฌ์ฉ ์์ ์ด๋ค ๋ณต์ฌ๋ฅผ ์ค์ํ ๊น?
๋ค์๊ณผ ๊ฐ์ Member ํด๋์ค๋ฅผ ์ ์ ํ ๋ฉค๋ฒ ๋ณ์๋ก ํฌํจ์์ผ๋ณด๋๋ก ํ์.
public class Member {
public String name;
public int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
}
CloneableObject๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ๋ค.
public class CloneableObject implements Cloneable {
String msg;
Member member;
public CloneableObject(String msg, Member member) {
this.msg = msg; this.member = member;
}
@Override
public CloneableObject clone() {
try {
return (CloneableObject) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
์ดํ ์์์ ์คํํ ๊ฒ๊ณผ ๊ฐ์ด Member ๊ฐ์ฒด๋ง ์ถ๊ฐํ์ฌ clone์ ์คํํ๊ณ , Member ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ํ์ธํด๋ณด์
@Test
public void innerCloneTest() {
//given
Member member = new Member("MemberName", 20);
CloneableObject objectA = new CloneableObject("MSG", member);
//when
CloneableObject objectB = objectA.clone();
//then
System.out.println("objectA = " + objectA.member);
System.out.println("objectB = " + objectB.member);
System.out.println("objectA.hash = " + objectA.member.hashCode());
System.out.println("objectB.hash = " + objectB.member.hashCode());
Assertions.assertThat(objectA.member).isEqualTo(objectB.member);
Assertions.assertThat(objectA.member).isSameAs(objectB.member);
}
์ฐธ์กฐ๋ณ์ ๋ํ ์ฐธ์กฐํ๊ณ ์๋ ์ฃผ์๊ฐ ์์ฒด๋ฅผ ๋ณต์ ํด์ค๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ๊ฒฐ๊ณผ์ด๊ฒ ์ง๋ง, Member ๊ฐ์ฒด๋ ์์ ํ ๋์ผํ ์ฃผ์์ ๊ฐ์ผ๋ก ๋ณต์ฌ ๋๋ ๊ฒ์ ์ ์ ์์๋ค.
์ด ๋ํ ๊น์ ๋ณต์ฌ๋ฅผ ์คํํ๊ณ ์ถ์ผ๋ฉด Member ํด๋์ค๋ Cloneable ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ clone ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ clone ์คํ ์ ๋ด๋ถ์ ๋ฉค๋ฒ ๊ฐ์ฒด๋ค๋ ๊น์ ๋ณต์ฌ๋ฅผ ๋ณ๋๋ก ์คํํด์ฃผ๋ฉด ๋๋ค.
'๋ ธํธ > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Mybatis์ Apache POI ๋ฅผ ์ด์ฉํ ๋์ฉ๋ ์์ ๋ค์ด๋ก๋ ๊ฐ์ (1) | 2024.01.31 |
---|---|
[JAVA] Thread ๊ธฐ์ด (0) | 2022.06.15 |
[JAVA] ํท๊ฐ๋ฆฌ๋ ์์ ์ ๋ฆฌ (0) | 2022.05.11 |
[JAVA/๋ฒ์ญ] Static ๋ฉค๋ฒ๋ฅผ ์ํ JVM ์คํ ๋ฆฌ์ง (0) | 2022.04.12 |
[JAVA] String Literal ๊ณผ String Pool (0) | 2022.03.31 |