C 언어/멘토링

[C 언어/멘토링] Call by Value와 Call by Refernce

luckyd8 2025. 5. 15. 17:57

 

Call by Value와 Call by Refernce는 C언어의 호출 방법이다.

 

1. Call by Value (값에 의한 호출)

: 값 자체를 함수에 복사해서 전달

- 함수 안에서 값이 변경되어도, 원래 변수에는 영향이 없다.

#include <stdio.h>

int sum(int x, int y) {  // a의 값(10)이 x에 전달, b의 값(20)이 y에 전달
    return x + y;
}

int main() {
    int a = 10;
    int b = 20;
    printf("%d\n", sum(a, b));  // a: 10, b: 20
}

 

 main 함수가 먼저 실행되어 sum 함수를 호출한다.

  •  a, b값이 복사되어 x와 y에 전달
  • x = 10, y = 20 이 되어 return x + y = 30을 반환

 

 

2. Call by Reference (참조에 의한 호출)

: 변수의 주소(포인터)를 함수에 전달

- 함수 안에서 주소를 통해 원래 변수의 값을 변경 가능하다.

#include <stdio.h>

int sum(int* x, int* y) {
    return *x + *y;   // x가 가리키는 값(a) + y가 가리키는 값(b) → 10 + 20 = 30
}

int main() {
    int a = 10;
    int b = 20;

    printf("%d\n", sum(&a, &b));
}

 

 main 함수가 먼저 실행되어 sum 함수를 호출한다.

  • a, b값의 주소를 x, y에 전달
  • x는 a 주소, y는 b 주소를 포함
  • sum 함수의 매개변수 x, y는 각각 a와 b의 주소를 저장하는 포인터 변수가 됨

 

Call by Value과 Call by Reference의 차이점

구분 Call by Value Call by Reference
전달하는 것 변수의 값 변수의 주소
함수에서 변경 여부 불가능 (복사본 사용) 가능 (실제 메모리에 접근)
변수 선언 일반 변수 사용 : 변수 int p 포인터(*) 사용 : 변수(int *p)
함수 호출 변수(x) 변수(&x)

 

 

 

3. 함수 구현하기 (실습)

 

- 사용자에게 a, b값을 받은 후, 두 값을 바꾸는 함수

  • 함수의 반환은 void
  • 값 바꾼 후 main 함수에서 출력
  • a 값과 b 값은 main 함수 내부에서 생성된 지역 변수여야 함

 

Call by Value는 변수의 값 변경이 불가능하기 때문에 조건에 맞는 함수를 구현할 수 없다.

더보기
더보기

Call by Value 방식을 사용 못하는 이유

 

두 변수의 값을 바꾸기 위해서는, swap 함수 안에서 함수 바깥(main 함수)의 변수 값을 직접 변경해야 함

그러나 Call by Value 방식은 변수의 '값'만 복사해서 함수로 전달함

즉, 함수 내부에서 아무리 값을 바꿔도 main 함수의 변수에는 영향을 주지 못함

만약 값을 바꾸고 싶다면, 바뀐 값을 return으로 main 함수로 돌려줘야 함, 하지만 변환형 void는 return을 허용하지 않음

따라서 Call by Value 방식으로는 불가능, Call by Reference 방식으로 접근해야 함

따라서 Call by Reference 방식으로 구현했다.

#include <stdio.h>

void swap(int *x, int *y) {
	int temp = *x;
	*x = *y;
	*y = temp;
}

int main() {
	int a, b;

	scanf_s("%d", &a);
	scanf_s("%d", &b);
    
	swap(&a, &b);
	printf("%d %d", a, b);
}

 

  

 

1) 두 변수의 값을 서로 교환하는 함수를 설정한다.
이 부분은 개념이 잘 떠오르지 않아 swap() 함수에 대해 따로 찾아보았다.

swap() 함수는 두변수의 값을 서로 교환하는 함수로, 주로 포인터를 통해 각 변수의 실제 메모리 값을 변경하는 방식으로 동작한다.

 

이번 문제에서는 두 변수의 값을 교환하기 위해 swap() 함수를 사용했다. 문제 조건에 따라 swap() 함수의 반환형은 void로 설정하였다.

함수 내부에서는 다음과 같은 과정을 통해 값이 교환된다.

   1. x가 가리키는 값을 임시 변수 temp에 저장한다.

   2. y가 가리키는 값을 x에 대입한다.

   3. temp에 저장된 값을 y에 대입한다.

이 과정을 통해 두 변수 x, y의 값이 성공적으로 바뀌게 된다.

 

2) 사용자의 입력값을 받는 함수를 설정한다.

main() 함수에서는 사용자로부터 a, b 값을 입력받는다.

이후 swap() 함수에 두 변수(a, b)의 주소(&a, &b)를 전달해 값을 교환하고, 교환된 결과를 pritf()를 통해 출력한다.