본문 바로가기
Programming/C++

[Modern C++ 공부 - Day3] 주소에 의한 전달 Pass by Address

by 롱일스 2023. 6. 15.
반응형

Modern C++ 공부 Day 2입니다.

오늘 공부할 내용은 함수 인자 전달 방식 중 하나인 Pass by Address입니다.

 

공부를 시작하기 전에 이전 글인 Pass by value 포스트를 먼저 읽고 오시면 본 글을 이해하는 데 도움이 되실 겁니다.

2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day2] 값에 의한 전달 Pass by value

 

[Modern C++ 공부 - Day2] 값에 의한 전달 Pass by value

Modern C++ 공부 Day 2입니다. 오늘 공부할 내용은 함수 인자 전달 방식 중 하나인 Pass by value입니다. 함수 인자의 전달 방식은 다양하게 존재하는데, 오늘은 그 중 pass by value에 대해 먼저 설명하겠습

huangdi.tistory.com

 

이전 포스트에서 Pass by value에 대해 알아보았습니다. 변수 x 값이 함수 test에 의해 변하지 않았죠. 만약 변수 x값을 함수 test를 통해 바꾸고 싶다면 Pass by Address 방법을 이용할 수 있습니다.

Pass by Address

Pass by Address는 말그대로 변수를 함수에 전달할 때 해당 변수의 주소를 전달하는 방식을 말합니다. 이 방식을 이용하여 전달된 변수의 원래 값에도 영향을 줍니다. 아래의 코드를 통해서 직관적으로 이해해봅시다.

void test(int *y) {   // 변수 y는 함수 호출자의 변수 x의 주소를 저장하는 포인터.
	*y = 7;           // y가 가리키는 주소 (즉, 변수 x의 주소)에 있는 값을 7로 변경.
}

int x = 5;
test(&x);             // 변수 x의 주소를 함수에 전달. 따라서, 변수 x의 값은 이제 7이 된다.
  1. 변수 y는 변수 x의 주소를 저장하는 포인터다.
  2. y 자체의 주소는 x의 주소와 다르지만, y가 가리키는 주소는 x의 주소와 동일하다.
  3. y가 가리키는 주소의 값을 참조하면, 변수 x가 있는 해당 메모리의 데이터를 반환한다.
  4. 그래서 그 데이터 값을 7로 바꾸면, 변수 x는 값 7을 가지게 된다.

 

이번에도 변수의 주소값과 데이터 값을 출력해서 더 명확하게 이해해  보도록 하겠습니다.

#include <iostream>
using namespace std;

int test(int *y) {
	cout << "변수 y의 주소는: " << &y << endl;
	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
변수 y의 값은: 0x61ff0c
변수 z의 주소는: 0x61ff08
함수 test 호출 후 변수 x값은: 20
함수 test 호출 후 변수 z값은: 20

출력값을 보면, 명확히 다음의 사실을 알 수 있습니다.

  1. 변수 x, y, z는 독립된 변수다.
  2. 변수 y의 값은 변수 x의 주소다. 즉, 변수 y는 변수 x의 주소값을 가진 포인터다.
  3. 함수 test에서 포인터 y를 통해 변수 x의 값을 직접적으로 바꿨다.
  4. 함수 test가 Pass by Address를 통해 인자를 받기 때문에 변수 x의 값이 함수 test 호출 후 변화된다.

 

요약

  • Pass by Address는 함수에 인자로 변수의 주소가 전달된다. 
  • 이 주소는 함수 내부에서 새로운 포인터 변수로 저장되며, 이 포인터 변수는 원본 변수를 가리킨다.
  • 함수 내부에서 이 포인터를 사용해 원본 변수의 값을 읽거나 변경할 수 있다.
  • 포인터를 통해 원본 변수에 접근하기 때문에, 원본 변수의 값이 함수 내부에서 변경될 경우 이 변경이 원본 변수에 반영됩니다.
  • Pass by Address 방식을 사용하면 원본 변수를 변경할 필요가 있거나, 큰 데이터 구조를 복사하는 비용을 피하고 싶을 때 유용하게 사용될 수 있다. 

 

지금까지 Pass by Address에 대해서 알아봤습니다.

다음 포스트에서는 Pass by Reference  참조에 인한 전달에 대해 알아보겠습니다.

2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by Reference

 

[Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by Reference

Modern C++ 공부 Day 4입니다. 오늘 공부할 내용은 함수 인자 전달 방식 중 하나인 Pass by Reference입니다. Pass by Reference Pass by Reference는 변수를 함수에 전달할 때 해당 변수의 참조(reference)를 전달하는

huangdi.tistory.com

 

728x90
반응형