티스토리 뷰

※ 본 포스팅은 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.


함수의 호출 방법에는 Call by value (값에 의한 호출) Call by reference (참조에 의한 호출) 두 가지의 방식이 있다. 우선 Call by value의 이해를 돕기 위한 간단한 그림을 준비했다.





우선 메인 함수에서 int n 을 선언하였다. 이는 메모리 상에 n 변수의 구역을 만들어 값으로 10을 저장한다.(그림 상의 1) 그리고 나서 func 함수를 호출 할 때 변수 n은 인자로써 사용된다. 그러면 호출된 함수 func는 메인 함수에서 인자 값을 넘겨 받게 되는데(2), 이 때 func 함수는 메인 함수의 변수 n의 데이터() 만을 가져다가 메모리에 새로운 공간을 만들어 데이터()을 저장하게 된다. 그리고 나서 func 함수는 n의 값을 20으로 수정하게 된다.(3) 하지만 메인 함수의 변수 n func 함수의 변수 n은 메모리상 다른 위치에 상주해 있으므로 직접적인 연관이 없다. 따라서 func 함수가 종료됨과 동시에 func 함수의 변수 n은 소멸하게 된다. 따라서 메인 함수로 돌아와 출력되는 printf 의 값은 메인 함수의 변수 n값인 10이 출력되게 된다. 그렇다면 함수 간에 같은 변수를 사용하는 방법에는 무엇이 있을까?




이제 Call by reference(참조에 의한 호출)에 대해 알아보기 위해 마찬가지로 간단한 그림을 준비했다.

방금 전 그림보다 살짝 어려워 보일 수 있지만 전혀 어렵지 않다. 우선 방금 전의 예제와 마찬가지로 메인 함수에서 int n을 선언하였다. 선언과 동시에 메모리 상에 n 변수의 구역이 정해지고 초기 값인 10이 입력된다.(그림 상의 1) 다음으로 func 함수를 사용할 때 인자로써 n 변수의 주소 값인 &n(0x01)을 넘겨준다. 그리고 func 함수가 호출되는데 메인 함수로부터 받아오는 인자를 포인터로 받아왔으므로 n의 주소 값 &n의 포인터 *n이 되었음을 알 수 있다.(3) 이를 통해 메인 함수의 변수 n func 함수의 변수 n이 같은 주소 값을 가지게 되었다는 것을 알 수 있다. 이제 func 함수에서 n 값에 20을 입력했다. 메인 함수의 변수 n func 함수의 변수 n은 같은 변수가 맞으므로 메모리 상의 n의 값이 변경된다. 따라서 func 함수 종료 후 메인 함수의 printf 실행 시 출력 값은 20이 된다.

Call by value Call by reference 는 각각의 특징이 있는데, Call by value의 경우 데이터()을 복사해서 함수로 전달하기 때문에 원본의 데이터()가 변경 될 가능성이 없지만, 인자를 넘겨줄 때 마다 메모리의 공간을 할당하기 때문에 메모리 공간을 좀 더 잡아먹게 된다. Call by reference의 경우 위에서 언급한 메모리 공간 할당의 문제를 벗어나게 되었지만 대신에 원본의 데이터()를 훼손할 수 있다는 문제점이 있다. 그러므로 상황에 따라 적절하게 선택하여 사용하면 될 것이다.

공유하기 링크
태그 클라우드
,
프로필사진

Yowu (Yu Yongwoo)

흔한 백엔드 개발자입니다
우분투 데스크탑 개발 환경을 선호합니다
최근에는 vscode에 neovim 모드 올려서 쓰고 있습니다
개발용 키보드는 역시 해피해킹 프로2 무각입니다
락 밴드에서 드럼을 쳤습니다

«   2020/10   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함
Total
2,982,871
Today
891
Yesterday
941