함수 정의, void 자료형 함수 원형선언 함수 호출 변수 영역 규칙 재귀 함수 5장 함수 함수 정의, void 자료형 함수 원형선언 함수 호출 변수 영역 규칙 재귀 함수
함수 함수 문제 해결 방법 C 프로그램은 어떠한 일을 수행하는 프로그램의 부분 문제를 여러 개의 작은 문제로 나누고 작은 문제를 해결하는 함수들을 작성 모듈화 이 함수들을 사용하여 문제를 해결 함수의 반복 사용(재사용) 가능 C 프로그램은 하나 이상의 함수로 구성 main 함수를 반드시 포함하며, main 함수부터 실행함 함수는 인수를 받아서 함수의 프로그램을 실행하고 실행 결과를 반환값으로 돌려줌 C 언어 프로그래밍
함수 소개 함수를 사용하지 않은 프로그램 #include <stdio.h> int main(void) { printf("Begin\n"); printf("Welcome\n"); printf("Learn C function\n"); printf("End\n"); return 0; } 함수를 사용한 프로그램 #include <stdio.h> void welcome(void) … 함수 정의 { printf("Welcome\n"); printf("Learn C function\n"); } int main(void) printf("Begin\n"); welcome(); … 함수 호출 printf("End\n"); return 0; [출력] Begin Welcome Learn C function End C 언어 프로그래밍
함수 소개 – 함수 재사용 함수를 사용한 프로그램 함수를 사용하지 않는 프로그램 #include <stdio.h> int main(void) { printf("Welcome\n"); printf("Learn C function\n"); printf("Begin\n"); printf("End\n'); return 0; } 함수를 사용한 프로그램 #include <stdio.h> void welcome(void) … 함수 정의 { printf("Welcome\n"); printf("Learn C function\n"); } int main(void) welcome(); … 함수 호출 printf("Begin\n"); printf("End\n"); return 0; 3번 반복 C 언어 프로그래밍
함수를 사용한 프로그램 (예 5.1) 함수 원형선언, 함수 정의, 함수 호출로 구성 C 언어 프로그래밍
함수를 사용한 프로그램의 실행 과정 main 함수 add 함수 1. printf("begin ...") 실행 2. 함수 호출: add(10, 20) 인수 10과 20을 함수 add로 보냄 3. 매개변수 a, b가 인수 10, 20을 받음 4. printf("Welcome ...") 실행 5. a + b를 계산하여 결과를 반환(30) 6. add(10,20)의 반환값을 sum에 저장 7. printf("sum ...") 실행 8. 0을 반환하고 프로그램 종료 C 언어 프로그래밍
함수의 정의 함수의 정의 return문 함수가 수행할 일을 기술하는 부분 자료형 함수이름(매개변수 목록) … 함수 header { 변수 선언 함수의 프로그램 … 함수 body } return문 함수의 반환값(결과)을 함수를 호출한 곳에 반환 return 수식; … 수식의 값을 반환하며 함수 종료 return; … 함수 종료 (반환값 없음) 반환값의 자료형 C 언어 프로그래밍
void 자료형 void 자료형: 반환값의 자료형을 선언하지 않으면 int형으로 간주 (권장하지않음) 자료가 없음을 나타내는 특수한 자료형 void print_char(char c, int n) … 함수의 반환값이 없음을 나타냄 { … } void welcome(void) … 괄호 안의 void는 인수가 없음을 나타냄 반환값의 자료형을 선언하지 않으면 int형으로 간주 (권장하지않음) func( … ) int func( …) 와 같음 { { … ... } } C 언어 프로그래밍
예제 (예 5.3) 함수 print_char(): 문자 c를 n번 출력하고 줄 바꾸는 함수 출력만 수행하고 반환값은 없음 void 자료형 [출력] ********** ----- C 언어 프로그래밍
함수 원형 선언과 함수 호출 함수 원형(prototype) 선언 함수의 호출 함수를 사용하기 전에 함수의 반환값과 매개변수들의 자료형을 선언하는 것 void print_char(char, int); 또는 void print_char(char c, int n); … 함수정의의 헤더에 ; 을 붙인 것 함수 호출할 때에 잘못 사용하는 것을 컴파일러가 알 수 있도록 함. 함수의 호출 함수에게 인수 값을 제공하여 함수를 실행시키고 결과를 반환 받음 함수(인수값1, 인수값2, …) 호출하는 함수는 앞에 함수 원형 선언 또는 함수 정의가 있어야 함. C 언어 프로그래밍
예제 (1) (2) 함수 원형 선언 (함수 정의가 뒤에 있는 경우에 반드시 해야 함) 함수 호출 함수 정의 함수 정의 함수 원형 선언 (함수 정의가 뒤에 있는 경우에 반드시 해야 함) 함수 호출 함수 정의 함수 정의 함수 호출 C 언어 프로그래밍
함수 호출과 인수 전달 인수와 매개변수 함수 호출과 인수 전달 인수(실 매개변수): 함수를 호출할 때에 함수에 제공되는 값 인수(실 매개변수): 함수를 호출할 때에 함수에 제공되는 값 매개변수(형식 매개변수): 함수 정의에서 인수를 받기 위해서 사용되는 변수 함수 호출과 인수 전달 함수를 호출할 때에 인수의 값이 매개변수로 복사되어 전달된다. 값에 의한 호출(call by value) 매개변수 값의 변화가 인수(실 매개변수)에는 영향을 주지 않음 실 인수 형식 인수 복사 a = x; b = 20; main() { … a = max(x, 20); } int max(int a, int b) { if (a >= b) return a; else return b; } C 언어 프로그래밍
예제: 매개변수 값이 변하는 함수 (예 5.6) 예 5.3의 print_char 함수를 재작성 count는 함수 호출 후에도 값이 변하지 않고 10임 n은 0으로 감소되어 반복문이 종료함 인수 count 값이 매개변수 n으로 복사되어 전달됨 매개변수 n 값이 함수 내에서 변화함 C 언어 프로그래밍
예제 (예 5.15) 다음 합을 계산하는 프로그램을 함수로 작성하고 n=10에 대해서 k=1부터 5까지의 결과를 출력 S = 1k + 2k + ... + nk 두 함수 작성 int sum_of_power(int n, int k) ... 1k + 2k + ... + nk 계산 int power(int n, int k) ... nk 계산 C 언어 프로그래밍
C 언어 프로그래밍
지역변수와 전역변수 변수의 영역규칙(scope rule) 지역변수와 전역변수 지역변수와 전역변수의 이름은 같을 수 있다. 변수를 사용할 수 있는 유효 범위에 대한 규칙 지역변수와 전역변수 지역변수(local variable) 함수 내에서 선언, 함수 내에서만 사용 가능 { } 내에서 선언, { } 내에서만 사용 가능 전역변수(global variable) 함수바깥에서 선언, 선언한 이후의 모든 함수에서 사용 가능 extern을 사용하면 유효범위를 넓힐 수 있음. 지역변수와 전역변수의 이름은 같을 수 있다. 지역변수와 전역변수의 이름이 같으면 지역변수가 유효함 중첩된 블록의 지역변수들의 이름이 같으면 가장 안쪽에서 정의된 지역변수가 유효함 같은 이름을 사용하지 않을 것을 권장함. C 언어 프로그래밍
예제: 지역변수와 전역변수의 유효범위 지역변수와 전역변수의 유효범위 int b, i; … 전역변수 int main(void) { int b, i; … 지역변수 1 … int c, i; … 지역변수 2 } 변수 b, i는 지역변수1의 것 변수 i는 지역변수2의 것 C 언어 프로그래밍
예제: 전역변수의 사용 전역변수의 사용 (예5.9) 전역변수에 결과를 저장하는 함수 add_sub() 많은 함수에서 사용하는 공용성이 높은 변수에 대해서 주로 사용 함수의 독립성을 위해서 전역변수의 사용을 최소화하는 것이 바람직함 (예5.9) 전역변수에 결과를 저장하는 함수 add_sub() int sum(int a, int b); void add_sub(int a, int b); int sum_glb, diff_glb; … 전역변수 int main(void) { int sum_loc; … 지역변수 sum_loc = sum(10, 20); printf("sum_loc = %d\n", sum_loc); add_sub(10, 20); printf("sum_glb = %d, diff_glb = %d\n", sum_glb, diff_glb); return 0; } int sum(int a, int b) { return a+b; } void add_sub(int a, int b) sum_glb = a+b; diff_glb = a-b; C 언어 프로그래밍
기억장소 할당 방법 기억장소 할당방법 지역변수의 기억장소 할당 전역변수의 기억장소 할당 정적할당: 프로그램 실행 처음부터 끝까지 기억장소를 할당 동적할당: 필요한 동안에만 기억장소를 할당, 효율적인 기억장소 사용 지역변수의 기억장소 할당 기본적으로 동적할당 (auto와 함께 선언한 것과 같음, auto는 생략가능) int a; … auto int a; static을 함께 사용하면 지역변수를 정적할당 static int count; register를 함께 사용하면 지역변수를 CPU내의 레지스터에 할당 register int i; 전역변수의 기억장소 할당 정적할당 프로그램 전체에서 같은 이름의 전역변수는 한 개만 가능 C 언어 프로그래밍
예제: 정적 지역변수 사용 (예 5.10) 자동변수와 지역변수의 차이점을 확인하는 예 #include <stdio.h> void sum(void); int main(void) { sum(); return 0; } void sum(void) { static int a = 0; … 한번만 초기화 int b = 0; … 호출될 때마다 초기화 a++; b++; printf("a = %d, b = %d\n", a, b); } [출력] a = 1, b = 1 a = 2, b = 1 a = 3, b = 1 C 언어 프로그래밍
예제: 정적 지역변수 사용 main() { printf(“First=%d\n”,receip()); printf(“Second=%d\n”,receip()); } receip() static int number=1; return (number++); C 언어 프로그래밍
변수의 구분 C 언어 프로그래밍
재귀함수 함수는 자기 자신을 호출 가능 재귀 호출 재귀함수(recursive function) 함수는 자기 자신을 호출 가능 재귀 호출 재귀함수(recursive function) 직접 또는 간접적으로 자기자신을 호출하는 함수 f_direct() f_indirect() { { … … f_direct(); f_another(); } } f_another() { f_indirect(); } C 언어 프로그래밍
예제: 재귀 함수 사용 (예 5.11) 인수 n을 받아서 1부터 n까지의 정수의 합을 계산하는 함수를 재귀함수로 작성 S(n) = S(n-1) + n (n > 1) … 재귀함수로 구현 가능 S(1) = 1 재귀 호출 C 언어 프로그래밍
예제(계속) 재귀함수 동작 재귀 함수는 궁극적으로는 재귀 호출을 하지 않고 종료될 수 있어야 함. 재귀 재귀 C 언어 프로그래밍
예제: 하노이 탑 1 1 2 2 3 3 a b c a b c (예 5.13) 하노이 탑 문제 3개의 막대: a, b, c 초기상태: 막대 a에 n개의 원반이 크기 순서대로 놓여 있음 다음 규칙을 지키면서 원반을 막대 a에서 막대 c로 이동 1. 원반은 한 번에 하나씩 이동 2. 큰 원반은 작은 원판 위에 놓일 수 없다. 1 1 2 2 3 3 a b c a b c 초기막대 작업막대 목표막대 C 언어 프로그래밍
예제(계속) 해결 방법: 함수 hanoi() 1. n-1 개의 원반을 막대 a에서 막대 b로 이동 … 같은 문제, 크기 n-1 2. n번째 원판을 막대 a에서 막대 c로 이동 3. n-1 개의 원반을 막대 b에서 막대 c로 이동 … 같은 문제, 크기 n-1 함수 hanoi() /* n: 원반 수, x: 초기막대, y: 작업막대, z: 목표막대 */ /* 원반 n개를 막대 x에서 막대 z로 이동시키는 과정을 출력 */ void hanoi(int n, char x, char y, char z) { if (n > 1) { hanoi(n-1, a, c, b); printf("원반 %d: %c => %c\n", n, a, c); /* 출력형식: 원반 3: a => c */ hanoi(n-1, b, a, c); } .... } C 언어 프로그래밍
예제(계속) [출력] 원반 1 : a ==> c 원반 2 : a ==> b 원반 1 : c ==> b 원반 1 : b ==> a 원반 2 : b ==> c [출력] C 언어 프로그래밍