본문 바로가기
C/C

C언어 심화 (11주차) [함수]

by DeathStar183 2022. 5. 27.

제어문동안 배운것들

■조건문 : if, if ∼else

■반복문 : for

■조건문 : switch ∼case

■반복문 : while, do ∼while

■분기문 : break, continue, goto

■함수 개요

■함수의 선언, 정의, 호출

 

이번주에 보고 넘어갈것들

 

함수 개요

표준 라이브러리 함수

함수의 선언, 정의, 호출

재귀(recursive) 함수

매개변수 전달 방법 : call by value

구조적 프로그래밍

 

 

 

함수?

 

C 프로그램은 함수(function) 의 집합

 

함수란 특정한 작업을 하도록 만들어진 독립적인 단위 모듈

 

큰 프로그램 하나를 여러 개의 함수로 분할하여 구현하는 구조적 프로그래밍(structured programming) 방식의 기본

 

printf(), 자판기, 전광판, 계산기 등

 

함수에 입력시키는 것을 매개변수(parameter) 또는 전달인자 (인수, argument ) 라 함

 

함수가 돌려주는 결과 값을 반환값 또는 리턴값(return value)이라 함

 

자판기 함수의 경우 동전이나 버튼이 매개변수나 인자가 되고, 커피가 리턴값

 

 

 

C프로그램의 기본 틀

 

콘솔 기반 C 프로그램은 main() 함수로 시작 (윈도우 프로그램은 WinMain()함수로 시작)

 

main()함수는 콘솔 기반 C 프로그램의 시작점(entry point)

 

하나의 프로그램에 반드시 하나 존재

 

리턴값이 없는 함수나 매개변수가 없는 함수는 그 위치에 비어 있다는 뜻의 "void"를 씀

 

매개변수 리스트에 쓰는 "void"는 생략할 수 있지만 리턴형에 쓰는 "void"는 생략 불가

 

C99부터는 main()함수는 예외적으로 return 0;이라는 소스를 생략 가능

하지만 대부분 생략하지 않음

 

 

 

main() 함수

main()함수는 뜻이 의미하듯이 가장 중요한 함수로 한 프로그램에 반드시 하나 존재해야 하며,

프로그램의 어느 위치에 있든지 상관없이 제일 먼저 실행

 

main()함수는 콘솔기반 C 프로그램의 시작점(entry point)

(윈도우즈 프로그램 에서는 WinMain()( wWinMain() ) 함수를 대신 사용)

 

함수를 직접 만들기 위해서는 함수의 이름, 리턴값, 매개변수, 실행 코드 등을 작성

 

 

 

 

함수의 장점?

 

복잡한 문제를 나누어서 해결하는 구조적 프로그래밍 (structured programming)이 가능

 

프로그램의 각 부분을 독립적인 모듈로 나누어 작성하므로 작성, 수정, 유지 보수, 확장이 용이

 

반복되는 작업을 하나의 루틴으로 만들어 재사용하므로 코딩 양이 감소

 

일반 사용자가 알 필요가 없는 특정한 부분을 숨길 수 있는 정보 은폐 가능

 

 

이제 부터 기본적인 함수 만들기를 알아보겠습니다!

 

 

 

11-1. 전광판 함수

 

 

 

 

11-2. 두배 해서 출력하는 함수

 

 

 

11-3. 두배 해서 리턴하는 함수

 

 

 

 

11-4. 두수를 더해서 리턴하는 함수

 

 

 

 

11-5. 자판기 함수1

 

 

 

 

11-6. 자판기 함수2

 

 

 

 

11-7. 오류 수정하기

그대로 실행시 나오는 오류 문구들

 

6. warning C4013 'view'가 정의되지 않았습니다. extern은 int형을 반환하는것으로 간주합니다.

11. error C2371: 'view' 재정의. 기본 형식이 다릅니다.

 

2 : 주석을 제거하면 위의 오류를 없앨 수 있음.

"void view(void);"를 10~13행에 있는 view()함수의 선언(원형)이라고 함.

10~13행에 있는 view()함수의 정의가 main()함수보다 나중에 나오면 main()함수 전에 반드시 선언을 해야 함.

함수 정의가 main()함수 뒤에 있으므로 함수 선언을 하지 않고 호출을 하면 컴파일러는 view()라는 함수의 정체를 알지 못하며 에러 체크도 하지 못함. 컴파일러는 함수 호출시 함수 선언과 일치하는지 체크를 하여 오류를 수정함

 

 

 

