값 전달 방식의 이해 — 값에 의한 호출(Call by Value)의 원본과 복사본, 그 한계 | 기초 C언어 9.2.3
기초 C언어Chapter 09 함수 › Section 02 사용자 정의 함수의 유형과 값 전달
9.2.3 값 전달 방식의 이해
인수로 쓴 변수의 값만 복사해 매개변수에 넘기는 값에 의한 호출. 함수 안에서 매개변수를 바꿔도 원본 변수가 그대로인 결과와 그 한계.
영상 목차 · 원하는 부분부터 보기
01복사되어 전달된다는 말교재 287p
- 9.1.2의 add(5, 3) 동작 순서에서 ‘a에는 5, b에는 3이 복사되어 전달’된다는 표현을 이미 지나옴. 이번 편은 그 복사의 뜻을 다룸.
- 함수에 변수를 인수로 전달할 때 C언어가 기본으로 사용하는 방식이 값에 의한 호출(Call by Value). 인수가 매개변수로 넘어갈 때 실제로 건너가는 것이 무엇인지 확인.
02값만 복사하여 매개변수에 전달교재 287p
- 함수를 호출할 때 인수로 사용된 변수의 값(value)만 복사하여 함수의 매개변수에 전달하는 방식.
- 원본 변수 자체를 넘기는 것이 아니라 그 값을 복사한 복사본을 전달하는 것과 같음. 원본은 인수로 쓴 변수, 복사본은 함수의 매개변수.
원본에서 복사본으로 건너가는 것은 값뿐
호출하는 순간 원본 변수의 값이 매개변수에 복사되고, 그 뒤로 두 변수는 서로 연결되지 않음. 매개변수에 무엇을 대입해도 호출한 쪽 변수에는 전달되지 않음.
03복사기로 견준 값에 의한 호출교재 287~288p
| 비유 | 실제 |
|---|---|
| 원본 문서 | main 함수의 원본 변수 |
| 복사본 | 복사된 값을 받은 매개변수 |
| 복사본에 낙서·수정 | 매개변수 값 변경 |
| 작업 후 복사본 파기 | 함수 종료와 함께 매개변수 소멸 |
- main 함수는 원본 문서를 직접 넘기지 않고 복사본만 건넴. 호출된 함수가 복사본을 마음껏 고쳐도 원본 문서는 손상되지 않은 채 그대로 남음.
04CODE 9.13 — 10을 더하는 add_ten교재 288p
- main의 a를 5로 초기화한 뒤 add_ten(a)를 호출. add_ten 함수는 매개변수 a에 10을 더해 출력.
- 실행 결과는 호출 전 5 · 함수 안 15 · 호출 후 5의 세 줄. 함수 안에서 바뀐 값이 main의 a에는 반영되지 않음. 상세 코드는 교재 CODE 9.13에서 확인.
이름이 같아도 별개의 변수
main의 a와 add_ten의 매개변수 a는 이름만 같은 서로 다른 변수. 호출할 때 건너가는 것은 값 5뿐이므로 매개변수 a가 15가 되어도 원본 a는 5로 유지됨.
05두 변수 a의 값 변화교재 288~289p
| 단계 | main의 a (원본) | add_ten의 a (복사본) |
|---|---|---|
| 호출 직후 | 5 | 5 |
| a = a + 10; 실행 후 | 5 | 15 |
| add_ten 종료 후 | 5 | 메모리에서 사라짐 |
- 복사본인 매개변수는 함수가 끝나면 메모리에서 사라짐. 실행 흐름이 main으로 돌아왔을 때 원본 a는 아무런 영향을 받지 않은 채 여전히 5.
06값에 의한 호출의 한계와 9장 마무리교재 289p
- 값에 의한 호출로는 함수 안에서 함수 밖의 원본 변수 값을 직접 수정할 수 없음.
- 데이터를 안전하게 보호한다는 장점이 있지만, 두 변수의 값을 서로 바꾸는 swap 함수처럼 원본을 직접 바꿔야 하는 경우에는 한계로 작용. 함수 안에서 두 복사본을 맞바꿔도 main의 두 원본은 그대로.
- 보호와 한계는 같은 성질의 양면. 원본에 손대지 못하므로 안전하고, 같은 까닭으로 원본을 바꾸는 일도 맡길 수 없음.
- 9장에서는 함수의 기초, 정의와 호출, 실행 흐름과 함수 원형, 반환값과 매개변수, 네 가지 유형, 값에 의한 호출을 학습. 원본을 직접 바꾸는 방법인 포인터와 주소에 의한 호출은 다음 10장에서 다룸.
이 절의 핵심 정리
- C언어는 함수에 변수를 인수로 전달할 때 기본적으로 값에 의한 호출 방식을 사용한다.
- 값에 의한 호출은 인수로 쓴 변수의 값만 복사하여 매개변수에 전달한다.
- 매개변수는 원본 변수와 이름이 같아도 별개의 변수이며 함수가 끝나면 메모리에서 사라진다.
- 함수 안에서 매개변수 값을 바꿔도 main 함수의 원본 변수 값은 변하지 않는다.
- 값에 의한 호출로는 함수 밖의 원본 변수를 직접 수정할 수 없으며, 이 한계는 10장의 포인터로 이어진다.
강의 자료9.2.3 값 전달 방식의 이해
1 / 11
번호를 누르면 해당 장으로 바로 이동합니다 · 방향키 ← → 로도 넘길 수 있습니다

댓글
댓글 쓰기