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์ ์ฌ์ฉํด์ผ ํ๋ค.