함수 호출 방법은 크게 두가지가 있다.
- Call by value(값에 의한 호출)
- Call by reference(참조에 의한 호출)
이를 설명하기 위해, 많은 교재에서는 그림으로 예시를 들고 있다. 예를 들어, 컵에 물을 채워서 이 물을 직접 가져다가 다른 컵에서 사용하느냐, 아니면 똑같은 컵과 물을 한 컵 더 준비하여 사용을 하느냐라는 식이다. 언뜻 보면 이해가 쉬울 수 있지만, 오히려 헷갈릴 수가 있다. 이는 프로그래밍적으로 직접 접근해서 알아보는 것이 가장 확실하다.
Call by value(값에 의한 호출)는 인자로 받은 값을 복사하여 처리를 한다. Call by reference(참조에 의한 호출)는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다. 간단히 말해 값을 복사를 하여 처리를 하느냐, 아니면 직접 참조를 하느냐 차이인 것이다.
프로그래밍 구조상 Call by value(값에 의한 호출)를 하면 복사가 되기 때문에 메모리량이 늘어난다. 요즘에는 기기의 성능이 좋아져서 상관이 없다지만 많은 계산이 들어간다면 과부하의 원인이 된다. 하지만 복사처리가 되기 때문에 원래의 값은 영향을 받지 않아서 안전하다.
개념
Call by value (값에 의한 호출)
- 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
- 단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.
Call by reference (참조에 의한 호출)
- 장점 : 복사하지 않고 직접 참조를 하기에 빠르다.
- 단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.(리스크)
예제
1. Call by value (값에 의한 호출)
#include <stdio.h>
private void swap(int num1, int num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
private void main()
{
int a = 20, b = 60;
swap(a, b);
printf("a: %d, b: %d", a, b);
}
swap()에서 값만 받아와서 내부적으로 처리를 하고 아무 것도 넘기지를 않는다. 변수를 주소로 가져오거나 포인터로 통해서 가져온 것이 아니기 때문에, 새로운 변수를 만들어서 값을 대입해서 처리한 것이다. 이 경우 교체는 되지 않고 swap() 내부에서만 처리가 된다. 반환형이 없기에 사실상 위에서는 의미 없는 행동을 했다. 만일 swap()이 아닌 다른 함수로 리턴 값을 넣었다면, 안정적으로 처리를 해서 결과를 도출해준다. 하지만 swap()의 경우 이런 방법으로 사용하면 잘못된 방법이다.
2. Call by reference (참조에 의한 호출)
#include <stdio.h>
private void swap(int &num1, int &num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
private void main()
{
int a = 20, b = 60;
swap(a, b);
printf("a: %d, b: %d", a, b);
}
마무리
swap()에서 main()의 a, b 주소를 가져와서 처리를 했다. 직접 주소 가져와서 처리를 했기 때문에 swap()의 내부 처리로도 a, b가 교체가 되었다. 이렇게 보듯 단점으로는 주소나 포인터를 사용하면 직접 변수에 접근하기 때문에 리스크가 있다.
이러한 개념을 이해하고 함수의 필요한 데이터의 상관 관계를 이해를 하여 만들어주면 좋겠다. 효율적으로 만들 수가 있느냐 마느냐 차이가 생긴다.
해당 글은 과거 블로그에서 발췌하여 그대로 가져온 글입니다.
'Study' 카테고리의 다른 글
Unity, 배경 스크롤링(Background Scrolling) (0) | 2022.09.28 |
---|---|
Unity, 오브젝트 풀링(Object Pooling) (0) | 2022.09.27 |
프로그램의 정확 시간 측정이 어려운 이유와 해결 방법 제시 (0) | 2022.08.16 |
C#, 우선순위 큐 개념과 힙을 통한 구현 (1) | 2022.07.10 |
C#, Enum 'Flags' Technic (0) | 2022.02.28 |
댓글