27
4 4 제 제제제 제제 제제제 제 제제제 제제 제제제

제 4 장 함수와 기억 클래스

  • Upload
    alessa

  • View
    44

  • Download
    6

Embed Size (px)

DESCRIPTION

제 4 장 함수와 기억 클래스. 함수의 기초 (cont’d). 함수 주 프로그램으로부터 인수 (argument) 를 전달받아 알련의 작업을 수행한 후 생성된 결과를 주프로그램 (main) 으로 전달하는 하나의 단위 프로그램 함수를 사용하는 이유 반복되는 코드 작성을 없애줌 프로그램을 이해하기 쉽고 이식이 용이하게 함 모듈성 (modularity) 향상시킴. 함수의 기초. 함수 간의 통신 인자의 전달과 리턴되는 값 외부 변수를 이용. 내장 함수. 라이브러리 함수 - PowerPoint PPT Presentation

Citation preview

제 제 44 장 함수와 기억 클래스장 함수와 기억 클래스

함수의 기초 함수의 기초 (cont’d)(cont’d) 함수함수

– 주 프로그램으로부터 인수주 프로그램으로부터 인수 (argument)(argument) 를 를 전달받아 알련의 작업을 수행한 후 생성된 전달받아 알련의 작업을 수행한 후 생성된 결과를 주프로그램결과를 주프로그램 (main)(main) 으로 전달하는 하나의 으로 전달하는 하나의 단위 프로그램단위 프로그램

함수를 사용하는 이유함수를 사용하는 이유– 반복되는 코드 작성을 없애줌반복되는 코드 작성을 없애줌– 프로그램을 이해하기 쉽고 이식이 용이하게 함프로그램을 이해하기 쉽고 이식이 용이하게 함– 모듈성모듈성 (modularity) (modularity) 향상시킴향상시킴

함수의 기초함수의 기초 함수 간의 통신함수 간의 통신

– 인자의 전달과 리턴되는 값인자의 전달과 리턴되는 값– 외부 변수를 이용외부 변수를 이용

내장 함수내장 함수 라이브러리 함수라이브러리 함수

– printf(), scanf(), getch() printf(), scanf(), getch() – reference guide reference guide 참조참조

헤더 파일헤더 파일– 내장 함수들을 기능별로 구분하여 선언해 놓은 파일내장 함수들을 기능별로 구분하여 선언해 놓은 파일– #include#include 를 사용하여 포함를 사용하여 포함– ex) ex) math.h : math.h : 수학적 처리에 담당하는 함수수학적 처리에 담당하는 함수

graphics.h : graphics.h : 그래픽 관련 함수그래픽 관련 함수string.h : string.h : 문자열 처리 함수문자열 처리 함수

사용자 함수사용자 함수 사용자가 정의한 함수사용자가 정의한 함수

– 사용자가 직접 선언 필요사용자가 직접 선언 필요 함수의 정의함수의 정의

return-typereturn-type fuction-namefuction-name((argument declaratioargument declarationsns))

{{declarations and statementsdeclarations and statements

}}

정수 이외의 값을 리턴하는 함수정수 이외의 값을 리턴하는 함수

void void 형 함수형 함수– 리턴 값이 없는 함수리턴 값이 없는 함수– return ; return ; 의 형태로 사용의 형태로 사용

정수 이외의 값을 리턴하는 함수정수 이외의 값을 리턴하는 함수– CC 는 함수의 리턴형이 명시되지 않으면 는 함수의 리턴형이 명시되지 않으면 intint

형으로 간주형으로 간주– 함수의 원형함수의 원형 (prototype)(prototype) 이 필요이 필요

정수 이외의 값을 리턴하는 함수정수 이외의 값을 리턴하는 함수

함수의 원형함수의 원형 (prototype)(prototype) 이 필요한 이유이 필요한 이유– 함수의 리턴값을 알 수 있음 함수의 리턴값을 알 수 있음 – 함수 호출시 자동적인 인자의 형 검사함수 호출시 자동적인 인자의 형 검사– 컴파일시 인자 전달 오류 검사 가능컴파일시 인자 전달 오류 검사 가능

함수의 원형 선언함수의 원형 선언 선언 방법선언 방법

