반응형
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 (포인터) 방식을 사용해야 원본 값이 바뀝니다.
반응형
'프로그래밍 > C' 카테고리의 다른 글
| [C언어/C++] 메모리 동적 할당 malloc/free vs new/delete 차이점 완전 정리 (시험 단골 주제) (0) | 2026.08.13 |
|---|---|
| [C언어/C++] 구조체(struct)와 클래스(class)의 차이점 완전 정리 (시험 단골 주제) (0) | 2026.08.13 |
| [C언어] 포인터를 이용한 swap 함수 구현 (1) | 2024.04.29 |
| [C언어] 조건문 if else 구문 (1) | 2024.01.27 |
| [C언어] 조건문 if (0) | 2024.01.27 |