Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 값에 의한 호출(Call by Value) 개념과 swap 함수 예제 총정리

값에 의한 호출(Call by Value)은 함수를 호출할 때 인수의 값 자체를 복사하여 전달하는 방식입니다. 이 방식에서는 함수 내부에서 매개변수가 아무리 변경되더라도, 호출한 쪽의 원본 변수에는 전혀 영향을 주지 못합니다.

값에 의한 호출 알고리즘

다음은 값에 의한 호출의 동작 과정을 단계별로 정리한 알고리즘입니다.

1단계: 실행 시점에 임의의 숫자 2개를 입력받는다
2단계: 콘솔로부터 두 숫자를 읽어들인다
3단계: swap 함수를 값에 의한 호출 방식으로 호출한다
4단계: 호출된 함수 swap(int a, int b)로 제어가 넘어간다
5단계: 교환 후의 숫자를 출력한다

C 언어 예제 코드

다음은 값에 의한 호출 방식으로 두 숫자를 교환하려는 C 프로그램 예제입니다.

#include<stdio.h>
void main(){
    void swap(int,int);
    int a,b;
    clrscr();
    printf("enter 2 numbers");
    scanf("%d%d",&a,&b);
    printf("Before swapping a=%d b=%d",a,b);
    swap(a,b);
    printf("after swapping a=%d, b=%d",a,b);
    getch();
}
void swap(int a,int b){
    int t;
    t=a;
    a=b;
    b=t;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

enter 2 numbers 10 20
Before swapping a=10 b=20
After swapping a=10 b=20

왜 값이 서로 바뀌지 않았을까?

출력 결과를 보면 swap 함수를 호출했음에도 불구하고 두 값이 그대로 유지된 것을 확인할 수 있습니다. 그 이유는 다음과 같습니다.

  • swap(a, b)가 호출되는 순간, main 함수의 a와 b에 저장된 값 10과 20이 복사되어 함수의 매개변수 a, b에 전달됩니다.
  • 함수 내부에서 세 번째 변수 t를 이용해 두 값이 실제로 교환되지만, 이는 어디까지나 복사본일 뿐입니다.
  • 함수가 종료되면 매개변수 a, b는 메모리에서 소멸하고, main 함수의 원본 변수는 처음 값 그대로 남게 됩니다.

따라서 함수 내부에서 원본 변수의 값을 실제로 변경하고 싶다면, 주소를 전달하는 참조에 의한 호출(Call by Reference), 즉 포인터를 사용해야 합니다.

참고 사항

위 코드의 clrscr()getch()는 구형 Turbo C 컴파일러에서 제공하는 함수입니다. GCC 같은 최신 컴파일러 환경에서는 해당 함수들을 제거하거나 대체하여 사용하는 것이 좋습니다.