1. ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•์˜ ๊ณต์œ 

์ž๋ฐ”์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์žฅ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉด ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•์ด ์žˆ๋‹ค.

๊ธฐ๋ณธํ˜•์€ ํ•˜๋‚˜์˜ ๊ฐ’์„ ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์—์„œ ์ ˆ๋Œ€๋กœ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฐธ์กฐํ˜•์€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๊ฐ’์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋ณธํ˜•์—์„œ๋Š”

int a = 10;
int b = a;  // a->b ๊ฐ’ ๋ณต์‚ฌ ํ›„ ๋Œ€์ž…


b= 20; //a๋Š” ๊ทธ๋Œ€๋กœ 10์ด๊ณ  b๋งŒ 20์œผ๋กœ ๋ฐ”๋€๋‹ค.

 

๋ฐ˜๋ฉด์— ์ฐธ์กฐํ˜•์—์„œ๋Š”

package lang.immutable.address;

public class Address {
    
    private String value;
    
    public Address(String value) {
        this.value = value;
    }
    
    public void setValue(String value) {
          this.value= value;
    }
    
    public void getValue() {
          return value;
    }
    
    @Override
    public String toString() {
       return "Address{" +
              "value= " + value + '\'' +
              '}';
    }
}
1. public void setValue(String value)
• ์—ญํ• :
 ์ด ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค์˜ ํ•„๋“œ value ๊ฐ’์„ ๋ณ€๊ฒฝ(set)ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
 ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด, ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ value ํ•„๋“œ๊ฐ€ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

2. public String getValue()
• ์—ญํ• :
์ด ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค์˜ ํ•„๋“œ value ๊ฐ’์„ ์ฝ๊ธฐ(get) ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
ํ˜ธ์ถœ์ž๋Š” ํ˜„์žฌ ๊ฐ์ฒด์˜ value ๊ฐ’์„ ๋ฐ˜ํ™˜๋ฐ›์•„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
• ํŠน์ง•:
 ์ด ๋ฉ”์„œ๋“œ๋Š” value ๊ฐ’์„ ์™ธ๋ถ€์—์„œ ์ฝ๊ธฐ๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
package lang.immutable.address;

public class RefMain1_1 {

  public static void main(String[] args) { 
  //์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. 
      Address a = new Address("์„œ์šธ"); 
      Address b = a;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        
        
        b.setValue("๋ถ€์‚ฐ"); //b์˜ ๊ฐ’์„ ๋ถ€์‚ฐ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•จ 
        System.out.println("๋ถ€์‚ฐ -> b"); 
        System.out.println("a = " + a); //์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๋ฐœ์ƒ 
        System.out.println("b = " + b);
        
    }
 
}

์ฒ˜์Œ์—๋Š” `a` , `b` ๋‘˜๋‹ค ์„œ์šธ์ด๋ผ๋Š” ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
๋”ฐ๋ผ์„œ `Address b = a` ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๊ณ , ๋ณ€์ˆ˜ a, b ๋‘˜๋‹ค ์„œ์šธ์ด๋ผ๋Š” ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค.

์ดํ›„์— `b` ์˜ ์ฃผ์†Œ๋ฅผ ๋ถ€์‚ฐ์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด b ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ a์˜ ์ฃผ์†Œ๋„ ํ•จ๊ป˜ ๋ถ€์‚ฐ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.

 

์‹คํ–‰ ๊ฒฐ๊ณผ

a = Address{value='์„œ์šธ'}
b = Address{value='์„œ์šธ'}
๋ถ€์‚ฐ -> b
a = Address{value='๋ถ€์‚ฐ'}
b = Address{value='๋ถ€์‚ฐ'}

์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋“ค์€ ๊ฐ™์€ ์ฐธ์กฐ๊ฐ’์„ ํ†ตํ•ด ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

`b = a` ๋ผ๊ณ ํ•˜๋ฉด `a` ์—์žˆ๋Š”์ฐธ์กฐ๊ฐ’ `x001` ์„๋ณต์‚ฌํ•ด์„œ `b` ์—์ „๋‹ฌํ•œ๋‹ค.

