7장 함수(Function)
7장 함수(function) 함수(Function) 함수의 선언과 호출 인수 전달(Parameter Passing) 재귀함수 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 7장 함수(function) 함수(Function) 함수의 선언과 호출 인수 전달(Parameter Passing) 재귀함수 주기억 장소관리(Memory Management)
함수(function) 함수 함수의 종류 함수 사용의 장점 특정 작업을 수행하는 코드의 집합 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수(function) 함수 특정 작업을 수행하는 코드의 집합 함수의 종류 ( ) : C 언어에서 제공하는 함수 사용자 정의 함수: 사용자가 작성한 함수 main( )함수: ( ) 서브 함수(sub function) 함수 사용의 장점 코드의 재사용성을 향상, 개발시간을 단축 여러 사람이 나누어 작성가능, 큰 시스템 개발에 효과적 에러수정이 용이함, 프로그램 유지보수에 효과적
수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수(function)- 기본요소
함수의 정의 1 입, 출력이 모두 있는 함수 x, y를 입력 받아 sum() 함수의 기능을 처리하고 int형으로출력 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수의 정의 1 입, 출력이 모두 있는 함수 x, y를 입력 받아 sum() 함수의 기능을 처리하고 int형으로출력 출력 형태가 있어서 함수 내에서 반드시 return문을 사용해야 함 출력 형태 있음 (int) 입력 형태 있음 (int x, int y) result = x + y result x, y
함수의 정의 2. 입력은 없고, 출력만 있는 함수 입력 받는 값 없이 함수의 기능을 처리하고 int형으로 출력 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수의 정의 2. 입력은 없고, 출력만 있는 함수 입력 받는 값 없이 함수의 기능을 처리하고 int형으로 출력 출력 형태가 있어서 함수 내에서 반드시 return문을 사용해야 함 출력 형태 있음 (int) 입력 형태 없음 (void) scanf(“%d”, num); num
함수의 정의 3. 입력은 있고, 출력이 없는 함수 x값을 입력받아 함수의 기능을 처리하고 출력은 하지 않음 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수의 정의 3. 입력은 있고, 출력이 없는 함수 x값을 입력받아 함수의 기능을 처리하고 출력은 하지 않음 출력 형태가 void이므로 함수 내에서 return 문 생략가능 출력 형태 없음 (void) 입력 형태 있음 (int x) x printf(“%d”, a);
함수의 정의 4. 입, 출력이 모두 없는 함수 입력 없이 함수의 기능을 처리하고 출력은 하지 않음 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수의 정의 4. 입, 출력이 모두 없는 함수 입력 없이 함수의 기능을 처리하고 출력은 하지 않음 출력 형태가 void이므로 함수 내에서 return 문 생략가능 출력 형태 없음 (void) 입력 형태 printf(“Hello”); printf(“world”);
함수의 호출 함수의 ( ) 함수의 입출력 목록이 있는 문장 함수의 ( ) 함수의 기능을 정의한 문장 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수의 호출 함수의 ( ) 함수의 입출력 목록이 있는 문장 함수의 ( ) 함수의 기능을 정의한 문장 함수의 ( ) 정의한 함수를 호출 하는 문장 첫 번째 방법 함수의 ( ) 함수의 ( ) 두 번째 방법 함수의 ( ) 함수의 ( ) 함수의 ( )
수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수의 호출(첫번째 방법)
수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수의 호출(첫번째 방법)
수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수의 호출(두번째 방법)
함수의 호출(P164) 호출할때 실인수 i,j의 값은 가인수 x, y의 값으로 복사된다 가인수와 실인수의 개수는 같아야한다 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 함수의 호출(P164) 호출할때 실인수 i,j의 값은 가인수 x, y의 값으로 복사된다 가인수와 실인수의 개수는 같아야한다 가인수와 실인수는 나열된 순서대로 각 인수의 형태가 같아야 한다
예제- 입출력이 없는 함수(p164) #include <stdio.h> 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 예제- 입출력이 없는 함수(p164) #include <stdio.h> void display1( ) { /* 가인수와 결과 값이 없는 함수 */ printf("\n *** Function display1( ) *** \n"); } void display2( ) { printf("\n === Function display2( ) ===\n"); int main(void) { printf(" Call function display1( )\n"); display1( ); printf(" Call function display2( )\n"); display2( ); return 0;
예제- 입력 인수만 있는 함수(p165) #include <stdio.h> 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 예제- 입력 인수만 있는 함수(p165) #include <stdio.h> void space(int n) { /* n은 가인수 */ int i; for (i = 0; i < n; i++) printf(" "); } int main( ) { for (i = 0; i < 10; i++) { space(i); /* i는 실인수 */ printf("Hello everybody\n"); return 0;
예제- 입출력이 모두 있는 함수( P166) 정수의 절대값을 구하는 함수(입력인수 1개) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 예제- 입출력이 모두 있는 함수( P166) 정수의 절대값을 구하는 함수(입력인수 1개) #include <stdio.h> int abs(int k) { /* k는 가인수 */ int m; m = (k<0)? -k : k; return(m); /*함수의 출력형태가 int 이므로 정수값(int m)을 반환 */ } void main( ) { int a=10, b= -20, c=30; int x, y, z; x = abs(a); /* a는 실인수 */ y = abs(b); /* b는 실인수 */ z = abs(c); /* c는 실인수 */ printf(" a = %d\t b = %d\t c = %d\n", a, b, c); printf(" x = %d\t y = %d\t z = %d\n", x, y, z); return 0;
예제- 입출력이 모두 있는 함수(P167) 함수를 이용해 두수의 합구하기(입력인수 2개) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 예제- 입출력이 모두 있는 함수(P167) 함수를 이용해 두수의 합구하기(입력인수 2개) #include <stdio.h> int plus(int x, int y){ /* x,y는 가인수 */ int z; z = x+y; return(z); } int main( ) { int a, b, c; a = 4; b = 5; c = plus(a, b); /* a,b는 실인수 */ printf(" %d + %d = %d\n", a, b, c); return 0;
인수 전달(Parameter passing) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 인수 전달(Parameter passing) 인수(Parameter) 함수간에 서로 주고 받을 자료 ( ): 호출되는 함수의 인수(자료를 넘겨 받음) ( ): 호출하는 함수의 인수(자료를 넘겨 줌) 인수 전달 방식 ( )에 의한 호출(call by value) ( )에 의한 호출(call by reference)
인수 전달 방식 1. ( )에 의한 호출(call by value) 2. ( )에 의한 호출(call by reference) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 인수 전달 방식 1. ( )에 의한 호출(call by value) 호출시에 실인수의 값이 가인수로 복사된다. 가인수와 실인수는 독립적인 복사본 관계 가인수의 값이 변경되도 실인수의 값은 영향이 없다 2. ( )에 의한 호출(call by reference) 호출시에 실인수의 주소가 가인수로 복사된다. 가인수가 실인수의 값을 참조한다 가인수가 참조하는 값을 변경하면 실인수의 값에 영향이 있다.
수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 값에 의한 호출(call by value)
참조에 의한 호출(call by reference) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 참조에 의한 호출(call by reference)
예제- call by value (p173) int power(int x, int y) { int i, p; p = 1; 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 예제- call by value (p173) int power(int x, int y) { int i, p; p = 1; for (i = 1; i <= y; i ++) p = p * x; return(p); } int main( ) { int base, i, value; base = 2; for (i = 0; i <= 20; i++) { value = power(base, i); printf("%d ** %d = %d\n", base, i, value); return 0;
재귀함수 재귀함수(recursive call) 직접 재귀함수 간접 재귀함수 함수 내에서 ( )을 호출하는 함수 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 재귀함수 재귀함수(recursive call) 함수 내에서 ( )을 호출하는 함수 주의사항: ( ) 직접 재귀함수 간접 재귀함수
재귀함수- 예제1(p175) int function_A(int i) { 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 재귀함수- 예제1(p175) int function_A(int i) { if (i == 10) return 0; /* 끝나는 조건 */ else { printf("recursion parameter i = %d \n", i); i++; function_A(i); /* 재귀 함수 호출 */ } int main( ) { int i = 5; /* 정수 변수 i를 5로 초기화 */ printf("Start recursion function \n "); function_A(i); printf("End of recursion function"); return 0;
재귀함수- 예제2(P176) #include <stdio.h> int factorial(int k){ 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 재귀함수- 예제2(P176) #include <stdio.h> int factorial(int k){ if(k>1) return k*factorial(k-1); else return 1; } int main( ) { int i; scanf("%d", &i); printf("\n %d factorial=%d", i, factorial(i)); printf("\n\n"); return 0;
재귀함수- 예제3(P177) #include <stdio.h> void function_A(int i); 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 재귀함수- 예제3(P177) #include <stdio.h> void function_A(int i); void function_B(int i); int main( ) { int i = 0; function_A(i); return 0; } void function_A(int i) { if ( i == 10) return; else { printf("Function_A ::: "); function_B(i); void function_B(int i) { if (i == 10) return; else { printf(" Function _B( ) i = %d \n", i++); function_A(i); /* function_A를 재귀 호출 */ }
재귀함수- 예제4(p178) 역승 #include <stdio.h> int power(int x, int y) { 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 재귀함수- 예제4(p178) 역승 #include <stdio.h> int power(int x, int y) { return (y == 0)? 1 : x*power(x,y-1); } int main( ) { int m=2, k, c; for (k=0; k<=10; k++){ c = power(m,k); printf(" %d ^ %d = %3d\n", m, k, c); return 0;
재귀함수- 예제5(p178) #include <stdio.h> #include <conio.h> 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 재귀함수- 예제5(p178) #include <stdio.h> #include <conio.h> void dasi( ); void main( ){ int ch; printf("Please input. \n Q ==> end\n"); ch = getch( ); printf("Input == %c character\n", ch); if(ch != 'q' && ch != 'Q') dasi( ); } void dasi( ) { main( );
Main()함수에 인수를 전달하는 방법-(P179) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 Main()함수에 인수를 전달하는 방법-(P179) 인수 ( )를 저장하는 인수 #include <stdio.h> int main(int argc, char *argv[ ]) { int i; for (i=0; i<argc; i++) printf("Argument(가인수)의 수=%d,\t 값=%s\n", i, argv[i]); printf("Argc = %d\n", argc); return 0; } 인수( )들을 저장하는 인수
예제- main()함수의 인수-(p179) void usage( ) { printf("\n"); 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 예제- main()함수의 인수-(p179) void usage( ) { printf("\n"); printf("Usage : argc2 [file-name]\n"); } int main(int argc, char *argv[]) { if (argc !=2){ usage( ); printf("argv[1] == %s\n", argv[1]); return 0;
주기억 장소 관리 기억장소에서의 변수의 위치 주기억 장소의 할당(P184그림참조) ( ) : ( 전역변수, Static 변수) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 주기억 장소 관리 기억장소에서의 변수의 위치 주기억 장소의 할당(P184그림참조) ( ) : ( 전역변수, Static 변수) 함수 시작시 할당 함수 종료시 소멸 ( )
변수의 범위(scope) 지역변수(Local variable) 전역변수(Global variable) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 변수의 범위(scope) 지역변수(Local variable) 선언된 함수또는 블록 내에서만 사용 조건문 또는 반복문의 중괄호({ }) 내부에서 사용 함수의 인수(Parameter) 즉, 함수의 입력 변수들 초기화하지 않으면 쓰레기값이 들어가 있다. 함수가 종료될때 소멸된다. 전역변수(Global variable) 중괄호({ }) 외부에서 사용, 즉 모든 함수에서 사용 초기화하지 않아도 자동으로 0으로 초기화된다. 프로그램이 종료될 때 소멸된다
변수의 범위(scope) ( ) (Static variable) ( )(Extern variable) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 변수의 범위(scope) ( ) (Static variable) 자료형 앞에 ( ) 키워드를 붙임 함수내 지역변수를 함수종료 후에도 유지시킬때 사용 함수밖 전역변수를 외부화일에서 참조하지 못하도록 할때 ( )(Extern variable) 다른 파일(외부)에 있는 전역 변수를 이용할때 사용 자료형 앞에 ( ) 키워드를 사용 ( )(Register variable) CPU 내부의 레지스터에 변수를 할당하는 변수 처리속도가 빠름
변수의 범위(scope)-(p188) 전역 변수 외부변수 (전역 변수) 전역 변수 지역 변수 레지스터변수 외부변수 (무시된다) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 변수의 범위(scope)-(p188) 전역 변수 외부변수 (전역 변수) 전역 변수 지역 변수 레지스터변수 외부변수 (무시된다) 정적 변수 전역 변수 전역 변수 외부변수 (지역 변수) 지역 변수
지역변수(local variable)-(p189) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 지역변수(local variable)-(p189) #include <stdio.h> void sub( ) { int i =2; printf("함수 sub( ) --> i == %d\n",i); } int main( ) { int i =7; sub( ); printf("함수 main( ) --> i == %d\n",i); return 0; 지역적으로 전혀 다른 지역 변수 우린 서로 달라!
전역변수(Global variable)-(p190) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 전역변수(Global variable)-(p190) #include <stdio.h> int i=7; /* 전역 변수 */ void sub( ) { i = i + 1; printf("함수 sub( ) → i == %d\n",i); } void main( ) { printf("함수 main( ) → i == %d\n",i); sub( );
정적변수(Static variable)-(p191) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 정적변수(Static variable)-(p191) #include <stdio.h> void sub1( ){ int j=0; j = j + 1; printf("local variable j = %d\n", j); } void sub2( ){ static int k=0; /* 정적변수 */ k = k + 1; printf("global variable k = %d\n", k); void main( ){ int i; for (i=0;i<5; i++) sub1( ); for (i=0;i<5; i++) sub2( );
지역변수와 전역변수 예제(p192) void sub1( ); void sub2( ); int main( ) { 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 지역변수와 전역변수 예제(p192) void sub1( ); void sub2( ); int main( ) { int i=0; /*지역변수*/ sub1( ); sub2( ); printf("함수 main( ) --> i == %d\n", i); return 0; } static int i; /*전역변수 */ void sub1( ) { ++i; printf("함수 sub1( ) --> i == %d\n", i); void sub2( ) { printf("함수 sub2( ) --> i == %d\n", i); static을 생략해도 결과는 같다. static을 붙임으로 외부화일에서 참조하는 것을 금한다.
정적변수와 지역변수의 비교-(P192) #include <stdio.h> void sub( ); 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 정적변수와 지역변수의 비교-(P192) #include <stdio.h> void sub( ); int main( ) { printf("STATIC\t AUTO\n"); printf("------------------\n"); sub( ); sub( ); sub( ); return 0; } void sub( ) { static int i=1; /*정적변수*/ auto int k=1; /*지역변수, auto 를 생략해도 됨*/ printf("i == %d\t k == %d\n",i,k); i++; k++;
외부변수(Extern variable)-(p193) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 외부변수(Extern variable)-(p193) file1.c 외부화일(file2.c) 에서 정의한 함수를 사용하고자 할때 #include <stdio.h> //#include "file2.c" void sub1( ); void sub2( ); int x; void main( ) { x = 10; sub1( ); sub2( ); sub3( ); sub4( ); } void sub1( ){ x++; printf("함수 sub1( ) → x == %d\n",x); void sub2( ){ printf("함수 sub2( ) → x == %d\n",x); file2.c sub3( ) { extern int x; /* 외부변수*/ x++; printf("함수 sub3( ) → x == %d\n",x); x = 300; } sub4( ) { int x = 400; /* 지역 변수 */ printf("함수 sub4( ) → x == %d\n",x); 외부화일(file1.c) 에서 정의한 변수를 사용하고자 할때
레지스터 변수(Register variable)-(p194) 수원과학대학 컴퓨터정보과 1학년 1학기 2019-05-11 레지스터 변수(Register variable)-(p194) #include <stdio.h> int main( ) { register int k,m; /*레지스터 변수 */ for(k=m=0; k<=100; k++) m+=k; /* m = m + k;와 같다 */ printf("합계는 %d 입니다.\n", m); return 0; }