1. 시작하기전에 생각해볼 것 3가지
어떠한 값이 나올까? 에 대해 한번 곰곰히 생각해보자
첫 번째 케이스
두 번째 케이스
세 번째 케이스
3가지 경우에는 어떤 값이 출력이 될까?
1. Call by Value
첫 번째 경우에 a = 1 b = 2가 출력이 된다.
1. main 함수와 swap 함수
main 함수에서 a = 1, b = 2라는 값을 복사하여서 swap 이라는 함수로 전달한 것이기 때문에,
swap 안에서의 a 와 b는 main의 a 와 b 와는 엄연히 다른 메모리 영역을 가지는 변수 이다.
다시 말해 swap 안의 a와 b는 main의 a와 b 값을 복사해 그대로 전달했을 뿐 다른 함수이고, 두 함수는 아무런 관련이 없다.
2. 함수 종료 시 a와 b도 소멸
swap 함수가 종료됨과 동시에 swap 함수의 a,b는 사라진다. 정확히 말하면 c언어에서 할당받은 메모리의 변수의 값이 지워졌다기보다는 더 이상 보호를 받지 못하고, 다른 프로그램에 의해 다른 값으로 덮어쓰여지거나 임의의 값이 쓰여진다. 얼마나 시간이 지나야 다른 프로그램에 의해 값이 덮어쓰여질지는 모르지만 프로그래머가 제어할 수 없는 값이니 사라진다는 표현을 사용한다.
그러면 어떻게 call by value에서 값을 전달할 수 있을 까?
이러한 경우에 return을 사용하여 main 함수의 변수에 대입을 하면 가능하다.
하지만 c언어의 경우 하나의 변수만 return 할 수 있으므로, 여러 개의 변수를 반환하고 싶으면 구조체나 배열을 통해 반환을 해야한다.
2. Call by Reference
두 번째 케이스는 a = 2, b = 1이 출력된다.
1. main 함수와 swap 함수
main 함수에서 a = 1, b = 2라는 값의 주소를 넘겨주었기 때문에
swap 안에서의 a 와 b는 main의 a 와 b 와는 같은 메모리 영역을 가지는 변수 이다.
따라서 swap 안에서 포인터를 통해 특정 메모리의 값을 바꾸었으므로, 함수가 종료되어도
main 함수에서 a와 b 값이 바뀐 것을 확인할 수있다.
3. 함수와 메모리
세 번째의 정답은 알 수 없다 이다.
왜냐하면 returnaddress에서 선언한 변수 b는 b의 주솟값을 반환하고, 종료한다.
이때 변수 b는 returnaddress에서 선언된 지역변수 이므로, 함수가 종료됨에 따라 소멸한다.
첫 번째 케이스에서 봤던 것처럼, 정확히는 보호를 받지 못하고, 일정 시간이 지나면 다른 프로그램에 의해서
덮어쓰여지거나 임의의 값으로 덮어쓰여진다.
따라서 덮어쓰여지기전에 값이 출력이 된다면 예상한 값이 나올 것이고, 그렇지 않다면 다른 값이 나올 것이다.
출력값은 다음과 같이 나온다.
4. 정리
call by value는 값을 복사해온 것이므로, 이것에 의해 생성된 변수는 실제(원본이 되는) 변수와 다른 메모리 영역을 가지는 변수로 실제 변수에 영향을 미치지 못한다.
call by reference는 주소값을 복사해온 것이므로, 실제(원본이 되는) 변수와 같은 메모리 영역을 가지는 변수로 pointer를 이용하여 해당하는 주소값의 value를바꿀 수 있다.
local 변수는 함수가 끝나면 소멸하고, 여기서 소멸한다는 뜻은 즉시 사라진다는 뜻이 아니라 보호받지 못하는 변수를 의미한다.
'Program Language > C' 카테고리의 다른 글
[C] Big Endian vs Little Endian (0) | 2023.11.06 |
---|