본문 바로가기
프로그래밍/C

[C언어] call by value 와 call by reference 차이 완전 정리 (시험 단골 주제)

by 아임코딩 2026. 8. 13.
반응형

1. Call by value (값에 의한 호출)란?

Call by value는 함수를 호출할 때 변수에 들어있는 '값'을 복사해서 전달하는 방식입니다.

  • 특징: 함수 내부에서 매개변수의 값을 변경하더라도, 함수를 호출한 원본 변수의 값은 전혀 변하지 않습니다.
  • 이유: 함수가 호출될 때 매개변수를 위한 별도의 메모리 공간이 새로 할당되고, 전달받은 값만 복사되어 들어가기 때문입니다.

💻 Call by value 예제 코드

C
 
#include <stdio.h>

void modifyValue(int a) {
    a = 999; // 매개변수의 값을 변경
}

int main() {
    int x = 10;
    
    modifyValue(x); // x의 '값(10)'을 복사해서 전달
    
    printf("x의 값: %d\n", x); // 출력 결과: 10
    return 0;
}
  • 설명: modifyValue(x)를 실행할 때 x의 값인 10만 복사되어 함수 내부의 a로 들어갑니다. 따라서 함수 안에서 a = 999로 바꿔도 원본 x는 여전히 10입니다.

2. Call by reference (참조에 의한 호출)란?

Call by reference는 함수를 호출할 때 변수의 값이 아니라 '메모리 주소'를 전달하는 방식입니다. C언어에서는 포인터(Pointer)를 사용하여 이를 구현합니다.

  • 특징: 함수 내부에서 매개변수를 통해 접근하여 값을 변경하면, 원본 변수의 값도 실제로 변경됩니다.
  • 이유: 주소를 직접 전달받았기 때문에, 함수 내부에서 원본 변수의 메모리 공간을 직접 가리키고 제어할 수 있기 때문입니다.

💻 Call by reference 예제 코드

C
 
#include <stdio.h>

void modifyReference(int *a) {
    *a = 999; // 주소가 가리키는 곳의 값을 변경
}

int main() {
    int x = 10;
    
    modifyReference(&x); // x의 '메모리 주소'를 전달
    
    printf("x의 값: %d\n", x); // 출력 결과: 999
    return 0;
}
  • 설명: &x를 통해 x의 메모리 주소를 넘겨주었습니다. 함수에서는 포인터 int *a로 주소를 받아 *a = 999로 해당 주소의 값을 직접 바꿨기 때문에 원본 x가 999로 변경됩니다.

3. 한눈에 비교하는 차이점 (시험 핵심 요약)

시험 문제에 자주 등장하는 핵심 포인트를 표로 정리해보았습니다.

구분 Call by value (값에 의한 호출) Call by reference (참조에 의한 호출)
전달하는 내용 변수의 실제 값 변수의 메모리 주소 (C언어는 포인터 사용)
메모리 동작 새로운 메모리 공간 생성 후 값 복사 원본 변수의 메모리 주소를 직접 참조
원본 값 영향 원본 변수 변경 없음 원본 변수 함께 변경됨
주요 용도 단순 계산, 원본 보호가 필요할 때 두 변수의 값을 바꾸는 swap() 함수, 원본 수정이 필요할 때

4. 시험 출제 포인트 & 요약

  • Q. 함수를 실행한 후에도 main 함수의 변수 값이 바뀌지 않았다면?
  • 👉 Call by value 형태로 호출되었기 때문입니다.
  • Q. 두 변수의 값을 서로 바꾸는 swap() 함수를 올바르게 구현하려면?
  • 👉 반드시 주소를 전달하는 Call by reference (포인터) 방식을 사용해야 원본 값이 바뀝니다.
반응형