Java์˜ Call by value(pass by value)

C++์—์„œ์˜ swap() ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋Š” ์ฃผ์†Œ๊ฐ’์„ ๊ตํ™˜ํ•˜๋Š” call by reference ๋ฐฉ์‹์œผ๋กœ์„œ ๋™์ž‘ํ•œ๋‹ค. tmp ๋ณ€์ˆ˜๋ฅผ ์ค‘๊ฐ„ ๋งค๊ฐœ๋กœ ์ฃผ์†Œ๊ฐ’(๊ฐ’์˜ ์œ„์น˜)์„ ์„œ๋กœ ๊ตํ™˜ํ•œ๋‹ค.

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

Java์—์„œ primitive type, reference type์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • JVM ๋ฉ”๋ชจ๋ฆฌ์—์„œ primitive type์€ stack ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค

  • reference type์€ ๊ทธ ๊ฐ์ฒด์ธ ๊ฐ’์ด heap ์˜์—ญ์— ์ €์žฅ๋˜๊ณ , stack ์˜์—ญ์— ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

Screen Shot 2022-10-09 at 7.13.01 PM.png

๋งŒ์•ฝ swap ๋ฉ”์„œ๋“œ์—์„œ reference ๋ณ€์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๊ฐ€ stack ์˜์—ญ์— ์ •์˜๊ฐ€ ๋œ๋‹ค. ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ์„œ๋กœ ๊ตํ™˜ํ•˜๊ฑฐ๋‚˜, ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ธฐ์กด์˜ ๋ณ€์ˆ˜๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Java๋Š” ํ•ญ์ƒ call by value(pass by value) ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฐฉ์‹ ๊ฐœ๋…

    • Call by value ๋ฐฉ์‹์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฐฉ์‹์—์„œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ž(caller)์™€ ํ˜ธ์ถœ๋‹นํ•˜๋Š” ์ˆ˜์‹ ์ž(callee)์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ณต์‚ฌ๋˜์–ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ˆ˜์‹ ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด๋„ ํ˜ธ์ถœ์ž์˜ ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

    • call by reference ๋ฐฉ์‹์€ ์ฐธ์กฐ(์ฃผ์†Œ)๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— caller์˜ ๋ณ€์ˆ˜์™€ callee์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๋™์ผํ•œ ๋ณ€์ˆ˜์ด๋‹ค. ์ˆ˜์‹ ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ํ˜ธ์ถœ์ž์˜ ๋ณ€์ˆ˜๋„ ๋ฐ”๋€๋‹ค.

  • ์ž๋ฐ”์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” Reference type์„ ์ด์šฉํ•ด์„œ swap์„ ๊ตฌํ˜„ํ•ด์•ผํ•˜์ง€๋งŒ, primitive ๋ณ€์ˆ˜ ๊ฐ’์„ ๊ตํ™˜ํ•˜๋Š” ํŠธ๋ฆญ๋„ ์žˆ๋‹ค. Collections ํŒจํ‚ค์ง€์—์„œ list ๋‚ด์˜ ์›์†Œ๊ฐ’ ๊ฐ„์˜ swap ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.

Last updated