[C 문법] 함수 공부하다 막히는 예제가 있어 질문드립니다.
안녕하세요?
저는 27살에 개발자 진로를 정하고 2개월 뒤, 방통대 컴퓨터 과학과 3학년 편입예정인
비전공자 출신 독학도 입니다. 학교에서 정식으로 배우기 전에 스스로 C언어 문법만큼은 꼭 마치고 가고싶어서
나름 애를 쓰고있습니다. ^_^ 질문 드리겠습니다.
#include<stdio.h>
int Add(int num1, int num2)
{
return num1 + num2;
}
void ShowAddResult(int num)
{
printf("덧셈결과 출력: %d \n", num);
}
int ReadNum(void)
{
int num;
scanf("%d", &num);
return num;
}
void HowToUseThisProg(void)
{
printf("두개의 정수를 입력하시면 덧셈결과가 출력됩니다. \n");
printf("자! 그럼 두 개의 정수를 입력하세요. \n");
}
int main(void)
{
int result, num1, num2;
HowToUseThisProg();
num1 = ReadNum();
num2 = ReadNum();
result = Add(num1, num2);
ShowAddResult(result);
return 0;
}위의 예제를 컴파일하면,
-------------------------------------------------
두 개의 정수를 입력하시면 덧셈 결과가 출력됩니다.
자! 그럼 두개의 정수를 입력하세요.
(정수2개 입력받음. 예를들어) 12 24
덧셈결과 출력:36
------------------------------------------
이렇게 됩니다.
제가 궁금한 부분은,
1. 어떤 과정으로 'scanf함수를 2번 호출했느냐' 입니다. 물론 변수가 2개라서 2번호출 하는건 알겠는데,
num1=ReadNum(); // 이부분 과
num2=ReadNum(); // 이 부분에서 scanf함수를 어떤식으로 변수에 저장하는건가요?
printf함수는 값을 저장하는데 scanf함수는 어떤식으로 저장을하는지..잘 이해가 안갑니다. 대충 머릿속으로 연상이 되어 그렇게 된거는 알겠는데 뭔가 개운하게 이해가 잘 안됩니다.
2. 1번 물음이 막히니,
result=Add(num1,num2); // 이 코드에서도 Add함수에 어떤걸 매개변수로 쓴다는 건지 .. 또 막혔고,그걸 또 어떻게 result에 저장한다는 건지 또 막혔습니다.
3. 마지막으로,
ShowAddResult(result); 함수를 호출했을때, printf함수 호출로 인해 합계가 출력되는 건 알겠는데..
scanf함수를 2번 쓴 부분이 정확히 어딘지 잘모르겠습니다.
좀더 깔끔하게 질문을 다시 요약한다면, 제가 scanf 함수를 변수에 저장하는 그 과정이 머릿속에 잘 정리가 안되는 것 같습니다. printf함수를 변수에 저장하면 값이 저장되서 빨리 이해가 가는데 사용자로부터 입력받는 개념을 저장한다고 생각하니.. 그리고 그 입력받기로 예정된 과정을 또 더하는 과정이..ㅜㅜ절 좀 답답하게합니다.
예제의 난이도가 그리 높은편은 아니지만 ㅜ_ㅜ... 약간의 설명을 해주신다면 제게 큰 힘이 될 것입니다.


main 함수의 num1 = ReadNum();
main 함수의 num1 = ReadNum(); 부분을 보면, ReadNum 함수를 호출하여, ReadNum 함수 내부가 실행됩니다.
ReadNum 함수의 내부를 보면,
scanf 함수에 "%d"와 &num 을 넘겨줍니다. &num은 num 변수의 주소값(메모리 번지 수)입니다.
scanf 함수는 사용자에게 12라는 값을 받아서, 앞에서 전달받은 메모리 번지에 12라는 값을 기록합니다. 그러면 num 변수의 값이 12가 됩니다.
그리고 return num 을 합니다. return num을 하게 되면, num변수의 값을 복사하여 ReadNum 함수를 호출해준 곳(즉 main 함수)으로 돌아갑니다. 그러면 main 함수의 num1 = ReadNum(); 부분이 num1 = 12; 가 됩니다!! 이런 과정으로 main 함수의 num1에 12라는 값이 기록됩니다.
result = Add(num1, num2); 부분이 실행되는 시점에는 main 함수의 num1은 12라는 값이, num2는 24라는 값이 기록된 상태입니다. Add 함수 내부에서 return 12 + 24; 가 되고, 이것은 return 36; 이 되고, main 함수로 돌아와서 result = 36; 이 됩니다.
뭔가 질문하신 분이 '저장'을 무슨 의미로
뭔가 질문하신 분이 '저장'을 무슨 의미로 생각하시는지 짚고 넘어가야 할 것 같은데요.
계속 "... 함수를 변수에 저장하는"이라고 쓰시는데, 저 코드에서 어떤 함수도 변수에 저장되고 있지 않습니다. 특히나 printf 함수를 변수에 저장하는 건 빨리 이해가 간다고 하셨는데, 어떤 코드를 보고 그런 말씀하시는 건지 적어주시면 좋을 것 같습니다.
이 코드(등호를 사용한 대입문)는 등호 우측에 있는 식을 평가하여 (평가라는 말이 낯설다면 그냥 계산하여라고 생각하셔도 됩니다) 최종 결과를 num1 변수에 저장하는 것이지 ReadNum()이라는 함수를 저장하는 것이 아닙니다.
좋은 하루 되세요!