์ค๋ ์ ๋ฆฌํ ๋ด์ฉ์ ์๋ฐ์์์ ๊น์ ๋ณต์ฌ ์ ์์ ๋ณต์ฌ์ด๋ค.
๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋๋ฐ, ์ด๋ JAVA์์ ๊น์ ๋ณต์ฌ์ ์์ ๋ณต์ฌ์ ๋ํด ๋ฐฐ์ ์๋ค.
์ด ์ฐจ์ด์ ์ ๋ช ํํ ํด์ผ ํท๊ฐ๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ฆฌํด๋๊ณ ์ ํ๋ค.
Deep Copy vs Shallow Copy
๊น์๋ณต์ฌ (Deep Copy) : '์ค์ ๊ฐ'์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํ๋ค. (ํ ์์ญ)
์์๋ณต์ฌ (Shallow Copy) : '์ฃผ์ ๊ฐ'์ ๋ณต์ฌํ๋ค. (์คํ์์ญ)
์ฌ์ค์, ์ด๋ ๊ฒ๋ง ์ค๋ช ํ๊ฒ ๋๋ฉด.. ์ดํด๋ฅผ ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด ์ค๋ช ํด๋ณด์
์์๋ณต์ฌ(Shallow Copy)
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//Getters and setters
}
public class ShallowCopy {
public static void main(String[] args) {
Person person1 = new Person("John", 26);
Person person2 = person1; //์์ ๋ณต์ฌ
//๋ณ๊ฒฝ ์
System.out.println("person1: " + person1.getName() + ", " + person1.getAge();
System.out.println("person2: " + person2.getName() + ", " + person2.getAge();
//person1์ ๋ณ๊ฒฝ
person1.setName("Liz");
person1.setAge(24);
//๋ณ๊ฒฝ ํ
System.out.println("person1: " + person1.getName() + ", " + person1.getAge());
System.out.println("person2: " + person2.getName() + ", " + person2.getAge());
}
}
//์ถ๋ ฅ ๊ฒฐ๊ณผ
person1 : John, 26
person2 : John, 26
person1 : Liz , 24
person2 : Liz, 24
์ฆ, ์์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ์ฃผ์๋ง์ ๋ณต์ฌํ๋ฏ๋ก person1๊ณผ person2๊ฐ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, person1์ ๋ด์ฉ๋ง ๋ณ๊ฒฝํ์์๋ person2๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊น์ ๋ณต์ฌ (Deep Copy)
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//copy ์์ฑ์ for deep copy
public Person(Person other) {
this.name = other.name;
this.age = other.age;
}
//Getters and setters
}
public class DeepCopy {
public static void main(String[] args) {
Person person1 = new Person("chung", 25);
Person person2 = new Person(person1); //๊น์ ๋ณต์ฌ
//๋ณ๊ฒฝ ์
System.out.println("person1: " + person1.getName() + ", " + person1.getAge());
System.out.println("person2: " + person2.getName() + ", " + person2.getAge());
//Person 1์ ๋ณ๊ฒฝ
person1.setName("Liz");
person1.setAge(28);
//๋ณ๊ฒฝ ํ
System.out.println("person1: " + person1.getName() + ", " + person1.getAge());
System.out.println("person2: " + person2.getName() + ", " + person2.getAge());
}
}
//๊ฒฐ๊ณผ ์ถ๋ ฅ
person1 : chung, 25
person2 : chung, 25
person1 : Liz, 28
person2 : chung, 25
์ฆ, ๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ์ค์ ๋ด์ฉ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ person1์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ฉด person1์ ๋ด์ฉ๋ง ๋ณ๊ฒฝ๋ ๋ฟ person2๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
์์ ๋ณต์ฌ, ๊น์ ๋ณต์ฌ ์ ํํ๊ธฐ
๊ทธ๋ ๋ค๋ฉด, ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ๋ฅผ ์ด๋ค ์ํฉ์ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ ๊น?
๊ฐ์ฒด ๋ณต์ฌ์ ๋ํ ์ ํ์ ์ฃผ์ด์ง ์ํฉ์ ๋ฐ๋ผ ๊ต์ฅํ ๋ฌ๋ผ์ง ์ ์๋ค.
์์ ๋ณต์ฌ๋ ์ฑ๋ฅ์ ์ด์ ์ด ์์ง๋ง, ๋ด๋ถ ์ํ์ ๋ณ๊ฒฝ์์ ๋ถํ์ํ ๋ณ๊ฒฝ์ ์ด๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค. ๋ํ ๊ฐ์ฒด์ ํ๋๊ฐ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ด๊ฑฐ๋ ๋ถ๋ณ ๊ฐ์ฒด์ผ ๋๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, ์ฐธ์กฐ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์ง ๊ฐ์ฒด์ ๊ฒฝ์ฐ์๋ ์๋ณธ ๊ฐ์ฒด์ ๋ณต์ฌ๋ณธ์ด ๋์ผํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋ฏ๋ก ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ด ์ฃผ์ํด์ผ ํ๋ค.
๋ฐ๋ฉด ๊น์ ๋ณต์ฌ๋ ์์ ์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํด ์ฃผ์ง๋ง, ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์๋ค.๊ฐ์ฒด๊ฐ ํฌ๊ณ ๋ณต์กํ ๊ฒฝ์ฐ, ๋ชจ๋ ๋ด๋ถ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ด ํฐ ์์ธ์ผ ์ ์๋ค. ๋ฐ๋ผ์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ถ๋ณ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ์๋ฑ์ผ๋ก ๊ณ ๋ คํด๋ณผ ํ์๊ฐ ์๋ค.
์ฆ, ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ์ฌ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ ๋ฌํ ๋์ ์๋ณธ ๊ฐ์ฒด์ ์์ ์ ์์น ์๋ ๊ฒฝ์ฐ "๊น์๋ณต์ฌ"๋ฅผ ์ฌ์ฉํ๋ฉฐ,
๊ฐ์ฒด์ ์ผ๋ถ ์์ฑ๋ง ๋ณต์ฌํ๊ณ ๋๋จธ์ง๋ ๊ณต์ ํ๋ ๊ฒฝ์ฐ "์์ ๋ณต์ฌ"๋ฅผ ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํ๋ค.
'๐ฉ๐ปโ๐ป Developer > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ฐ์ฒด์งํฅ ์ค๊ณ 5์์น SOLID 1. ๋จ์ผ์ฑ ์์์น (SRP) (0) | 2025.01.22 |
---|---|
[Java] ๋ณ๋ ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ "๋ณ๋ ฌ ์คํธ๋ฆผ" (1) | 2024.05.01 |
[Java] hashCode()์ equals()๋? (0) | 2024.03.31 |
[Java] Java8, Java11, Java17์ ์ฐจ์ด ๋ฐ ๊ธฐ๋ฅ (0) | 2024.03.22 |
๋๊ธ