"/>

프로그래밍 기초-C언어 배우기(함수).12

함수

함수는 배열처럼 어떤 집합을 만들고 이를 대표하는 이름을 정한 후에 그 이름을 이용하여 집합 내부의 원소를 처리하다는 점에서 비슷하다. 배열에서의 원소가 자료라면, 함수에서의 원소는 명령이라고 할수있다.

아래의 코드를 직접 작성하고 실행해 보자.

1  #include <stdio.h>
2  int f(int a, int b)
3  {
4  if(a>b) return a;
5  else return b;
6  }
7  main()
8  {
9  int a, b;
10 scanf(“%d %d”, &a, &b);
11 printf(“%d\n”, f(a, b));
12 }

실행결과

위 프로그램을 실행하면 새로 정의 된 함수를 사용하여 두 변수 값 중 큰 값을 출력한다.

  • 2 ~ 6행은 f( )함수를 정의한 부분이다. 함수는 반드시 사용하기 전에 정의해야 하므로 프로그램의 위쪽에 먼저 작성한다.
  • 11행에서 f(a, b)부분은 함수를 실행시키는 부분으로 “함수를 호출한다.”라고 말한다. 함수가 호출되면 괄호 속의 값 a, b가 함수에게 전달되어 프로그램의 실행단계가 함수로 넘어간다.
  • 호출된 f( )에서는 main( )함수에서와 마찬가지로 위에서 아래로 순차적으로 실행되며 retuen문을 만나면 함수를 호출했던 원래 부분으로 복귀된다. return문이 없으면 함수의 마지막 명령까지 모두 실행한 후 복귀한다.
  • return명령을 통해 함수 실행의 결과 값을 되돌려 줄 수 있는데, 돌려주는 값의 자료형에 따라 int형, double형 등으로 작성하고 void형일 경우에는 아무런 값도 반환하지 않는 것을 나타낸다.
  • f( )함수에 70과 90이 입력되면 두 수 중에 더 큰 수인 90이 출력된다.

return의 쓰임

  • return 은 함수가 아니라, C언어의 키워드(keyword) 즉 “예약어”이다. C언어에서는 뒤에 소괄호”( )”가 없으면 함수가 아니다.
  • return 은, 현재 있는 함수에서 빠져나가며, 그 함수를 호출했던 곳으로 되돌아 가라는 뜻이다. 되돌아 가면서 그 함수를 호출했던 곳에 어떤 값을 반환하는 것이다. (예시 : return a; 는 a라는 값을 반환하라는 의미이고 return b; 은 b라는 값을 반환하라는 뜻이다.)

함수의 쓰임과 기능

함수는 어떤 기능을 수행하는 작은 단위의 프로그램이다. 일반적으로 엑셀, 스프레드시트 등의 프로그램에서 활용하는 함수와 유사하기 때문에 다양한 용도로 활용할 수 있으며 사용자가 직접 새로운 함수를 만들어 사용할 수도 있다.

함수는 어떤 값을 입력받아 결과를 출력하거나 동작을 수행하는 등의 기능이 있다. C언어에서는 함수를 통해 출력되는 값의 자료형에 따라 int형 함수, char형 함수등 다양한 형의 함수가 있다.

함수의 기본 구조

함수의 형(반환값 형) 함수의 이름(인수형1, 인수형2, 인수형3, …);

예시 : int f(int, int); 또는 int f(int a, int b);

예문
int f(int a, int b)
{
if(a>b) return a;
else return b;
}
이 코드는int f(int a, int b)를 함수로 보고 그 안에 두 수가 들어갔을 때 a와 b값을 비교하여 a가 크면 f(int a, int b) = a 아니라면  f(int a, int b) = b가 된다. 즉 f(a, b)가 숫자를 비교하는 if(a>b)로 바뀌게 된다.

 

함수의 활용

 

함수를 이용하여 반복되는 과정을 간단하게 해결할 수 있다. 또한 배열, 포인터 등을 함께 이용하면 복잡한 프로그램도 손쉽게 이용할 수 있다.

아래의 코드를 직접 작성하고 실행해 보자.

1  #include <stdio.h>
2  int f(int a, int b)
3  {
4  if(a>b) return a;
5  else return b;
6  }
7  main()
8  {
9  int a, b, c;
10 scanf(“%d %d %d”, &a, &b, &c);
11 printf(“%d\n”, f(a, f(b, c)));
12 }

실행결과

위 프로그램을 실행하면 두 수를 비교하여 큰 수를 구하는 동작을 반복하여 세 수 중 가장 큰 수를 출력한다.

  • 2 ~ 6행의 내용은 f( )함수에 대한 정의 부분으로 전달 받은 두 정수 중에서 큰 값을 돌려주는 내용이다.
  • 11행에서의 순서
    현재: f(a, b) = if(a>b) 비교하여 값 출력
    f(a, f(b, c)) → f(b, c)비교 → 비교하고 나온 값을 d라고 가정할 때 → f(a, d)비교 → 최종값 출력
    결국 f(a, f(b, c))호출의 결과는 a, b, c중 가장 큰 값이 된다.

함수의 활용2

한 작업을 여러번 반복 실행할 경우 배열과 함께 함수로 구성하면 프로그램을 작성하기 쉬워진다.
아래의 코드를 직접 작성하고 실행해 보자.

