Call by Value Vs Call by Reference
ํ๋ก๊ทธ๋๋ฐ, ํนํ C์ธ์ด์์ 'Call by Value'์ 'Call by Reference'์ ๊ฐ๋
์ ๊ธฐ๋ณธ์ ์ด๋ฉด์๋ ํต์ฌ์ ์ธ ๋ถ๋ถ์ด๋ค. ์ด ๋ ํธ์ถ ๋ฐฉ์์ ์ฐจ์ด์ ์ ์ดํดํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ค์ํ๋ค.
1. ์ฝ๋์ ์์ ์ฑ ๋ณด์ฅ
'Call by Value'๋ ํจ์์ ๋ณ์์ ๋ณต์ฌ๋ณธ์ ์ ๋ฌํจ์ผ๋ก์จ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ณดํธํ๋ค. ์ด๋ ์ํ์ง ์๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ๊ฐ๋ค์ ๋ณดํธํ๋ ๋ฐ ํ์์ ์ด๋ค. ๋ฐ๋ฉด, 'Call by Reference'๋ ์๋ณธ ๋ฐ์ดํฐ์ ์ง์ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ๋ฅผ ์๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ ํ ๋ ์ ์ฉํ๋ค. ์ด ๋ ๋ฐฉ์์ ์ ์ ํ ์ฌ์ฉํจ์ผ๋ก์จ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ ๋์ผ ์ ์๋ค.
2. ๋ฉ๋ชจ๋ฆฌ์ ์ฑ๋ฅ ์ต์ ํ
ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ํ๋ก๊ทธ๋จ์์ 'Call by Value' ๋ฐฉ์์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๊ณ , ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ์ค ์ ์๋ค. ๋ฐ๋ฉด, 'Call by Reference'๋ ๋ฐ์ดํฐ์ ๋ณต์ฌ๋ณธ์ ์์ฑํ์ง ์๊ณ ์ง์ ์ฐธ์กฐํ์ฌ ์์
ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
3. ์ ์ง๋ณด์์ ์ฉ์ด์ฑ
ํจ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฃจ๋์ง ๋ช
ํํ ์ดํดํ๋ฉด, ์ฝ๋์ ๊ฐ๋
์ฑ์ด ํฅ์๋๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค. ํนํ, ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ์์
ํ๋ ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ์ด๋ฌํ ์ดํด๊ฐ ํ๋ก์ ํธ์ ์ฑ๊ณต์ ๊ฒฐ์ ์ ์ธ ์ญํ ์ ํ ์ ์๋ค.
โญ1. Call by Value (๊ฐ์ ์ํ ํธ์ถ)โ
Call by Value๋ ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ ๋ ์ธ์์ ์ค์ ๊ฐ์ ๋ณต์ฌํ์ฌ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค. ์ด ๊ฒฝ์ฐ, ํจ์ ๋ด๋ถ์์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํด๋ ์๋ ๋ณ์์ ๊ฐ์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
#include <stdio.h>
void addTen(int a) {
a += 10;
printf("Inside addTen: %d\n", a);
}
int main() {
int num = 5;
addTen(num);
printf("In main: %d\n", num); // num ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์
return 0;
}
์ด ์์์์ addTen ํจ์๋ num ๋ณ์์ ๊ฐ์ 10 ์ฆ๊ฐ์ํค๋ ค ์๋ํ์ง๋ง, num์ ๊ฐ์ main ํจ์ ๋ด์์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
โญ2. Call by Reference (์ฐธ์กฐ์ ์ํ ํธ์ถ)
Call by Reference๋ ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ ๋ ์ธ์์ ์ฃผ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค. ๋ฐ๋ผ์ ํจ์ ๋ด์์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด, ๊ทธ ๋ณ๊ฒฝ์ฌํญ์ด ์๋ณธ ๋ณ์์๋ ๋ฐ์๋๋ค.
#include <stdio.h>
void addTen(int *a) {
*a += 10;
printf("Inside addTen: %d\n", *a);
}
int main() {
int num = 5;
addTen(&num);
printf("In main: %d\n", num); // num ๊ฐ์ด ๋ณ๊ฒฝ๋จ
return 0;
}
์ด ์์์์๋ addTen ํจ์๊ฐ num ๋ณ์์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐ์, ๊ทธ ๊ฐ์ ๋ณ๊ฒฝํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, main ํจ์ ๋ด์ num ๊ฐ๋ ๋ณ๊ฒฝ๋๋ค.
โญ3. ์ฐจ์ด์
- Call by Value๋ ๊ฐ์ ๋ณต์ฌ๋ณธ์ ์์ ํ๋ฏ๋ก ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ ์ ์๋ค. ํ์ง๋ง, ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- Call by Reference๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ฌํ๋ฏ๋ก, ๋ฐ์ดํฐ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ง ์์ ์ฑ๋ฅ์ด ๋ ์ข๋ค. ํ์ง๋ง, ํจ์ ๋ด์์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก ์ฃผ์๊ฐ ํ์ํ๋ค.
โญ4. ์ฅ๋จ์
- Call by Value
- ์ฅ์ : ์๋ณธ ๋ฐ์ดํฐ ๋ณดํธ
- ๋จ์ : ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ๋ ๋นํจ์จ์
- Call by Reference
- ์ฅ์ : ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ ํจ์จ์ฑ
- ๋จ์ : ์๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ์ํ์ฑ
'๐ท C์ธ์ด 30๊ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C/C++ Tip] 12. ํฌ์ธํฐ๊ฐ ํท๊ฐ๋ฆด ์ ๋ฐ์ ์๋ ์ด์ : ๋ณ(*)์ ์ข ๋ฅ์ ์ ์ฒด (1) | 2024.09.21 |
---|---|
[C/C++ Tip] 11. C์ธ์ด ํฌ์ธํฐ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ (1) | 2024.09.19 |
[C/C++ Tip] 9. memset, memcpy (0) | 2024.09.08 |
[C/C++ Tip] 8. ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ (0) | 2024.09.07 |
[C/C++ Tip] 7. ๋ฐฐ์ด์ ๊ธฐ์ด (1) | 2024.09.04 |