์ฐธ์กฐ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ `a` , `b` ๋Š” ๊ฐ™์€ `x001` ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

 

2. ๊ณต์œ  ์ฐธ์กฐ์™€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ

์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(Side Effect)๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์–ด๋–ค ๊ณ„์‚ฐ์ด ์ฃผ๋œ ์ž‘์—… ์™ธ์— ์ถ”๊ฐ€์ ์ธ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์„ ๋งํ•œ

๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ฐธ์กฐํ˜• ์ฝ”๋“œ์—์„œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์ผ์–ด๋‚ฌ๋Š”๋ฐ

์ฐธ์กฐ๊ฐ’์„ ๊ณต์œ ํ•˜๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์ด๋‹ค.

b์˜ ์ฃผ์†Œ๊ฐ’์„  ์„œ์šธ์—์„œ ๋ถ€์‚ฐ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์˜๋„์˜€์ง€๋งŒ

a๋„ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— a์˜ ๊ฐ’๋„ ๋ถ€์‚ฐ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋ฒ„๋ฆฐ๊ฒƒ์ด๋‹ค. 

 

3. ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด?

a์™€ b์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ถ„๋ฆฌ์‹œ์ผœ์ค€๋‹ค.

Address a = new Address("์„œ์šธ"); 
Address b = new Address("์„œ์šธ");
package lang.immutable.address;
 public class RefMain1_2 {
 
public static void main(String[] args) { 

  Address a = new Address("์„œ์šธ"); 
  Address b = new Address("์„œ์šธ"); 
  System.out.println("a = " + a); 
  System.out.println("b = " + b);
  
  b.setValue("๋ถ€์‚ฐ"); 
  System.out.println("๋ถ€์‚ฐ -> b"); 
  System.out.println("a = " + a); 
  System.out.println("b = " + b);
  
  } 
}

 

์‹คํ–‰๊ฒฐ๊ณผ

a = Address{value='์„œ์šธ'}
b = Address{value='์„œ์šธ'}
๋ถ€์‚ฐ -> b
a = Address{value='์„œ์šธ'}
b = Address{value='๋ถ€์‚ฐ'}

 

 

a ์™€ b ๋Š”์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

๋”ฐ๋ผ์„œ b๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ a์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

 

4. ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค.

์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ–์— ์—†๋‹ค.

 

 4.1 ๊ฐ์ฒด๋ฅผ ๊ณต์œ  - ์ด ๋ฐฉ๋ฒ• ์ž์ฒด๋ฅผ ๋ง‰์„ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค.

Address a = new Address("์„œ์šธ"); 
Address b = a;

 

 4.2 ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์Œ - a์™€ b์˜ ์ธ์Šคํ„ด์Šค ๋ถ„๋ฆฌ

Address a = new Address("์„œ์šธ");
Address b = new Address("์„œ์šธ");

์ด์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•˜๊ฒŒ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ด์„œ, ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

 

์ง€๊ธˆ๊นŒ์ง€์˜ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์ž๋ฉด,

๊ธฐ๋ณธํ˜•์€ ํ•ญ์ƒ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ๋Œ€์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์ ˆ๋Œ€๋กœ ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค. 

ํ•˜์ง€๋งŒ ์ฐธ์กฐํ˜•์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ๋Œ€์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์—์„œ ์–ผ๋งˆ๋“ ์ง€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ์ง€๊ธˆ๊ณผ ๊ฐ™์€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์›์ธ์ธ ๊ฒƒ์ด๋‹ค. 

 

 

5. ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์›์ธ์ธ ๊ฒƒ์„ ์ฐพ๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ

package lang.immutable.address;

public class RefMain1_3 {

  public static void main(String[] args) { 
    Address a = new Address("์„œ์šธ"); 
    Address b = a;
    System.out.println("a = " + a);
    System.out.println("b = " + b);


    change(b, "๋ถ€์‚ฐ"); 
    System.out.println("a = " + a); 
    System.out.println("b = " + b);
}

private static void change(Address address, String changeAddress) { 
System.out.println("์ฃผ์†Œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค -> " + changeAddress); 
address.setValue(changeAddress);
} 

}

 

