9장. C 언어의 핵심! 함수
9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1
함수를 정의하는 이유 4가지 형태의 함수 9-1 함수의 정의와 선언 모듈화에 의한 프로그램의 질 향상이 가능 9-1 함수의 정의와 선언 함수를 정의하는 이유 모듈화에 의한 프로그램의 질 향상이 가능 유지 보수 및 확장의 용이성 문제 해결의 용이성 : "Divide and Conquer!" 4가지 형태의 함수 전달 인자 有, 반환 값 有 전달 인자 有, 반환 값 無 전달 인자 無, 반환 값 有 전달 인자 無, 반환 값 無
9-1 함수의 정의와 선언 전달 인자와 반환 값, 둘 다 있는 함수 그림 9-2 int Add(int i, int j) { 9-1 함수의 정의와 선언 전달 인자와 반환 값, 둘 다 있는 함수 int Add(int i, int j) { int result = i+j; return result; } 그림 9-2
9-1 함수의 정의와 선언 함수 호출 과정의 이해 그림 9-3 #include <stdio.h> 9-1 함수의 정의와 선언 함수 호출 과정의 이해 #include <stdio.h> int Add(int i, int j) { int result = i + j; return result; } int main(void) int d; d = Add(3, 4); printf("%d \n", d); return 0; 그림 9-3
9-1 함수의 정의와 선언 다양한 형태의 함수 void Result_Print(int val) { 9-1 함수의 정의와 선언 다양한 형태의 함수 void Result_Print(int val) { printf("덧셈에 대한 결과 : %d \n", val); printf("****** END ******** \n"); } int Input(void) { int input; scanf("%d", &input); return input; } void Intro(void) { printf("****** START ****** \n"); printf("두개의 정수 입력 : "); }
9-1 함수의 정의와 선언 함수 선언의 필요성 컴파일러의 특성상, 함수는 호출되기 전에 정의되어야 한다. 그림 9-4
9-1 함수의 정의와 선언 함수 선언의 의미 이후에 정의될 함수에 대한 정보 제공 9-1 함수의 정의와 선언 함수 선언의 의미 이후에 정의될 함수에 대한 정보 제공 func_add.c, large_number.c 그림 9-5
9-2 변수의 범위(scope) 변수의 특성에 따른 분류 지역 변수(Local Variable) 중 괄호 내에 선언되는 변수 전역 변수(Global Variable) 함수 내에 선언되지 않는 변수 정적 변수(Static Variable) 함수 내부, 외부 모두 선언 가능 레지스터 변수(Register Variable) 선언에 제한이 많이 따름
9-2 변수의 범위(scope) 지역 변수의 접근 범위 지역 변수는 선언 된 함수 내에서만 접근 가능 범위 1 범위 2 int fct_one(void) { int one=0; return 0; } int fct_two(void) int two=0; 범위 1 범위 2
9-2 변수의 범위(scope) 지역 변수의 메모리상 존재 기간 1단계 그림 9-7 int fct_one(void) { int one=10; return 0; } int fct_two(void) int one=20; int two=30; int main(void) int val=10; fct_one(); fct_two(); 1단계 그림 9-7
9-2 변수의 범위(scope) 지역 변수의 메모리상 존재 기간 2단계 3단계 그림 9-8 그림 9-9
9-2 변수의 범위(scope) 지역 변수의 메모리상 존재 기간 4단계 그림 9-10
9-2 변수의 범위(scope) 또 다른 형태의 지역 변수 while, for, if와 같은 문장에 의해 형성 되는 지역 내에서 선언되는 변수 예제 local_val1.c, local_val3.c 그림 9-11 그림 9-12
9-2 변수의 범위(scope) 지역 변수의 또 다른 특성 경우에 따라서 지역 변수는 다른 지역 변수를 가리기도 한다. 경우에 따라서 지역 변수는 다른 지역 변수를 가리기도 한다. /* local_val2.c */ #include <stdio.h> int main(void) { int val=0; if(1) //무조건 true val+=10; printf("%d", val); } return 0; 그림 9-14
9-2 변수의 범위(scope) 지역 변수와 매개 변수 매개 변수도 지역 변수의 일종이다. 그림 9-15 int fction (int a, int b) { a+=10; b+=20 return a+b; } 그림 9-15
9-2 변수의 범위(scope) 전역 변수 전역 변수의 또 다른 특징 프로그램 어디에서나 접근이 가능한 변수 특정 영역(함수, 반복문...)에 속하지 않는다. 프로그램이 종료될 때까지 존재 예제 glo_val1.c 전역 변수의 또 다른 특징 같은 이름의 지역 변수에 의해서 가려지기도 한다. glo_val2.c
9-2 변수의 범위(scope) static 변수 보다 빠르게! register 변수 함수 내부 및 외부에 선언 가능하다. 한번만 초기화된다 : 전역 변수의 특징 함수 내부에서 선언될 경우 함수 내에서만 접근이 가능하다 : 지역 변수의 특징 예제 static_val.c 보다 빠르게! register 변수 int main(void) { int a ; register int b; // 레지스터 변수 b 선언 . . . . .
/* static_val.c */ #include <stdio.h> void fct(void); int main(void) { int i; for(i=0; i<5; i++) fct(); return 0; } void fct(void) int val=0; // static int val=0; val++; printf("%d ",val);
9-3 재귀 함수 재귀 함수의 기본적 이해 자기 자신을 다시 호출하는 형태의 함수 /* recursive_basic.c */ 9-3 재귀 함수 재귀 함수의 기본적 이해 자기 자신을 다시 호출하는 형태의 함수 /* recursive_basic.c */ #include <stdio.h> void Recursive(void) { printf("Recursive Call! \n"); // Recursive(); } int main(void) Recursive(); return 0;
9-3 재귀 함수 탈출 조건의 필요성 무한 재귀 호출을 피하기 위해서 그림 9-16
9-3 재귀 함수 탈출 조건의 이해 예제 recursive_basic2.c 참조 그림 9-17
/* recursive_basic2.c */ #include <stdio.h> void Recursive(int n) { printf("Recursive Call! \n"); if(n==1) return; Recursive(n-1); } int main(void) int a=2; Recursive(a); return 0;
9-3 재귀 함수 재귀 함수 Design 사례 팩토리얼(factorial) 계산을 위한 알고리즘 그림 9-18 그림 9-19
9-3 재귀 함수 재귀 함수 Design 사례 알고리즘을 코드로 옮기기 위한 pseudo code와 C 코드 9-3 재귀 함수 재귀 함수 Design 사례 알고리즘을 코드로 옮기기 위한 pseudo code와 C 코드 예제 rec_facto.c // 시작 조건 : n은 0 이상이다. 시작(START) : f(n) 호출 1. 만약에 n이 0이면 1을 반환 2. 그렇지 않다면 n f(n-1)을 반환. 끝(END) int f(int n) { if (n==0) return 1; else return n*f(n-1); }
시험 범위 시험일자 : 10월 13일(수) 오후 3시 범위 : 2장 ~ 8장 연습문제 문항 : 총 10문제 중 5문제 선택 배점 : 각 문항당 20점 응용과 주석으로 프로그램을 설명하면 가산 점수 인정 부정행위 적발 시 0점 처리