Java์—์„œ์˜ Call by Value

public class Main {
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println(a + " " + b); 
    }
 
    public static void main(String[] args) {
        int n = 10, m = 20;
        swap(n, m);
        System.out.println(n + " " + m);
    }
}
 
// ๊ฒฐ๊ณผ
// 20 10
// 10 20

Java๋Š” ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ๋„˜๊ธธ ๋•Œ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์ „๋‹ฌํ•œ๋‹ค. ์ด๋ฅผ Call By Value๋ผ๊ณ  ํ•œ๋‹ค.

  • ์œ„ ์ฝ”๋“œ์—์„œ swap(n,m)์„ ํ˜ธ์ถœํ•  ๋•Œ n,m ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ 10, 20์ด๋ผ๋Š” ๊ฐ’์ด ๊ฐ๊ฐ ์ƒˆ๋กœ์šด ์ง€์—ญ ๋ณ€์ˆ˜์— ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค.
  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” a,b์˜ ๊ฐ’์„ ์„œ๋กœ ๋ฐ”๊ฟ” 20 10์ด ์ถœ๋ ฅ๋˜์ง€๋งŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ดํ›„ ์›๋ž˜ n,m ๊ฐ’์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ดํ›„ ์‹ค์ œ n,m ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ?

๊ฒฐ๋ก ์ ์œผ๋กœ primitive type ๋ณ€์ˆ˜๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

Java์˜ ๋ณ€์ˆ˜ ์ „๋‹ฌ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • int, char, double๊ณผ ๊ฐ™์€ primitive type ๋ณ€์ˆ˜๋“ค์€ ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜์–ด ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ๋‹ค. ์ด ๊ฐ’๋“ค์€ ๋ชจ๋‘ Stack ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.
  • String, Integer, Array, ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค์™€ ๊ฐ™์€ referece type์€ ๊ฐ์ฒด ์ž์ฒด๋Š” Heap ์˜์—ญ์— ์ €์žฅ๋˜๊ณ  **Stack์— ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๊ฐ’(Referece)**์ด ์ €์žฅ๋œ๋‹ค.

์ฆ‰, ์ž๋ฐ”๋Š” ํ•ญ์ƒ Call By Value์ด๋ฉฐ Reference type์„ ์ „๋‹ฌํ•  ๋•Œ๋„ ์ฐธ์กฐ๊ฐ’์˜ ๋ณต์‚ฌ๋ณธ์ด ์ „๋‹ฌ๋œ๋‹ค.

๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฐธ์กฐ ์ž์ฒด๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

Reference Type์„ ์ด์šฉํ•œ Swap

class IntWrapper {
    int value;
 
    public IntWrapper(int value) {
        this.value = value;
    }
}
 
public class Main {
    public static void swap(IntWrapper n, IntWrapper m) {
        int temp = n.value;
        n.value = m.value;
        m.value = temp;
    }
 
    public static void main(String[] args) {
        IntWrapper n = new IntWrapper(10);
        IntWrapper m = new IntWrapper(20);
 
        swap(n, m);
 
        System.out.println(n.value + " " + m.value); // 20 10
    }
}
 

์š”์•ฝ

  • Java๋Š” ํ•ญ์ƒ Call By Value์ด๋‹ค.
  • primitive type์€ ๊ฐ’ ๋ณต์‚ฌ, reference type์€ ์ฐธ์กฐ๊ฐ’ ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.
  • primitive type์œผ๋กœ๋Š” swap ๊ตฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ผ reference type์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.