본문 바로가기

C

([C언어] 14강) 함수의 생성과 반환값

이번에는 우리가 2강에서 배웠던 함수 만드는법을 사용해

함수를 만들어볼겁니다.

 

많이 쓰는 기능은 함수로 빼서 사용한다! 중요한 개념이니 꼭 기억해주세요!

 

우선 2강에서 배웠던 함수 만드는 법을 재정의해볼게요

자료형 함수이름(매개변수목록)
{
}

이렇게 만들수 있는데요, 이런 행위를 "함수를 정의한다"라고 하고

자료형도 무엇인지 알고 함수 이름을 짓는법도 아니까

이제 매개변수에 대해서 알려드리겠습니다.

 

우선 매개변수란 함수의 호출부에서 값을 넘겨줘서

호출되는 함수에게 이런값을 사용해! 라고 알려주는 겁니다.

 

자 그럼 매개변수로 숫자 두개를 입력하면 그 두개의 합을 출력해주는 함수를 만들어볼게요

 

프로그래밍에서 네이밍은 상당히 중요합니다. 저도 잘 못하는 부분이긴 하지만

꼭 신경써서 변수,함수 등의 이름을 네이밍해주세요!

 

이번에 만들 함수의 이름은 덧셈을 출력할거니까 덧셈! Add로 하도록 하겠습니다

#include <stdio.h>

void Add(int a, int b)
{
    printf("%d",a + b);
}

int main()
{
    int n = 32;
    int n2 = 46;
    Add(n,n2);
}

이렇게 하시면 됩니다!

설명하자면 메인함수가 자동으로 실행되고

n변수를 32

n2변수를 46으로 할당하고

Add함수를 호출하는데 매개변수로 n,n2를 넘겨줬으니까

Add에 a는 32, b는 46으로 실행이 될테고

printf함수를 통해 a와 b의 합을 출력하니까

결국 78이 출력되겠네요!

확인 되셨나요?ㅎㅎ

 

그럼 이번엔 조금 다른것을 알려드리겠습니다

 

아래 코드를 보시죠

#include <stdio.h>

int main()
{
    int n = 32;
    int n2 = 46;
    Add(n,n2);
}

void Add(int a, int b)
{
    printf("%d",a + b);
}

자 이 코드는 위에 정상작던 코드랑 뭐가 다를까요?

Add함수가 main함수보다 밑에 있다는것 밖에는 다른점이 없습니다!

하지만 이 코드를 실행하면 어떻게 될까요?

그리고 디버그창에는

엥? 뭔소리야 저기 Add함수 잘 있는데 왜 없대;;

 

그 이유는 바로 C언어가 "절차지향 프로그래밍 언어" 이기 때문입니다

이 점 매우매우매우매우 중요하니 꼭 외워주세요!

 

절차 지향이란 무조건 절차적으로 위에서 아래로 물흐르듯이 진행되는 프로그래밍언어

라는 뜻입니다.

근데 그게 무슨뜻일까요?

 

보시면 에러가 난 이 코드에서는 메인함수의 위에 Add함수가 있지않습니다

즉 main함수가 실행된 시점에는 Add함수가 없다는거죠!

 

근데 나는 꼭 메인함수보다 밑에 함수를 정의하고싶다!

그럼 메인 함수 위에 "함수 선언"을 해주시면 됩니다.

함수를 선언 하는 방법은

자료형 함수이름(매개변수목록);

이렇게 하시면 되고요! 수정된 코드를 한번 볼까요?

 

#include <stdio.h>

void Add(int a, int b);

int main()
{
    int n = 32;
    int n2 = 46;
    Add(n,n2);
}

void Add(int a, int b)
{
    printf("%d",a + b);
}

이렇게 바꿔주시면 다시 정상 작동 하는것을 볼 수 있습니다!

저 코드를 변수로 설명을 하자면

우리는 흔히 변수를 "선언"하고나서, 값을"할당"까지 해주었습니다

함수를 "선언"하는 부분이 변수를 "선언"하는 것과 같고

함수를 "정의"하는 부분이 변수를 "할당"해주는것과 같다고 보면 됩니다.

 

위의 코드를 쉽게 주석으로 설명해드리겠습니다.

#include <stdio.h>

void Add(int a, int b); //나는 지금 Add라는 함수를 만들거야! 내용은 이따가 말해줄게

int main() //나는 메인함수야! 프로그램이 시작되면 자동으로 호출해줘!
{
    int n = 32; //n! 너는 32니까 기억해!
    int n2 = 46; //n2! 너는 46이니까 기억해!
    Add(n,n2); //아까 Add함수인가 그거있던데 n이랑 n2의 값을써서 Add함수 호출해!
}

void Add(int a, int b) //나는 Add함수의 내용이야!
{   //n이랑 n2는 각각 32,46이니까.. a! b!너희는 각각 32, 46이야!
    
    printf("%d",a + b); //a+b한값을 출력할래!
}

이렇게 되는겁니다 이해 하셨나요?

 

 

 

그럼 이번에는 반환(return)에 대해 알아보겠습니다.

함수는 중간에 강제로 끝낼수가 있는데요

함수의 정의나 선언 앞에 자료형이 들어가는 이유가 무엇일까요?

 

바로 "이 함수는 종료될때 이 자료형의 값을 반환할게"

라는 말입니다.

 

return을 쓰는 법은 매우매우 간단합니다

return 반환값;

이렇게 해주시면 되는데요!

 

이 "리턴"을 사용하면 함수를 호출한 부분에 반환값을

돌려주는것이라고 보시면 됩니다.

 

자 그럼 아까전의 Add함수를 반환값을 이용하도록 바꿔볼까요?

 

#include <stdio.h>

int Add(int a, int b);

int main()
{
    int n = 32;
    int n2 = 46;
    printf("%d + %d = %d", n, n2, Add(n,n2));
}

int Add(int a, int b)
{
    return a + b;
}

이렇게 바꿀수 있을것 같네요

 

차근차근 해봅시다.

n은 32

n2는 46인 상태에서

printf함수로 n + n2 = Add(n,n2) 를 출력한것이고

Add함수는 매개변수로 넘어온 두 값의 합이 반환되므로

32 + 46 = 78 이 출력됨을 알 수 있습니다.

 

이런 함수를 적절히 만들어가면서 프로그래밍하셔야합니다!

 

그럼 만약에

#include <stdio.h>

int Test();

int main()
{
    Test();
}

int Test()
{
    return 0.4;
}

이 코드는 제대로 실행 될까요?

 

아뇨, 에러가 납니다. 이유는 뭘까요?

 

분명 Test함수의 자료형은 int입니다

그런데 return되는 값은 0.4 즉, 실수입니다.

return 되는 값이 int값이 아니므로 에러가 나는겁니다.

 

그럼 아무 값도 리턴하지 않는 void형 함수는

리턴을 못하나요?

아니요, 그냥 return; 이렇게만 치시면 중간에 함수를 종료하고 나갈 수 있습니다.

참고로 return은 반복문의 break처럼 아래줄은 싹 무시하고 함수를 종료해버린다는것을

기억해주세요. 단순히 함수를 돌지 못하게 방지할때도 이 return을 사용하기도 합니다.

 

 

자 그럼 오늘 강좌는 여기까지구요 다음강좌부터는 훠어어어얼씬 더 어려워질 수 있으니

각오 단단히 하시고 보시기 바랍니다 ^^