– return-type function-namereturn-type function-name((argument listargument list);); 인자 리스트에 인자의 데이터형만을 지정해도 됨인자 리스트에 인자의 데이터형만을 지정해도 됨 인자가 없는 경우는 인자가 없는 경우는 voidvoid 로 지정로 지정 함수의 원형 선언은 함수의 정의와 일치하여야 함수의 원형 선언은 함수의 정의와 일치하여야 한다한다

– 형식 인자의 이름은 달라도 됨형식 인자의 이름은 달라도 됨

함수의 원형 선언함수의 원형 선언 예제예제

double sqrt(double x);double sqrt(double x);double atof(char []);double atof(char []);int getchar(void);int getchar(void);

예제예제#include <stdio.h>#include <stdio.h>float max(float a, float b, float c);float max(float a, float b, float c);

main()main(){{float x,y,z,k;float x,y,z,k;printf("printf(" 입력입력 :");:");

scanf("%f %f %f", &x, &y, &z);scanf("%f %f %f", &x, &y, &z); k = max(x, y, z);k = max(x, y, z); printf("printf(" 최대값최대값 : %f\n",k);: %f\n",k);

}}

예제예제 (con’d)(con’d)

float max(float a, float b, float c)float max(float a, float b, float c){{

float mx;float mx; if (a > b) mx = a; if (a > b) mx = a; else mx = b;else mx = b;if (c > mx) mx = c;if (c > mx) mx = c;return(mx);return(mx);

}}

인수의 전달인수의 전달 Call by valueCall by value

– 복사한 값 사용복사한 값 사용 , , 다른 기억장소에 저장다른 기억장소에 저장– 함수 내에서 값을 변경하여도 원본에는 바뀌지 않는다함수 내에서 값을 변경하여도 원본에는 바뀌지 않는다 ..

Call by referenceCall by reference– 인수의 메모리 번지가 전달인수의 메모리 번지가 전달 , , 함수에서 메모리 번지를 함수에서 메모리 번지를

참조하여 값을 읽음참조하여 값을 읽음– 함수에서 값을 바꾸면 주프로그램의 값 자체가 바뀐다함수에서 값을 바꾸면 주프로그램의 값 자체가 바뀐다 ..

주 프로그램으로 여러 개의 계산 결과를 전달하고자 할 때 주 프로그램으로 여러 개의 계산 결과를 전달하고자 할 때 유용유용

인수의 전달 예제인수의 전달 예제#include <stdio.h>#include <stdio.h>

void inc_bad(int a) void inc_bad(int a) {{a += 1;a += 1;}}

void inc_good(int *a) void inc_good(int *a) {{*a += 1;*a += 1;}}

인수의 전달 예제인수의 전달 예제 (con’d)(con’d)void main(void) void main(void) {{int i = 5, j = 10;int i = 5, j = 10;int *p;int *p;

p = &j;p = &j;

printf("%d %d %d",inc_bad(i),inc_good(&j),inc_good(p));printf("%d %d %d",inc_bad(i),inc_good(&j),inc_good(p));}}

inc_bad(i)inc_bad(i) 는 는 call by valuecall by value inc_good(&j) inc_good(&j) 와 와 inc_good(p)inc_good(p) 는 는 call by referencecall by reference

Recursion Recursion 함수함수 재귀 호출재귀 호출 (recursion)(recursion)

– 함수가 자기자신을 직접 또는 간접적으로 호출함수가 자기자신을 직접 또는 간접적으로 호출– 재 귀 호 출 을 사 용 하 지 않 았 을 때 보 다 훨 씬 재 귀 호 출 을 사 용 하 지 않 았 을 때 보 다 훨 씬 코드가 간결코드가 간결– 코드를 이해하기 어렵게 만들고 기억 공간을 코드를 이해하기 어렵게 만들고 기억 공간을 많이 요구하는 단점을 가짐많이 요구하는 단점을 가짐– 재 귀 적 인 특 성 을 갖 는 자 료 구 조재 귀 적 인 특 성 을 갖 는 자 료 구 조 (( 트 리트 리 , , 리스트리스트 )) 나 작업에 사용나 작업에 사용

Recursion Recursion 함수의 예제함수의 예제#include <stdio.h>#include <stdio.h>long fact(int n) long fact(int n) {{if(n <= 1) return 1;if(n <= 1) return 1;elseelse

