Prosto

사용자 정의 함수의 이해와 예제, 문제 -C언어 본문

Programing/C Programing

사용자 정의 함수의 이해와 예제, 문제 -C언어

Prosto 2016.11.05 13:00


'사용자 정의 함수 - 이미 만들어진 함수를 사용하듯 직접 새로운 함수를 정의하여 사용하는 방법!'


프로그래밍을 하다보면 같은 작업을 변수 몇 가지만 바뀌어서 처리하거나,

특정 기능을 만들어서 필요할 때마다 사용하고 싶은 경우가 있습니다.

그런 때 사용할 수 있도록 해주는 게 사용자 정의 함수입니다.


지금까지 우리가 배웠던 것들을 그대로 함수로 만들 수 있습니다.

예를 들면, 두 수를 전달해주면 더하기 기능을 해주는 함수를 만들 수도 있고,

 구구단 중 특정 단을 출력해주는 기능을 하는 함수를 만들 수도 있습니다.



실제로 게임에서도 캐릭터가 이동하는 기능을 하는 함수, 공격을 하는 함수, 체력을 표시해주는 함수

같이 여러 개의 함수를 만들어서 사용하게 됩니다.



함수에도 지금까지 했던 것처럼 일정한 규칙이 있지만,

그것들을 알아보기 전에

먼저 더하기 기능을 하는 함수를 어떻게 사용했는지

예제 1번을 보도록 합시다!



예제1. 두 값을 더한 결과 값을 반환하는 함수를 만든 후, 두 수를 입력받아 실제로 함수를 사용한 프로그램을 만드시오.


(소스)

이번에는 소스가 먼저 나왔습니다.


그 이유는 출력 결과를 보기 전

소스를 보고 어떻게 작동이 될지,

추측을 한번 해봤으면 좋겠다는 생각이 들어서 그렇습니다.

(잠깐만 보고 추측해보세요.)



우리는 여기서

int main(void){ } 위에

int Sum(int n1, int n2){ return (n1+n2); }

라는 부분이 있다는 점과

main 안에 sum = Sum(num1, num2);라는 부분에 주목해야 합니다.



(실행 결과)


어떻게 생각대로 나왔나요?


그럼 이제 조금 전에 만들어진 소스를 보고 하나씩 살펴보며

함수에 대하여 배워보도록 합시다.

#include<stdio.h>

//Prosto

int Sum(int n1, int n2) {

return (n1 + n2);

}

int main(void) {

int num1, num2, sum;


printf("숫자1 : ");

scanf_s("%d", &num1); //== scanf("%d", &num1);

printf("숫자2 : ");

scanf_s("%d", &num2); //== scanf("%d", &num2);


sum = Sum(num1, num2);


printf("결과 : %d\n", sum);

return 0;

}

 여기서 먼저 사용자가 정의한 함수를 봅시다.

int Sum(int n1, int n2) 

return (n1 + n2); 

 이 부분이 바로 이 소스에서 새롭게 만든 함수 부분입니다.

 하나씩 볼까요?


 첫 번째 자리의 int가 위치한 곳은 반환 자료형입니다.

 int라면 정수를 반환하겠다는 거겠죠?


 다음 두 번째 자리의 Sum은 새롭게 만들 함수의 이름입니다.


다음으로 (int n1, int n2)는 함수 사용 시 받을 인수입니다.

 int형 두 개를 받는 거죠. 첫 번째 int는 n1에, 두 번째 int는 n2에 받게 됩니다.


 다음은 return (n1+n2);입니다.

 return이 반환하겠다는 의미이니, (n1+n2)의 값을 반환하겠다는 게 되겠죠?

 (그리고 여기에서 n1, n2는 아까 위에서 받은 두 개의 int형 자료였죠?)

 (int main(void){}에서 마지막에 return 0;을 해주는 이유입니다.)


그러면 정리해보면

반환형태 함수이름(인수){

  //함수 내용(반환만 하는 게 아니라 내용 넣을 수 있습니다.)

  //반환

}

이 되겠죠?


int Sum(int n1, int n2){

  int s = n1+n2;

  return s;

}

같은 함수도 있을 수 있고.


결과를 출력해주는 함수로

void PrintSum(int n1, int n2){

  int s = n1+n2;

  printf("%d + %d = %d\n", n1, n2, s);

}

이렇게 사용될 수도 있습니다.


여기서 return이 없는 건 반환형태가 int 대신 void가 사용되어 return이 없는 겁니다.

(int, float, char 등의 자료형을 넣는다면 꼭 return이 있어야하고요.)


 마지막으로 int main(void) { } 내에 존재하는

 Sum(num1, num2);입니다.

 이 부분이 바로 위에서 만든 함수를 사용하는 부분입니다.

 Sum(num1, num2) 부분이 곧

 int Sum(int n1, int n2) { return (n1+n2); }이 되는 거죠.


 num1 = 12이고 num2 = 6이라고 하면

 Sum(12, 6)이 되고

 위의 함수로 가서 n1 = 12, n2 = 6으로 return(반환) (12+6)인 18이되겠죠?

 그 결과를 sum에 담게 되니,

 결과적으로 sum = 18이 됩니다.


