C언어

[C언어] Call by Value, Call by Reference란?

_minit 2024. 11. 4. 14:17

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