반응형

함수

 

 

함수(funcion)

 

서브루틴(subroutine) 혹은 메서드(method) 또는 프로시저(procedure) 등으로 불리며

 

특정 동작을 수행하는 일정 부분의 코드를 의미한다.

 

 

우리가 지금까지 예제 프로그램을 작성하면서 사용해 왔던 main() 함수 또한 여러 종류의 함수 중의 하나이며

 

주로 main() 함수의 본체에 코드를 작성해 왔었다.

 

 

지금까지는 상대적으로 코드의 양이 많지 않고 기능이 복잡하지 않았기 때문

 

main() 함수 안에 모든 코드를 넣어서 예제 프로그램을 작성해 왔지만

 

코드의 양이 많아지고 기능이 복잡해질 때

 

함수를 만들어 여러 부분을 분리함으로써 구조적 프로그래밍이 가능해진다.

 

 

함수를 사용하여 프로그래밍하면 반복되는 프로그램 코드의 양을 줄일 수 있을 뿐만 아니라

 

가독성이 높아지고 프로그램의 유지보수 또한 훨씬 수월해지게 된다.

 

-

 

※ 함수의 정의와 사용 방법 

 

함수를 정의하는 문법은 아래의 사진과 같다.

 

리턴 타입 어떤 자료형이든 가능하며

 

함수에서 반환하는 자료가 없다면 void형을 사용하면 된다.

 

함수의 매개변수 또한 어떤 자료형이든 가능하며

 

전달되는 매개변수가 없으면 void형을 사용하면 된다.

 

 

-

 

 

-

 

함수 매개변수(parameter) 함수 본체로 전달되는 값으로

 

함수의 리턴 타입과 마찬가지로 없을 수도 있으며

 

어떤 자료형이든지 가능하다.

 

매개변수 하나의 매개변수를 전달할 수 있을 뿐만 아니라

 

그 이상의 매개변수를 전달할 수 있는데

 

이때는 콤마(', ')를 이용하여 각각의 매개변수를 구분하여 전달하면 된다.

 

아래의 예제를 통해 함수를 정의하고 사용하는 예를 봐 보자.

 

-

 

test29.c
0.00MB

 

 

 

-

 

위의 예제는 덧셈을 수행하는 함수를 정의하고

 

printf 문에서 정의된 함수를 사용하고 있는 내용을 보여준다.

 

위의 예제를 보면 3행 함수 본체가 없는 다음과 같은 구문이 있다.

 

이를 함수의 원형(prototype)이라고 한다.

 

-

 

 

-

 

함수의 원형이 필요한 이유 함수가 어떤 매개변수를 필요하고 어떤 형태의 값을 리턴하는지

 

소스 코드가 컴파일되는 시점에 확인하기 위해서이다.

 

함수의 본체 호출되는 함수보다 먼저 정의되어 있으면 상관없지만

 

호출되는 함수 호출하는 함수보다 나중에 정의되어 있을 경우 반드시 함수의 원형이 필요로 한다.

 

아래의 예제를 통해 

 

호출되는 함수가 호출하는 함수보다 먼저 정의되어 있을 경우에 대해 봐보자.

 

-

 

test30.c
0.00MB

 

 

 

-

 

위 코드는 test29.c의 코드보다 양이 적지만 같은 동작을 하는 코드이다.

 

이런 식으로원형을 쓰고 나중에 정의를 해도 되고

 

아니면 원형을 쓰지 않고 먼저 정의를 하고 나중에 main() 함수에서 사용해도 된다.

 

 

참고로 많은 프로그램의 소스 코드 하나의 파일로 구성되어 있지 않고

 

비슷하거나 관련 있는 기능을 하나의 파일로 묶어 여러 개의 파일로 나누어져 만들어진다.

 

함수 원형 또한 한꺼번에 묶어 헤더 파일(*.h)로 정의하여

 

호출하는 소스 코드에서 호출하는 함수 이전에 불러와서 사용한다.

 

이 부분은 나중에 라이브러리를 만드는 내용을 설명할 때 다시 한번 자세히 설명하도록 한다.

 

-

 

※ 재귀 함수 ※

 

 

함수를 만들 때는 주로 특정 동작을 수행하는 일정 부분의 코드 부분을 따로 분리해서 함수를 만들게 된다.

 

하지만

 

특정 부분을 반복적으로 수행하면서 결과를 도출해야 할 필요가 있는데

 

이 경우는 재귀 함수를 이용하면 쉽게 결과를 도출해 낼 수 있다.

 

 

재귀 함수

 

함수 내부에서 자기 자신을 다시 호출하는 함수를 말하며 연산을 재귀적으로 계산할 때 주로 사용한다.

 

 

일반적인 함수 프로그램 실행 중 함수를 만나게 되면 현재 위치를 메모리에 저장한 뒤에

 

호출한 함수로 이동하여 호출한 함수의 내용을 수행한다.

 

호출한 함수의 실행이 끝나면 기존에 저장해 두었던 위치로 돌아와 다음 코드를 수행하게 된다.

 

하지만

 

재귀 함수 자기 자신의 함수가 실행이 끝나기 전에 다시 자기 자신의 함수를 호출한다.

 

이것이 가능한 이유는 재귀 함수가 반복적으로 호출되어도 일반적인 함수의 실행 원리처럼 실행되기 때문

 

내부적으로 각각 재귀적으로 호출되는 함수에 영향을 주지 않고 잘 동작하게 되는 것이다.

 

 

 

재귀 함수는 다음과 같은 특징이 있다.

 

-

 

-

 

재귀 함수를 이용하여 프로그램을 작성할 때 디버깅 및 실행 흐름을 파악하기 어렵다는 단점이 있지만

 

복잡한 코드를 재귀 함수를 사용함으로써 문제를 쉽게 해결해 낼 수 있고

 

코드를 단순화할 수 있기 때문에 내부적으로 반복적으로 실행되어야 하는 함수에서 많이 사용되고 있다.

 

 

팩토리얼(factorial) 값을 계산하는 아래의 예제를 통해 재귀 함수의 사용법을 봐보자.

 

-

 

test31.c
0.00MB

 

 

 

-

 

참고로 n! 은 "n x (n-1) x (n-2).... x 1"이라는팩토리얼 연산을 수행하는 연산으로

 

위 예제에서 이를 구현하기 위해서 재귀 함수를 사용했으며

 

파라미터로 전달되는 값을 1씩 줄이면서 곱셈 연산을 수행한다.

 

재귀 함수의 탈출 조건으로 함수로 전달된 값이 1보다 작거나 같으면

 

더 이상 자신을 호출하지 않으면서 함수를 종료한다.

반응형

'시작하지 말았어야 했던 것 > C언어 기본 문법' 카테고리의 다른 글

15. scanf() 함수  (0) 2021.02.01
14. printf() 함수  (0) 2021.02.01
12. 문자와 문자열  (0) 2021.02.01
11. 배열  (0) 2021.02.01
10. break문과 continue문  (0) 2021.02.01

+ Recent posts