본문 바로가기

Lobo's study room/[혼공단]c언어스터디

[4주차]함수의 유형

함수는 기능을 수행하는 코드 단위로 main(), printf(), scanf()도 함수이다.

표준 라이브러리 함수 : 특정 기능을 미리 약속하고 프로그램에서 바로 사용할 수 있게 구현되어 있는 함수

ex)printf, scanf

stdio.h 헤더 파일에 포함 되어있다.

 

함수의 원형은 반환형 함수명(매개변수)

 

하지만 언제나 함수에 반환형과 매개 변수가 있는것은 아니다.

 

1.매개변수가 없는 함수

int get_num(void)

괄호안에 void를 넣어 매개변수가 없음을 표시합니다.

괄호만 사용하는것도 가능하지만 void를 넣어 매개변수가 없음을 명시적으로 표현하는 것이 좋습니다.

void는 함수정의나 선언에서 사용하며 호출할 때는 쓰지 않습니다.

그냥 괄호만 쓰면 됩니다.

 

2.반환값이 없는 함수

데이터를 받아 단지 화면에 출력하는 함수라면 특별히 반환값이 필요 없습니다.

반환값이 없는 함수는 선언과 정의의 반환형에 void를 사용합니다.

반환값이 없는 함수는 return 혼자 쓰거나 심지어 return문 자체를 생략하는 것도 가능합니다.

return문이 없어도 함수의 코드를 모두 실행하면 호출한 곳으로 자동으로 돌아갑니다.

만약 바로 함수를 끝내고 싶다면 함수 중간에 return문을 사용합니다.

 

반환형이 void인 함수는 컴파일러가 반환값이 없다고 가정하여 호출한 위치에 반환값을 저장할 공간을 준비하지 않는다.

따라서 return문에 값을 사용하면 컴파일러에서 경고 메시지 발생

[warning C4098 : 'print_char': 'print_char' : 'void' 함수에서 값을 반환하고 있습니다.]

같은 이유로 반환값이 없는 함수는 호출 문장을 수식의 일부로 쓸 수 없습니다.

 

3.매개변수와 반환값이 모두 없는 함수

void 함수명(void)로 함수의 원형을 정의하면 매개변수와 반환값이 모두 없다.

함수정의에 return문이 없고 호출할때 값을 주지 않는다.

호출은 수식의 일부가 아닌 독립된 문장으로 쓰인다.

 

4.재귀호출 함수

자기 자신을 다시 호출하는 함수로

보통 함수의 경우 모든 명령을 수행하면 자동으로 반환하는데 반환하기 전에 자신을 호출하므로 처음부터 다시 시작.

즉 함수가 끝나지 않고 계속 출력되다가 

프로그램 하나가 쓸 수 있는 메모리(해당 프로세스에 할당된 스택 메모리)를 모두 사용되면 강제 종료된다.

중간에 종료되는것은 정상적인 종료가 아니라 정상적인 종료를 위해서는 

반복 고리를 끊을 수 있는 조건식을 반드시 포함해야 한다.

재귀호출은 새로운 함수를 실행하는 것과 같다.

복잡한 반복문을 간단히 표현 할 수 있으나 코드 읽기가 쉽지 않고 반복 호출되면서 메모리를 사용하므로 제한적으로 쓰는 것이 좋다.