return(n * fact(n-1));return(n * fact(n-1));}}

main()main(){{int num;int num;for(num = 1;num <= 10;num++)for(num = 1;num <= 10;num++)printf("%2d! = %10ld",num, fact(num));printf("%2d! = %10ld",num, fact(num));

}}

main main 함수와 인자함수와 인자 main() main() 함수의 원형함수의 원형

– int main( int argc, char *agrv[], char *env[] ) ;int main( int argc, char *agrv[], char *env[] ) ; int argc : command lineint argc : command line 에 쓰여지는 인자의 갯수에 쓰여지는 인자의 갯수 char *argv[] : command linechar *argv[] : command line 에서 입력한 인자들이 에서 입력한 인자들이

존재하는 메모리의 번지수를 차레대로 기억하고 존재하는 메모리의 번지수를 차레대로 기억하고 있다있다 ..

argv[0] : argv[0] : 실행 파일 이름실행 파일 이름 (( 경로가 입력된 경우는 경로가 입력된 경우는 경로까지 포함경로까지 포함 ))

argv[1] : argv[1] : 첫 번째 인자의 내용첫 번째 인자의 내용 인자들 사이는 인자들 사이는 white character(spacewhite character(space 나 나 tab)tab) 에 에

의해 구분의해 구분

C C 전처리기전처리기(preprocessor)(preprocessor)

전처리기전처리기 (preprocessor)(preprocessor)– 컴파일의 첫번째 단계를 수행컴파일의 첫번째 단계를 수행– 기능 기능

화일의 포함화일의 포함 : #include: #include 매크로 치환매크로 치환 : #define: #define 조건부 컴파일조건부 컴파일 : #if, #else, #endif, #ifdef, #ifndef: #if, #else, #endif, #ifdef, #ifndef

파일의 포함파일의 포함– 헤더화일을 포함시킬 때 사용헤더화일을 포함시킬 때 사용– #include "#include "filenamefilename" " 또는 또는 #include <#include <filenamefilename>>– ""filenamefilename"" 이면 소스 프로그램이 존재하는 디렉토리부터 이면 소스 프로그램이 존재하는 디렉토리부터

화일의 탐색 시작화일의 탐색 시작– <<filenamefilename>> 이 면 컴 파 일 러 가 사 용 하 는 규 칙 에 따 라 이 면 컴 파 일 러 가 사 용 하 는 규 칙 에 따 라

화일을 찾음화일을 찾음

매크로 치환매크로 치환 #define#define 은 심볼 상수나 인자를 갖는 매크로를 은 심볼 상수나 인자를 갖는 매크로를 정의하는데 사용정의하는데 사용

– #define #define namename replacement text replacement text– replacement textreplacement text 가 두개이상의 행으로 나타날 때 가 두개이상의 행으로 나타날 때 각 행의 끝에 각 행의 끝에 \\– 토큰 토큰 namename 을 을 replacement textreplacement text 로 치환하는 일을 로 치환하는 일을 수행수행

#define#define 은 인자를 갖는 매크로를 정의할 수 있음은 인자를 갖는 매크로를 정의할 수 있음– #define max(A, B)#define max(A, B) ((A) > (B) ? (A) : (B))((A) > (B) ? (A) : (B))

기억 클래스기억 클래스 모든 변수는 참조될 수 있는 범위모든 변수는 참조될 수 있는 범위 (scope)(scope) 를 를

가진다가진다 .. 지역 변수지역 변수 (local variable, (local variable, 내부 변수내부 변수 ))

– 함수 안에 즉 어떠한 블록 안에 정의된 변수함수 안에 즉 어떠한 블록 안에 정의된 변수 블록블록 ({}({} 으로 묶인 부분으로 묶인 부분 )) 안에서만 통용안에서만 통용 다른 함수에서는 참조될 수 없다다른 함수에서는 참조될 수 없다 함수가 호출되면 생성되었다가 리턴하면 소멸함수가 호출되면 생성되었다가 리턴하면 소멸 (( 자동변자동변

수수 , automatic variable), automatic variable)

기억 클래스기억 클래스 전역 변수전역 변수 (global variable, (global variable, 외부 변수외부 변수 ))

