Call by Value, Call by Reference는 함수 호출 방식의 두 가지 방법으로, 함수에 전달되는 매개변수가 원본 데이터에 영향을 미치는지 여부에 따라 구분된다.
Call by Value ( 값에 의한 호출 )
- 함수에 매개변수의 값을 복사하여 전달한다.
- 함수 내부에서 매개변수의 값을 변경해도 원본 데이터에는 영향을 주지 않는다.
- C언어에서는 기본적으로 Call by Value 방식이 사용된다.
#include <stdio.h>
void add_ten(int num) {
num += 10;
printf("Inside function: %d\n", num); // 20
}
int main() {
int x = 10;
add_ten(x);
printf("After function call: %d\n", x); // 10
return 0;
}
위 코드에서 x의 값은 add_ten 함수 내부에서 20으로 변경되지만, 함수가 종료되면 원래 값 10은 그대로 유지된다.
Call by Reference ( 참조에 의한 호출)
- 함수에 변수의 주소(포인터)를 전달하여, 함수 내부에서 원본 데이터를 직접 수정할 수 있도록 한다.
- 함수가 매개변수를 변경하면 원본 데이터에도 영향을 준다.
- C언어에서는 Call by Reference가 직접적으로 지원되지 않으므로 포인터를 사용하여 구현하여야 한다.
#include <stdio.h>
void add_ten(int *num) {
*num += 10;
printf("Inside function: %d\n", *num); // 20
}
int main() {
int x = 10;
add_ten(&x); // x의 주소를 전달
printf("After function call: %d\n", x); // 20
return 0;
}
C언어는 Call by Reference를 지원하지 않는다.
함수에 전달된 인자는 원래 변수의 복사본이기 때문에, 함수 내부에서 인자를 변경해도 원래 변수의 값에는 영향이 없다.
그렇다면 C에서는 어떻게 Call by Reference와 같은 효과를 낼 수 있을까? 이를 위해 포인터를 사용할 수 있다. 포인터는 변수의 메모리 주소를 저장하며, 이를 통해 함수가 원래 변수에 직접 접근할 수 있게 된다.
즉, 변수의 주소를 함수에 전달하고, 함수는 이 주소를 이용해 원래 값을 변경함으로써 Call by Reference와 같은 동작을 구현할 수 있다.
왜 C는 Call by Reference를 지원하지 않을까?
C 언어는 간결함과 직관성을 중시하는 저수준 프로그래밍 언어이다. Call by Value는 값을 복사하여 전달하기 때문에 직접적인 메모리 접근을 막아 잠재적인 오류를 줄일 수 있다. 반면 Call by Reference는 함수가 원래 변수에 접근해 값을 변경할 수 있으므로, 의도치 않은 부작용(side effect)이 발생할 수 있다. 따라서 C언어에서는 포인터를 사용해 필요할 때에만 이러한 참조 접근을 가능하게 하여 개발자가 이를 명시적으로 관리하도록 설계되었다.
728x90
'C언어' 카테고리의 다른 글
[C언어] strcmp() 함수 (1) | 2024.11.07 |
---|---|
[C언어] NULL과 null (7) | 2024.11.04 |
[C언어] 메모리 누수(Memory Leak)란? (0) | 2024.10.29 |
[C언어] 래퍼 함수(Wrapper Function)란? (1) | 2024.10.28 |
[C언어] extern란? (0) | 2024.10.28 |