Test/C

함수(20170314)

kiostory 2017. 3. 14. 22:35


* 함수 : 프로그램이 수행하고자 하는 기능에 대한 명령문의 집합.

함수는 블랙박스와도 같다. 왜냐하면 주어진 입력에 대해 구체적으로 어떤 처리과정을 거치는지 알지 못해도

그 결과를 얻을 수 있도록 만들어지기 때문이다.

- 입력은 여러 인자가 가능하나, 출력은 반드시 하나다.


* 함수의 정의와 실행

- 정의, 호출

- 함수의 리턴형 : int getaaa(int num)  --> 첫번째 int가 리턴형

> 함수의 리턴형을 생략하면,

c의 가장 기본이 되는 데이터형인 int형을 리턴하는 함수로 간주

. 함수는 반드시 하나의 값만 리턴한다

- 함수의 이름

> 변수명을 만드는 규칙에 따라 생성, 가급적 기능에 맞는 이름을 부여

- 함수의 매개변수 : 함수 기능을 수행하기 위해 필요한 값을 넘겨주기 위한 변수

> 매개변수 == 인자

- 함수의 헤더와 바디

> 헤더 : 리턴형 함수이름(매개변수)

ex) int main(int argc, char *argv[])

> 바디 : 이하내용

{

printf("Hello xxxxxx. ......

}

- 함수의 호출 : 함수의 기능을 사용하는 것

> 원하는 함수의 이름을 불러줌 : ex) sum();

> 함수의 중복 호출 : 메인함수 외 일반 함수에서도 다른 함수 호출 가능

- 함수의 선언 형식


* 다양한 형태의 함수

- void() : 키워드 void를 이용해 입력이 없거나 출력이 없는 함수를 정의할 수 있음

ex)

#include <stdio.h>
#include <stdlib.h>


void noreturn(void)
 {
  printf("Hello, guys.");
 }

int main(int argc, char *argv[]) {
 
 noreturn();
 noreturn(); 
 noreturn();
 
  
 return 0;
}

결과) Hello, guys.Hello, guys.Hello, guys.


- return 값이 있는 함수

> 함수가 리턴 값을 함수를 호출한 곳으로 넘겨줌

ex)

#include <stdio.h>
#include <stdlib.h>


 int sum(void)
 {
  int a,b;
  a=6,b=7;
  return a+b;
 }
 
 void main(void)
 {
  int hap;
  hap=sum();
  printf("hap=%d",hap);
 }


결과) hap=13


- 다양한 인자의 함수

> 인자는 수식이 올 수도 있음

> 인자는 다른 함수가 올 수도 있음

ex) int result = GetSum(Fact(5));


- 인라인(inline) 함수, 일반함수

> 호출해야 하는 부분에 해당 함수코드를 추가해 두기 때문에 해당 함수로 분기하지 않아도 된다. : 인라인 함수

. 실행속도 빨라짐

. 실행코드는 길어짐

> 함수를 호출할 때 해당 함수의 위치를 찾아서 해당 함수가 있는 코드로 분기한다. : 일반 함수

> 인라인 함수 예

 inline int max(int a,int b)
 {
  if(a>b)
   return a;
  else
   return b;
 }
 
 int main(void)
 {
  printf("3과 2중 최대값은 : %d\n\n",max(3,2));
  
 }
 결과) 3과 2중 최대값은 : 3

--------------------------------
Process exited after 0.05959 seconds with return value 22

cf. inline을 제거하고 수행하면,

결과) 3과 2중 최대값은 : 3
--------------------------------
Process exited after 0.342 seconds with return value 22


그렇군. inline이 빠르군!


- 재귀함수 : 생략


- 가변인자 함수

>인수의 개수가 일정치 않은 함수 : printf(), scanf() ...

> int sum(int n, ...) 등으로 사용

> 사용시에는 헤더파일 추가가 필요 : #include <stdarg.h>