Modern C++ 공부 Day 2입니다.
오늘 공부할 내용은 함수 인자 전달 방식 중 하나인 Pass by value입니다.
함수 인자의 전달 방식은 다양하게 존재하는데, 오늘은 그 중 pass by value에 대해 먼저 설명하겠습니다.
이전 포스트를 보고 오시면 도움이 됩니다.
2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day1] 지역 변수 local variable
Pass by value
Pass by value는 변수를 함수에 전달할 때 해당 변수의 복사본을 생성하는 방식을 말합니다. 이렇게 복사된 변수는 함수의 범위 내에서 지역 변수로 사용되며, 원래 변수의 값에는 영향을 주지 않습니다. 함수에서 반환(return)되는 값도 본래의 변수가 아닌 그 복사본입니다. 이로 인해 함수 외부에 있는 원본 변수의 값이 보호되는 장점이 있습니다. 아래의 코드를 통해서 직관적으로 이해해봅시다.
int test(int y) { // y는 test함수 내에서 지역변수이고, 함수 호출자의 변수 x의 복사본
return y;
}
int x = 2;
int z = test(x); // z는 함수 test의 반환자의 복사본이다.
위의 코드를 맨 윗줄부터 차례로 살펴봅시다.
- int test(int y): 함수 test를 정의합니다. 이 때 함수에 전달되는 인자인 변수 y는 함수 test 내에서 지역변수입니다.
- return y: 함수 test에서 변수 y를 반환할 때 y의 복사본이 전달됩니다.
- int x = 2: 변수 x를 2로 초기화합니다.
- int z = test(x): 함수 test를 호출하고 함수의 인자로 변수 x의 복사본이 전달됩니다. 즉 함수 test에서 변수 y는 변수 x의 복사본이 됩니다. 변수 z는 함수 test의 반환자인 y의 복사본이 됩니다.
위의 설명이 더 납득이 가도록 아래의 코드를 통해 변수들이 서로의 복사본인지 아닌지를 확실히 알아보겠습니다.
각 변수의 주소를 출력해서 만약 변수들의 주소값이 동일하다면 같은 변수라는 의미이고 주소값이 다르다면 같은 변수가 아니라는 의미이니 복사본이라는 걸 알 수 있습니다.
#include <iostream>
using namespace std;
int test(int y) {
cout << "변수 y의 주소는: " << &y << endl;
y = 20;
return y;
}
int main() {
int x = 10;
cout << "변수 x의 주소는: " << &x << endl;
int z = test(x);
cout << "변수 z의 주소는: " << &z << endl;
cout << "함수 test 호출 후 변수 x값은: " << x << endl;
cout << "함수 test 호출 후 변수 z값은: " << z << endl;
return 0;
}
위 코드를 컴파일하면 다음과 같은 출력값이 나옵니다.
변수 x의 주소는: 0x61ff0c
변수 y의 주소는: 0x61fef0
변수 z의 주소는: 0x61ff08
함수 test 호출 후 변수 x값은: 10
함수 test 호출 후 변수 z값은: 20
출력값을 통해 알 수 있듯이,
- 변수 x, y, z는 모두 다 다른 주소값을 가진 각기 다른 변수이고,
- 변수 x값을 함수에 전달했어도 복사본이 전달되기 때문에 함수 외부에 있는 변수 x의 값에는 전혀 변화가 없다.
요약
- Pass by value는 변수를 함수에 전달할 때 해당 변수의 복사본을 생성하는 방식.
- 이렇게 복사된 변수는 함수의 범위 내에서 지역 변수로 사용되며, 원래 변수의 값에는 영향을 주지 않습니다.
- 함수에서 반환(return)되는 값도 본래의 변수가 아닌 그 복사본입니다.
- 함수 외부에 있는 원본 변수의 값이 보호되는 장점이 있습니다.
지금까지 Pass by value에 대해서 알아봤습니다.
다음 포스트에서는 Pass by Address 주소에 인한 전달에 대해 알아보겠습니다.
다음 글로 바로가기!!
2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day3] 주소에 의한 전달 Pass by Address
'Programming > C++' 카테고리의 다른 글
[Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by Reference (0) | 2023.06.15 |
---|---|
[Modern C++ 공부 - Day3] 주소에 의한 전달 Pass by Address (0) | 2023.06.15 |
[Modern C++ 공부 - Day1] 지역 변수 local variable (0) | 2023.06.15 |
[Modern C++ 공부 - Day0] C++11, 14, 17는 뭐가 다를까? (1) | 2023.06.15 |
C++ 언어 기초 (16) - 예외처리 exception (0) | 2020.09.07 |