Call by value, Call by reference, Call by assignment
Call by value , Call by reference, Call by assignment
ํจ์๋ฅผ ํธ์ถํ ๋์, ์ฐ๋ฆฌ๋ ๊ฐ์ ์ํ ํธ์ถ์ ํ๊ธฐ๋ํ๊ณ ์ฐธ์กฐ์ ์ํ ํธ์ถ์ ํ๊ธฐ๋ ํ๋ค.
ํจ์๊ฐ ํธ์ถ๋ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์์์๋ ํจ์๋ฅผ ์ํ ๊ณต๊ฐ์ด ์์ฑ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์๊ฐ ์ข ๋ฃ๋ ๋, ํด๋น ๊ณต๊ฐ์ ์ฌ๋ผ์ง๋ค.
Stack Frame : ํจ์ ํธ์ถ์ ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก(์ง์ญ๋ณ์์ ์ ์ธ์ผ๋ก ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก)
int main(void)
{
// ์คํ๋ณ์ a๋ Stack Frame์ ์ง์ญ๋ณ์๋ก์ ํ ๋น์ด ๋๋ค.
int a;
a = 4;
return (0);
}Call by value
Call-by-value๋ ๋ง ๊ทธ๋๋ก ๊ฐ์ ์ํ ํธ์ถ์ด๋ค. Call-by-value๋ ์ธ์๋ก ๋ฐ์ ๊ฐ์ ๋ณต์ฌํ์ฌ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ฐ,
๋ณต์ฌ๋ ์ธ์๋ ํจ์ ์์์ ์ง์ญ์ ์ผ๋ก ์ฌ์ฉ๋๋ local value(์ง์ญ๋ณ์)๊ฐ ๋๋ค.
#include <stdio.h>
int add(int a, int b)
{
printf("a_ptr = %p\n", &a);
printf("b_ptr = %p\n", &b);
return (a + b);
}
int main()
{
int a = 4;
int b = 6;
int c = add(a, b);
printf("a_ptr = %p\n", &a);
printf("b_ptr = %p\n", &b);
return (0);
}
// ์ฃผ์๊ฐ์ด ๋ค๋ฅด๋ค.
/***************************
a_ptr = 0x16b76322c
b_ptr = 0x16b763228
a_ptr = 0x16b763268
b_ptr = 0x16b763264
***************************/Call by reference
Call-by-reference๋ ์ฐธ์กฐ์ ์ํ ํธ์ถ์ด๋ค. ๋ณ์์ ๋ ํผ๋ฐ์ค(์ฃผ์)๋ฅผ ์ธ์๋ก ์ ๋ฌํด์
์ธ์๋ก ์ ๋ฌ๋ ๋ณ์์ ๊ฐ๋ ํจ๊ป ๋ณ๊ฒฝํ ์ ์๋ค.
ํ๋ก๊ทธ๋๋ฐ ๊ตฌ์กฐ์ Call-by-value์ ๋นํด ๋ฉ๋ชจ๋ฆฌ์ ์ธ ์ฐ์๊ฐ ์๋ค๊ณ ๋ ํ์ง๋ง, ์์ฆ์๋ ๊ธฐ๊ธฐ์ ์ฑ๋ฅ์ด ๋ค ์ข์์ ํฐ ์๊ด์ ์๋ค.
๊ทธ๋ฌ๋ ๋ง์ ์ฐ์ฐ์ด ๋ค์ด๊ฐ์ ๋์๋ Call-by-value๋ ๊ณผ๋ถํ์ ์์ธ์ด ๋ ์ ์๋ค.
๋ฐ๋๋ก Call-by-value๋ ์๋ ๋ณ์๋ฅผ ํฐ์นํ์ง ์๊ณ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ณ์ฑ์ ์ ์งํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
Call by assignment
Python์ ๊ฒฝ์ฐ ํจ์์ ํธ์ถ ๋ฐฉ์์ผ๋ก call-by-assignment๋ฅผ ์ฌ์ฉํ๋ค.
๋ชจ๋ ๊ฒ์ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ Python์์๋ ๊ฐ์ฒด๋ฅผ ํฌ๊ฒ ๋ ์ข ๋ฅ๋ก ๊ตฌ๋ถ์ง์ ์ ์๋ค.
Immutable : int, float, str, tuple
Muttable : list, dict, set
Immutable ๊ฐ์ฒด๊ฐ ์ธ์๋ก ์ ๋ฌ๋๋ฉด ์ฒ์์๋ call by reference๋ก ๋ฐ์ง๋ง, ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ฉด call by value๋ก ๋์ํ๋ค.์ฆ ํจ์ ๋ด์์ formal parameter ๊ฐ์ด ๋ฐ๋์ด๋ actual parameter๋ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ค.
๋ฐ๋๋ก Muttable ๊ฐ์ฒด๋ ์ฒ์๋ถํฐ call by reference๋ก ๋์ํ๋ค.
Last updated