이렇게 함수를 사용할 때는

함수 이름과 함께 함수를 정의할 때 정해둔 인수들을 전달해주면 됩니다.

int Sum(int n1, int n2){

  int s = n1+n2;

  return s;

}

이었다면

int main(void){

  int n = Sum(3, 5);

  return 0;

}

같은식으로 사용 가능하겠고,


void PrintSum(int n1, int n2){

  int s = n1+n2;

  printf("%d + %d = %d\n", n1, n2, s);

}

이었다면

int main(void){

  PrintSum(3, 5);

  return 0;

}

같은식으로 사용 가능하겠죠?


이제 함수가 어떤 건지, 어떻게 사용하는지 아시겠나요?



추가로,

지금 보면 함수는 main 위에 작성되고있죠?

아래에도 옮겨서 실행해보세요.

실행이 안 됩니다.

그 이유는 C언어는 완전한 절차지향 언어라서

위에서부터 아래로 차근차근 읽어가며 실행하게 됩니다.


근데 main보다 위에서 선언해주지 않으면 main에서 실행할 때,

컴퓨터는 처음보는 함수가 있는 것을 보고 알 수 없는 것을 실행한다고 실행 불가능하다고 합니다.


지금은 일단 이렇게 main 위에 쓰는 방식으로 함수를 사용해가면 되지만,

아래에 적고 싶다면

위쪽엔 함수를 선언만 해주고

main 함수 아래에서 그 함수를 설명해주면 됩니다.


이 부분은 나중이라도 금방 바꿀 수 있는 부분이니

처음 배우신다면 main함수 위에 쓰는 방식 그대로 쓰세요.


위의 예제1을 바꿔본다면? (보기)




그럼 이해가 좀 된 상태에서 예제를 하나 더 살펴보도록 하죠.


예제2. 값을 받으면 1부터 입력받은 수까지 출력해주는 함수를 만든 후, 함수를 이용하여 출력 결과 예와 같이 실행되도록 만드시오.

(출력 결과 예)


어떤식으로 만들어질까요?


지금은 예제니 바로 소스를 확인해보죠.


(소스)

이렇게 됩니다.

PrintNumbers라는 함수를 만들어주고.

그 함수에서 for문으로 받은 인수의 숫자(int n)만큼 1부터 출력해주고 있죠?


이걸 함수를 안 쓰고 만든다면

어떻게 만들어질지 볼까요?


이렇게 됩니다.

거의 똑같은 작업이지만,

아주 일부분(3, 5, 4, 7)이 바뀌는 것만으로

반복하여 적어줘야하죠?


함수는 이런 때에 아주 좋습니다.

뭔가 만들 때 중복하여 사용된다면

가급적이면 함수를 따로 만들어 사용하는 습관을 들일 수 있으면 좋겠네요.

(가독성 차이도 많이 나게 되죠.)




그럼 이제 어느정도 함수를 어떤식으로 사용할지 알겠으니

직접 문제를 풀며 더 알아보고 익히도록 하죠!



문제1. 입력 받은 수의 제곱을 알려주는 프로그램을 만드시오.

 단, 제곱 값을 반환해주는 함수를 만들어 사용하시오.


(출력 결과 예)



완성 소스 보기




문제2. 구구단 중 3단과 7단을 출력해주는 프로그램을 만드시오.

 단, 특정 단을 받아 해당 단을 출력해주는 함수를 만들어 사용하시오.


(출력 결과 예)




완성 소스 보기




문제3. 두 숫자를 받아 더하기, 빼기, 곱하기, 나누기 결과를 보여주는 프로그램을 만드시오.

 단, 더하기(Sum), 빼기(Minus), 곱하기(Multiply), 나누기(Divide)는 각각 값을 반환하는 함수를 만들어 사용하시오.


(출력 결과 예)




완성 소스 보기




문제3-2. 두 숫자를 받아 연산 선택에 따라 더하기, 빼기, 곱하기, 나누기 결과를 보여주는 프로그램을 만드시오.

 (3에서 변경하여 완성, if문도 추가적으로 필요.)


(출력 결과 예1)


(출력 결과 예2)


(출력 결과 예3)




완성 소스 보기




지금까지 사용자 정의 함수에 대하여 알아봤습니다.

 

사용자 정의 함수의 선언, 정의부터 실제 사용까지

예제를 통하여 설명을 듣고 직접 문제도 풀어봤습니다.

 

사용자 정의 함수 이해에 도움이 됐다면 좋겠습니다.

(추후 재귀 호출 함수에 대한 글도 작성하겠습니다.)

 


질문은 댓글이나 메일로 따로 연락주시면 시간되는 때 답변드리겠습니다. ( 연락 )

 


7 Comments
댓글쓰기 폼