그냥 게임개발자

값에 의한 호출, 참조에 의한 호출 본문

내 개인적인 공부/자료구조

값에 의한 호출, 참조에 의한 호출

sudoju 2024. 4. 14. 23:02

우리가 함수에 매개변수를 넣어 매개변수를 사용합니다.

 

근데 이와 같은 코드는 어떤가요?

 

값에 의한 호출

#include <iostream>

using namespace std;

int add(int a, int b)
{
    a += 10;
    cout << a << '\n';
    return a + b;
}

int main()
{
    int a = 1;
    int b = 1;
    
    int sum = add(a, b);		// 11
    cout << a << '\n';			// 1
    
    return 0;
}

이와 같이 함수에서 받은 매개변수로 전달된 값들은 다른 주소를 가지기에 이러한 결과가 나옵니다.

분명 함수에서는 a에다가 10을 더했는데 왜 실제 main함수에서는 1이그대로일까요?

 

그것은 값에 의한 호출때문입니다.

애초에 함수에 매개변수를 전달할 때 함수 내부에서 매개변수가 복사가 되는 형식으로써 다른 주소를 가집니다.

새로 생긴거라고 보면 되죠.

그 새로 생긴 값으로 계산을 하고 그 함수를 빠져나갈 때 복사된 변수들은 사라지게 됩니다.

 

그렇다면 실제로 값을 바꾸고 싶을 때는 어떻게 전달을 해야 할까요?

 

 

참조에 의한 호출

 

#include <iostream>

using namespace std;

int add(int& a, int& b)
{
    a += 10;
    cout << a << '\n';
    
    return a + b;
}

int main()
{
    int a = 1;
    int b = 2;
    int sum = add(a, b);	//11
    cout << a << '\n';		//11
    
    return 0;
}

이러한 방식으로 참조에 의한 호출로 인해 실제 a라는 변수의 주소를 넘겨주어 사용하게 됩니다.

그러면 실제 a의 주소를 받아 참조하기 때문에 실제 main에 있는 a에 값이 변경이 되는 겁니다.

 

 

쉽죠?

 

참조에 의한 호출로 넘겨야 할 때

primitive한 타입은 값에 의한 호출로 넘기는 것이 좋습니다.

복사가 일어난다해도 엄청난 코스트가 들지 않기 때문입니다.

오히려 함수 내부에서 직접적으로 참조할 수 있기에 더 빠릅니다.

 

하지만 reference한 타입중에 복잡한 struct나 많은 요소를 가진 배열 같은 컨테이너들은 참조로 넘기는 것이 좋습니다.

왜냐하면 엄청난 데이터들이나 복잡한 struct라면 그만큼 복사하는데 코스트가 들기 때문입니다.

 

 

끄읕

'내 개인적인 공부 > 자료구조' 카테고리의 다른 글

Array요소 수정 방법들  (0) 2024.04.15
재귀함수  (0) 2024.04.15
primitive 타입, reference 타입  (0) 2024.04.14
자료구조 시간 복잡도  (0) 2024.04.14
operator()  (0) 2024.04.14