티스토리 뷰
※ 본 포스팅은 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.
함수의 호출 방법에는 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의 경우 위에서 언급한 메모리 공간 할당의 문제를 벗어나게 되었지만 대신에 원본의 데이터(값)를 훼손할 수 있다는 문제점이 있다. 그러므로 상황에 따라 적절하게 선택하여 사용하면 될 것이다.
'개인공부 > C and C++' 카테고리의 다른 글
struct member alignment(구조체 멤버 정렬)에 대해 (0) | 2014.01.16 |
---|---|
realloc, calloc 함수 및 예제 (1) | 2014.01.16 |
strlen, strcmp, strcat, strcpy, strrev, strtok, atoi, itoa 설명 및 함수로 구현 (0) | 2014.01.16 |
컴파일러(Complier), 링커(Linker)에 대해 (1) | 2014.01.16 |
오버플로우(overflow)시 전혀 다른 값이 나오는 이유 (2) | 2014.01.16 |
변수와 메모리 관계에 대해 (0) | 2014.01.16 |
printf, scanf 를 제외한 표준입출력 함수들의 차이 (0) | 2014.01.16 |