1  #include <stdio.h>
2  int f(int a, int b)
3  {
4  if(a<b) return b;
5  else return a;
6  }
7  main()
8  {
9  int score[10]={10, 77, 54, 99, 15, 19, 48, 68, 55, 88};
10 int i, max=0;
11 for (i=0;i<10;i++)
12 max=f(max, score[i]);
13 printf(“%d\n”, max);
14 }

실행결과

위 프로그램을 실행하면 10개의 정수형 데이터를 가진 배열 요소 중에서 가장 큰 값을 출력한다.

  • 배열의 초깃값이 10, 77, 54, 99, 15, 19, 48, 68, 55, 88이므로 실행 결과 99가 출력된다. 이 경우 f( )함수를 반복문으로 10번 호출하여 처리한다.
  • 2 ~ 6행은 두 정수값 중에서 큰 값을 돌려주는 f( )함수의 정의이다.
  • 11 ~ 12행은 가장 큰 값을 구하기 위해 현재까지 구한 가장 큰 값을 max와 score[ ]의 값들과 비교하여 max보다 큰 값을 max에 저장하면서 갱신한다. 11 ~ 12행을 통해 max 값이 새로운 값과 비교해 결국 가장 큰 값이 나오게 된다.

-순서-

max(0)과score[0](10)비교 → max(10)과score[1](77)비교 → max(77)과score[2](54)비교 → max(54)과score[3](99)비교 → …(반복) → max(99)과score[9](88)비교 → 결과값 99 출력

함수의 활용3

함수와 포인터를 이용하여 두 값을 교환할 수 있다.
아래의 코드를 직접 작성하고 실행해 보자

1  #include <stdio.h>
2  int f(int *a, int*b)
3  {
4  int t;
5  t = *a;
6  *a = *b;
7  *b = t;
8  }
9  main()
10 {
11 int a, b;
12 scanf(“%d %d”, &a, &b);
13 f(&a, &b);
14 printf(“%d %d\n”, a, b);
15 }

실행결과

위 프로그램을 실행하면 함수를 이용해 두 변수에 저장되어 있는 값을 서로 바꾸어 출력한다.

  • 3 ~ 8행은 두 변수 a, b의 주소에 저장되어 있는 값을 t를 이용하여 교환한다. 이때 a, b는 정수형 포인터 이므로 그 값을 참조할 때는 *a, *b와 같은 형태로 사용한다.
  • 13행은 함수를 호출하는 부분으로, 함수에서 사용하는 값이 정수형 포인터 값이므로 변수의 주소인 &a, &b를 전달한다.
  • 만약 값에 의한 호출로 함수를 호출하면 100과 36을 입력 했을 때 100과 36이 그대로 출력된다. 그 이유는 a, b의 값만 전달되어 값이 바뀌기 때문에 함수에만 적용되고 실제 변수 a, b에는 반영되지 않기 때문이다.

Call-by-Value(값에 의한 호출) : 함수를 호출할 때 변수에 저장되어 있는 값 자체를 전달하는 방식
예문) 숫자가 바뀌지 않음
#include <stdio.h>
int f(int *a, int*b)
{
int t;
t = a;
a = b;
b = t;
}
main()
{
int a, b;
scanf(“%d %d”, &a, &b);
f(a, b);
printf(“%d %d\n”,a ,b);
}
Call-by-Reference(참조에 의한 호출) : 변수가 사용하는 주소값을 전달하는 방식
예문) 숫자가 바뀜
#include <stdio.h>
int f(int *a, int*b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
main()
{
int a, b;
scanf(“%d %d”, &a, &b);
f(&a, &b);
printf(“%d %d\n”,a ,b);
}

-이해가 잘 안된다면 여기로-

함수의 활용4

아래의 코드를 직접 작성하고 실행해 보자.

1  #include <stdio.h>
2  int f(int *a, int*b)
3  {
4  int t;
5  t = *a;
6  *a = *b;
7  *b = t;
8  }
9  main()
10 {
11 int A[5]={77, 66, 88, 99, 55};
12 int i, j;
13 for(i=0;i<4;i++)
14 for(j=i+1;j<5;j++)
15 if(A[i]>A[j])
16 f(&A[i], &A[j]);
17 for(i=0;i<5;i++)
18 printf(“%d “, A[i]);
19 }

실행결과

위 프로그램은 배열에 저장되어 있는 5개 원소들의 값을 순차적으로 비교하여 배열에 오름차순으로 정렬한 결과를 출력한다. 두 변수에 저장되어 있는 값을 참조에 의한 호출로 교환하는 함수 f( )가 포함되어 있다.

  • 입력값이 77, 66, 88, 99, 55일 경우 출력 결과는 55, 66, 77, 88, 99가 된다.
  • 13 ~ 16행은 반복을 이용하여 0번째 값부터 4번째 값가지의 순서로 각각 다시 1번째 값부터 5번째 값까지 비교해 반복적으로 교환한다. 

-순서-

A[0]과 A[1]을 if(A[0]>A[1])로 비교 후 참인 경우 A[0]과 A[1]을 참조 호출 방식으로 바뀌고 거짓인 경우 다음으로 넘어감 → A[1]과 A[2](반복) → … → A[5]={55, 66, 77, 88, 99}가 된다.

 

 

댓글 남기기

Scroll Up