– 함수의 바깥에서 정의된 변수로 여러 함수가 함수의 바깥에서 정의된 변수로 여러 함수가 전역적으로 접근 가능전역적으로 접근 가능

– 함수와 함수 사이에서 데이터 전달 수단으로 함수와 함수 사이에서 데이터 전달 수단으로 사용될 수 있음사용될 수 있음

– 프로그램 시작시 생성되고 종료될 때가지 유지프로그램 시작시 생성되고 종료될 때가지 유지– 반드시 한 번만 정의되어야 하며 여러 번 선언 가능반드시 한 번만 정의되어야 하며 여러 번 선언 가능

기억 클래스기억 클래스 외부 변수와 범위외부 변수와 범위

– 변수의 정의변수의 정의 변수를 선언변수를 선언 변수의 데이터형에 해당하는 크기의 기억 장소 할당변수의 데이터형에 해당하는 크기의 기억 장소 할당 변수의 선언 기능도 수행변수의 선언 기능도 수행

– 변수의 선언변수의 선언 변수의 이름과 데이터 형을 알림변수의 이름과 데이터 형을 알림 기억 장소 할당이 없음기억 장소 할당이 없음

기억 클래스기억 클래스– ex) int extvar ; ex) int extvar ; /* /* 정의 정의 */*/

char extarray[100] ; char extarray[100] ; /* /* 정의 정의 */*/ extern int extvar ; /*extern int extvar ; /* 선언선언 , , 보통 보통 extvarextvar

은 다른 모듈에 선언은 다른 모듈에 선언 */*/ extern char extarray[100] ; /*extern char extarray[100] ; /* 선언선언 */*/

기억 클래스기억 클래스 정적 변수정적 변수 (static variable)(static variable)

– 지역 변수의 값을 유지하기 위해 사용지역 변수의 값을 유지하기 위해 사용– 프로그램의 종료 후에도 그 값이 소멸되지 않고 프로그램의 종료 후에도 그 값이 소멸되지 않고

보관되며 다시 호출될 때에는 그 직전의 값 참조보관되며 다시 호출될 때에는 그 직전의 값 참조– ex) static int c ;ex) static int c ;

register register 변수변수– 기억할 자료의 값을 메모리에 저장하는 대신 직접 기억할 자료의 값을 메모리에 저장하는 대신 직접 CPUCPU

내의 기억장소인 레지스터내에 기억 내의 기억장소인 레지스터내에 기억 : performace: performace 측면측면– intint 형과 형과 unsigned int unsigned int 형만 가능형만 가능

기억 클래스 예제기억 클래스 예제 ((static static 변수변수 ))##include <stdio.h>include <stdio.h>

void test()void test(){{static int s_count = 0;static int s_count = 0;int a_count = 0;int a_count = 0;

s_count++;s_count++;a_count++;a_count++;printf("static count = %dcount = %d",s_count,a_count);printf("static count = %dcount = %d",s_count,a_count);}}main()main(){{int I;int I;for(i=1; i<=10;i++)for(i=1; i<=10;i++)test();test();}}

예제 예제 (Factorial)#include <stdio.h>#include <stdio.h>double fact(); /* double fact(); /* 함수 선언 함수 선언 */*/

main()main(){{

int n = 0; /* int n = 0; /* 내부변수의 선언 내부변수의 선언 */*/do {do {

printf("printf(" 양수 입력양수 입력 :");:");scanf("%d",&n);scanf("%d",&n); if (n<0) return(0); /*if (n<0) return(0); /* 입력된 수가 입력된 수가 00 보다 작보다 작 */*/fact(n); /* fact(n); /* 으면 프로그램 종료 으면 프로그램 종료 */*/printf("\n");printf("\n");} while (1); /* } while (1); /* 조건이 조건이 1(1( 참참 )) 이므로 무한루프 이므로 무한루프 */*/

}}

예제예제 (con’d)(con’d)

double fact( int k )double fact( int k ){{

register int i; /* register int i; /* 레지스터 변수 선언 레지스터 변수 선언 */*/double s = 1; double s = 1; for (i = 1;i <= k;i++) {for (i = 1;i <= k;i++) {s *= i;s *= i;printf("%3d! => %16.0f\n",i,s);printf("%3d! => %16.0f\n",i,s);}}return(s);return(s);}}