πŸ‘©πŸ»‍πŸ’» Developer/JAVA

[Java] 'κΉŠμ€ 볡사'와 '얕은 볡사'λž€?

Junyung 2024. 3. 30. 22:22

였늘 정리할 λ‚΄μš©μ€ μžλ°”μ—μ„œμ˜ κΉŠμ€ 볡사 와 얕은 볡사이닀. 

 

λ°°μ—΄μ΄λ‚˜ 객체λ₯Ό λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•  수 μžˆλŠ”λ°, μ΄λ•Œ 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λŠ” 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€. 


얕은 볡사, κΉŠμ€ 볡사 μ„ νƒν•˜κΈ° 

κ·Έλ ‡λ‹€λ©΄, 얕은 볡사와 κΉŠμ€ 볡사λ₯Ό μ–΄λ–€ 상황에 μ–΄λ–»κ²Œ μ‚¬μš©ν•΄μ•Ό ν• κΉŒ? 

객체 볡사에 λŒ€ν•œ 선택은 μ£Όμ–΄μ§„ 상황에 따라 ꡉμž₯히 λ‹¬λΌμ§ˆ 수 μžˆλ‹€.

 

얕은 λ³΅μ‚¬λŠ” μ„±λŠ₯상 이점이 μžˆμ§€λ§Œ, λ‚΄λΆ€ μƒνƒœμ˜ λ³€κ²½μ—μ„œ λΆˆν•„μš”ν•œ 변경을 μ΄ˆλž˜ν•  수 있기 λ•Œλ¬Έμ— μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. λ˜ν•œ 객체의 ν•„λ“œκ°€ κΈ°λ³Έ 데이터 νƒ€μž…μ΄κ±°λ‚˜ λΆˆλ³€ 객체일 λ•ŒλŠ” λ¬Έμ œκ°€ λ˜μ§€ μ•Šμ§€λ§Œ, μ°Έμ‘° 데이터 νƒ€μž…μ„ κ°€μ§„ 객체의 κ²½μš°μ—λŠ” 원본 객체와 볡사본이 λ™μΌν•œ μ°Έμ‘°λ₯Ό κ°€μ§€λ―€λ‘œ μ˜ˆμƒμΉ˜ λͺ»ν•œ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆμ–΄ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

 

반면 κΉŠμ€ λ³΅μ‚¬λŠ” μ•ˆμ •μ„±κ³Ό 예츑 κ°€λŠ₯성을 μ œκ³΅ν•΄ μ£Όμ§€λ§Œ, μ„±λŠ₯ μ €ν•˜λ₯Ό μ΄ˆλž˜ν•  수 μžˆλ‹€.객체가 크고 λ³΅μž‘ν•œ 경우, λͺ¨λ“  λ‚΄λΆ€ 객체λ₯Ό λ³΅μ‚¬ν•˜λŠ” 것이 큰 원인일 수 μžˆλ‹€. λ”°λΌμ„œ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 객체λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ λΆˆλ³€ 객체의 λ‚΄λΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λ°©μ‹λ“±μœΌλ‘œ κ³ λ €ν•΄λ³Ό ν•„μš”κ°€ μžˆλ‹€. 

 

즉, 객체λ₯Ό λ³΅μ‚¬ν•˜μ—¬ λ‹€λ₯Έ 객체에 전달할 λ•Œμ™€ 원본 객체의 μˆ˜μ •μ„ μ›μΉ˜ μ•ŠλŠ” 경우 "κΉŠμ€λ³΅μ‚¬"λ₯Ό μ‚¬μš©ν•˜λ©°, 
객체의 일뢀 μ†μ„±λ§Œ λ³΅μ‚¬ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” κ³΅μœ ν•˜λŠ” 경우 "얕은 볡사"λ₯Ό μ‚¬μš©μ„ κ³ λ €ν•΄μ•Ό ν•œλ‹€.