11-8. 함수 선언,정의,호출

 

 

 

 

 

11-9. 함수의 리턴값

 

 

재귀(recursive) 함수

함수가 함수 내에서 자기 자신을 호출할 수 있는데 이것을 재귀 호출(recursive call)

재귀 호출을 허용하는 함수를 재귀 함수(recursive function)

 

구현하고자 하는 작업이 함수 자신을 순환 반복하여 구현되어질 수 있다면 재귀 함수를 이용할 수 있음

 

재귀 함수는 재귀적 특성을 표현하는 알고리즘에서 쉽고 이해하기 쉬운 문제 해결 방법

함수의 반복 호출로 인한 시간과 메모리 공간의 효율성이 떨어지는 단점

 

스택 오버플로우(stack overflow)에 주의

 

재귀 함수는 반복문을 이용한 함수로 변환이 가능

 

피보나치 수열, 하노이탑 문제, 이진 트리 순회(binary tree traversal), 프랙탈 곡선(fractal curve), 이항 계수(binominal coefficient) 등에 사용

 

 

11-10. 재귀 함수의 예시

 

 

 

 

11-11. 재귀 함수 호출의 스택 오버플로우

7 : 6행의 in값에 따라 sum()함수가 재귀 호출을 하므로 자기 자신을 반복해서 호출하게 되는데

실행 결과를 보면 in이 4790일 때까지는 정상적으로 수행하지만

그 다음부터는 아무런 오류 메시지도 없이 프로그램 실행이 중단됨 이것을 재귀 호출에 의한 스택 오버플로우라 함

 

 

 

스택 오버플로우?

 

함수 내부에서 사용하는 변수들은 스택이란 곳에 저장이 되는데,

마련된 스택의 크기를 초과하였기 때문에 발생하는 문제

 

함수가 끝나면 스택 영역을 다른 함수에서 사용할 수 있는데 재귀적 호출에서는 재귀 함수가 끝나지 않고 계

속 재귀적으로 실행되므로 스택에 값이 들어오기만 하고(push라고 함) 제거(pop)가 되지 않는 것

 

Visual C++에서는 스택의 크기를 [프로젝트]-[xx속성]-[링커]-[명령줄] 탭에서 지정할 수도 있지만 재귀 호출을 할 경우에는 스택이 넘치는 것에 항상 주의를 기울여야 함

 

수정 방법

 

 

 

실매개변수 vs. 형식매개변수

https://en.wikipedia.org/wiki/Parameter_(computer_programming)

 

함수들 간에 서로 데이터를 교환할 때 사용하는 것을 함수의 매개변수라고 함

 

▶ 실매개변수(actual parameter, argument)  함수를 호출할 때 사용하는 매개변수

 

▶ 형식매개변수(formal parameter, parameter)  함수 정의에서 사용하는 매개변수

 

 

 

 

11-12. 실매개변수와 형식매개변수 예시

 

 

 

 

Call by reference?

형식매개변수가 변하면 실매개변수도 변하게 하려면 주소 연산자와 포인터를 이용하여 call by reference로 구현해야 함

 

실매개변수의 주소로 함수를 호출

c=sum(&a,&b);

 

call by reference에서는 sum()함수의 정의를 다음과 같이 수정

 

 

 

 

11-13. call by reference 예시

 

 

 

 

구조적 프로그래밍

 

함수는 큰 프로그램 하나를 여러 개의 모듈로 분할하여 구현하는 구조적 프로그래밍 방식의 기본이며

모듈화 프로그램이 가능하게 함

 

구조적 프로그래밍 스타일의 기본 개념은 “Divide and Conquer(나누어 정복)”로

각각의 기능(모듈)을 함수로 구현하여 합치는 것

 

반복되는 부분은 함수로 구현

 

두 수를 더하여 출력하는 일을 프로그램을 통해서 3번 반복

 

프로그램 내에서 반복적으로 사용하는 부분은 따로 함수로 구현해 놓은 후 그 함수를 호출하는 방식으로 프로그램을 작성하는 것이 여러 가지로 유리

 

 

 

 

11-14. 반복되는 부분은 함수로 구현

 

 

해당 내용은 인덕대학교 2021년도 1학기 C프로그래밍 한성현 교수님 강좌에서 발췌한 내용입니다.

강좌 내용을 원저작자 허락없이 무단 이용시, 처벌의 대상이 될수 있습니다.

댓글