JAVA Call By Value vs Call By Reference?
Table of contents
๋จผ์ , Call By Value์ Call By Reference์ ์ ์๋ฅผ ์ดํด๋ณด์.
- Call By Value : ์ธ์๋ก ๋ฐ์ ๊ฐ์ ๋ณต์ฌํ์ฌ ์ฒ๋ฆฌํ๋ค. ๋ณต์ฌํ ๊ฐ์ ์ฌ์ฉํ๋ฏ๋ก ์๋ณธ ๋ฐ์ดํฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- Call By Reference : ์ธ์๋ก ๋ฐ์ ๊ฐ์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ์ฌ ์ฒ๋ฆฌํ๋ค. ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๊ฐ์ ์ํฅ์ ์ค๋ค.
์ ์๋ก ์ดํด๋ณด๋ฉด, ์๋ฐ์์ ์์ ํ์ ์ ๋ค๋ฃฐ ๋, Call By Value์ด๊ณ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ๋ Call By Reference ์ธ ๊ฒ ๊ฐ๋ค.
๐ก ํ์ง๋ง! ์๋ฐ๋ ์ค์ง Call By Value๋ก๋ง ๋์ํ๋ค๊ณ ํ๋ค.
public class Test {
public static void main(String[] args) throws NoSuchAlgorithmException {
Test test = new Test();
Sample sample = new Sample(1);
test.test(sample);
System.out.println(sample.value);
}
void test(Sample sample) {
sample = new Sample(2);
}
static class Sample{
int value;
public Sample(int value) {
this.value = value;
}
}
}
์์ ๊ฐ์ ์ฝ๋๋ก ์ดํด๋ณด์.
test()
๋ฉ์๋๋ Sample ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ value๊ฐ์ด 2์ธ Sample๋ก ํ ๋นํ๊ณ ์ข
๋ฃ๋๋ค.
๐ซ ์ด์ ์ ์ดํด๋ณธ, Call By Reference ์ ์์ ์ํ๋ฉด ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ์ฃผ์๊ฐ์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์
๋ฉ์๋ ์ํ ํ value์ ๊ฐ์ ๋ณ๊ฒฝ๋์ผ ํ ๊ฒ์ด๋ค.
ํ์ง๋ง, ๊ฒฐ๊ณผ๋ value๋ ๊ทธ๋๋ก 1์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฆผ์ผ๋ก ๊ณผ์ ์ ์ดํด๋ณด๋ฉด,
test ๋ฉ์๋์ sample์ด ์ฐธ์กฐํ๊ณ ์๋ ์ฃผ์๊ฐ์ ๋๊ฒจ์ค๋ค.
๊ทธ๋ฌ๋ฉด test ์คํ์๋ Heap ์์ญ์ ์กด์ฌํ๊ณ ์๋ Sample ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋ sample์ ๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ test ๋ฉ์๋์ sample = new Sample(2);
์ ์ํด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๋ sample์ผ๋ก ๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ test ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ฉด, test ์คํ์ ์๋ sample์ ์ฌ๋ผ์ง๊ณ Heap ์์ญ์ value๊ฐ์ด 2์ธ ๊ฐ์ฒด๋ ๋จ์์๊ฒ ๋๊ณ , GC์ ์ํด ์ ๋ฆฌ ๋ ๊ฒ์ด๋ค.
์ฆ, ํ๋ผ๋ฏธํฐ๋ก ์ฐธ์กฐ ๋ณ์๋ฅผ ๋๊ธฐ๋ฉด, ๋ฉ์๋๋ ์ฃผ์๊ฐ์ ๋ณต์ฌํด์ ๊ทธ ์ฃผ์๊ฐ์ ๋ฐ๋ผ๋ณด๋ ์๋ก์ด ์ง์ญ ๋ณ์๋ฅผ ํ๋ ๋ ๋ง๋๋ ์ ์ธ ๊ฒ์ด๋ค.
๊ทธ๋์ ์๋ ์กด์ฌํ๋ sample์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์ฆ, ์๋ฐ๋ Call By Value ๋ฐฉ์์ด๋ผ๊ณ ๋ณผ ์ ์๊ฒ ๋ค!
์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