[Java] '๊นŠ์€ ๋ณต์‚ฌ'์™€ '์–•์€ ๋ณต์‚ฌ'๋ž€?

    ์˜ค๋Š˜ ์ •๋ฆฌํ•  ๋‚ด์šฉ์€ ์ž๋ฐ”์—์„œ์˜ ๊นŠ์€ ๋ณต์‚ฌ ์™€ ์–•์€ ๋ณต์‚ฌ์ด๋‹ค. 

     

    ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ 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๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. 


    ์–•์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ ์„ ํƒํ•˜๊ธฐ 

    ๊ทธ๋ ‡๋‹ค๋ฉด, ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์–ด๋–ค ์ƒํ™ฉ์— ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ? 

    ๊ฐ์ฒด ๋ณต์‚ฌ์— ๋Œ€ํ•œ ์„ ํƒ์€ ์ฃผ์–ด์ง„ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ต‰์žฅํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

     

    ์–•์€ ๋ณต์‚ฌ๋Š” ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ์žˆ์ง€๋งŒ, ๋‚ด๋ถ€ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ณ€๊ฒฝ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๊ฐ์ฒด์˜ ํ•„๋“œ๊ฐ€ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๊ฑฐ๋‚˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด์ผ ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ, ์ฐธ์กฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์ง„ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ์—๋Š” ์›๋ณธ ๊ฐ์ฒด์™€ ๋ณต์‚ฌ๋ณธ์ด ๋™์ผํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์–ด ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

     

    ๋ฐ˜๋ฉด ๊นŠ์€ ๋ณต์‚ฌ๋Š” ์•ˆ์ •์„ฑ๊ณผ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ณตํ•ด ์ฃผ์ง€๋งŒ, ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.๊ฐ์ฒด๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•œ ๊ฒฝ์šฐ, ๋ชจ๋“  ๋‚ด๋ถ€ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ํฐ ์›์ธ์ผ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹๋“ฑ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

     

    ์ฆ‰, ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์ „๋‹ฌํ•  ๋•Œ์™€ ์›๋ณธ ๊ฐ์ฒด์˜ ์ˆ˜์ •์„ ์›์น˜ ์•Š๋Š” ๊ฒฝ์šฐ "๊นŠ์€๋ณต์‚ฌ"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, 
    ๊ฐ์ฒด์˜ ์ผ๋ถ€ ์†์„ฑ๋งŒ ๋ณต์‚ฌํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ณต์œ ํ•˜๋Š” ๊ฒฝ์šฐ "์–•์€ ๋ณต์‚ฌ"๋ฅผ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

    ๋Œ“๊ธ€