์‹คํ–‰๊ฒฐ๊ณผ

a = Address{value='์„œ์šธ'}
b = Address{value='์„œ์šธ'}
์ฃผ์†Œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค -> ๋ถ€์‚ฐ
a = Address{value='๋ถ€์‚ฐ'}
b = Address{value='๋ถ€์‚ฐ'} ```

change() ๋ฉ”์„œ๋“œ๋กœ ์ธ์Šคํ„ด์Šค value๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฝ๋กœ์˜ ๊ณผ์ •์ด ์ถ”๊ฐ€๋˜์–ด์„œ ๋ณ€๊ฒฝ๋œ ์ด์œ ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. 

 


6. ๋ถˆ๋ณ€ ๊ฐ์ฒด - ๋„์ž…

๋ฌธ์ œ์˜ ์ง์ ‘์ ์ธ ์›์ธ์€ ๊ณต์œ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜ ๊ฐ’์„ ์–ด๋””์„ ๊ฐ€ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ฐ์ฒด์˜ ์ƒํƒœ(๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’, ํ•„๋“œ, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜)๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ณ€ ๊ฐ์ฒด(Immutable Object)๋ผ ํ•œ๋‹ค.

package lang.immutable.address;
 public class ImmutableAddress {
 
     private final String value;
     
     public ImmutableAddress(String value) {
         this.value = value;
}

     public String getValue() {
        return value;
}

    @Override
    public String toString() {
    return "Address{" +
            "value='" + value + '\'' +
            '}'

  } 
}

๋‚ด๋ถ€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์•ˆ๋œ๋‹ค. ๋”ฐ๋ผ์„œ value ์˜ ํ•„๋“œ๋ฅผ  final๋กœ ์„ ์–ธํ–ˆ๋‹ค.
๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” setValue()๋ฅผ ์ œ๊ฑฐํ–ˆ๋‹ค.
์ด ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ดํ›„์—๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

package lang.immutable.address;

 public class RefMain2 {
 
   public static void main(String[] args) {
        ImmutableAddress a = new ImmutableAddress("์„œ์šธ"); 
        ImmutableAddress b = a; //์ฐธ์กฐ๊ฐ’ ๋Œ€์ž…์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. 
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        
        //b.setValue("๋ถ€์‚ฐ"); //์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ 
        b = new ImmutableAddress("๋ถ€์‚ฐ"); 
        System.out.println("๋ถ€์‚ฐ -> b"); 
        System.out.println("a = " + a); 
        System.out.println("b = " + b);
   }
}

 

`ImmutableAddress` ์˜ ๊ฒฝ์šฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” b.setValue()๋ฉ”์„œ๋“œ ์ž์ฒด๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค.
์ด์ œ ImmutableAddress ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‹ค.
ImmutableAddress๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋‹ค๊ฐ€, ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ , ์ด ๊ฐ์ฒด๊ฐ€ ๋ถˆ๋ณ€ ๊ฐ์ฒด์ธ ์‚ฌ์‹ค์„ ๊นจ๋‹ซ๊ฒŒ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด `b.setValue("๋ถ€์‚ฐ")` ์„ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ํ†ตํ•ด ์ธ์ง€ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ImmutableAddress("๋ถ€์‚ฐ") ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ b์— ๋Œ€์ž…ํ•œ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ a , b๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ , a๊ฐ€ ์ฐธ์กฐํ•˜๋˜ ImmutableAddress๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค.

 

์‹คํ–‰ ๊ฒฐ๊ณผ

a = Address{value='์„œ์šธ'}
b = Address{value='์„œ์šธ'}
๋ถ€์‚ฐ -> b
a = Address{value='์„œ์šธ'}
b = Address{value='๋ถ€์‚ฐ'}

 

+ Recent posts