250 likes | 559 Views
처음으로 배우는 C 프로그래밍. 제3부 함수 제 6 장 함수 작성. 제 1 절 함수 정의와 선언. 함수 데이터를 전달 받아 적당한 연산을 수행한 후 결과를 반환 main() 함수 내에서 사용자 정의 함수 호출 예 헤 maxnum = find_max(firstnum, secnum); find_max() 함수는 호출되는 함수( called function) main() 함수는 호출하는 함수( calling function)
E N D
처음으로 배우는 C 프로그래밍 제3부 함수 제 6 장 함수 작성
제 1 절 함수 정의와 선언 • 함수 • 데이터를 전달 받아 적당한 연산을 수행한 후 결과를 반환 • main() 함수 내에서 사용자 정의 함수 호출 예 • 헤 maxnum = find_max(firstnum, secnum); • find_max() 함수는 호출되는 함수(called function) • main() 함수는 호출하는 함수(calling function) • float find_max(float, float); 인자로 부동소수점 수 두개를 받아 부동소수점 수를 반환하는 find_max() 함수의 프로토타입 • 함수의 정의 : 함수 헤더와 함수 몸체로 구성 • 함수 헤더(function header)는 함수에 의해 반환되는 값의 데이터 형, 함수의 이름, 요구되는 인자들의 개수, 순서, 데이터 형을 명시
제 1 절 함수 정의와 선언 • float find_max(float x, float y) : x, y를 형식 인자라 함 • int max_it(float x, float y) • max_it(float x, float y) : 반환 값의 형이 생략되면 정수를 반환한다고 가정 • void display(int x, double y) : void는 반환하는 값이 없을 때 쓰임 • double print_message(void) : void는 전달되는 인자가 없을 때에도 쓰임 • 함수 몸체(function body)는 전달된 인자를 이용하여 적당한 연산을 수행한 후 많아야 하나의 값을 반환. 열림 중괄호({)로 시작, 변수 선언, 유효한 C문장들, 반환문, 닫힘 중괄호(})로 끝남
제 1 절 함수 정의와 선언 • find_max() 함수의 완전한 정의 float find_max(float x, float y) /* 함수 헤더 */ { /* 함수 몸체의 시작 */ float maxnum; /* 변수 선언 */ if (x >= y) maxnum = x; /* 최대값을 찾는 문장 */ else maxnum = y; return (maxnum); /* 반환문 */ } /* 함수 몸체의 끝, 함수 정의의 끝 */ • 함수의 선언: 함수 프로토타입 • 함수는 호출되기전에 반드시 선언되어야 한다 • printf()나 scanf() 함수를 쓰기 위해서 #include <stdio.h> 선언
제 1 절 함수 정의와 선언 • 함수 프로토타입 형태 return-data-type function-name(list of argument data type); float find_max(float, float); float roi(int, char, char, double); void display(double, double); • 함수의 호출 • maxnum = find_max(firstnum, secnum); • firstnum, secnum은 실인자라고 불리고 함수 호출시 형식인자인 x, y로 복사되어 함수 내에서 사용된다 • 함수 내에서 x, y를 변경하여도 firstnum, secnum은 변경되지 않는다
제 2 절 표준 라이브러리 함수 • C언어는 입출력, 수학, 문자열 등을 다루는 미리 프로그램된 함수들의 집합을 제공 • 표준 라이브러리 함수를 사용하기 전에 알아야 할 사항 • 함수가 하는 일, 예: 제곱근을 구한다 • 함수 이름, 예: sqrt • 요구되는 인자들: double형의 제곱근을 구하고자 하는 수 • 반환되는 데이터 형: double형 • 함수가 선언된 헤더 파일: math.h
제 2 절 표준 라이브러리 함수 • 입출력 라이브러리 함수 • 헤더 파일: stdio.h, stdio는 standard input/output의 약자 • getchar() 함수 • 한 문자를 입력받는다. • 프로토타입: int getchar(void); • in_char = getchar(); scanf(“%c”, &in_char); 과 동일 • 연속적으로 문자열을 입력받을 때 유용 • putchar() 함수 • 한 문자를 출력한다 • 프로토타입: void putchar(int); • putchar(‘a’); printf(“%c”, ‘a’); 와 동일
제 2 절 표준 라이브러리 함수 • 수학 라이브러리 함수 • 헤더 파일: math.h • int abs(int n); 정수 n의 절대값을 반환한다 • double pow(double x, double y); x의 y승을 반환한다 • double sin(double r); r 라디안의 사인값을 반환한다 • double sqrt(double n); n의 제곱근을 반환한다. n이 음수인 경우는 0을 반환한다 • 수식도 값을 가지므로 함수의 인자로 쓰일 수 있다 • n = pow(5, p * q); • n = sqrt(p * q) + pow(p + q, 2); • n = sqrt(abs(theta));
제 2 절 표준 라이브러리 함수 • 문자열 라이브러리 함수 • 헤더 파일: string.h • strcat(string1, string2); string1과 string2를 연결 • strchr(string, character); string에서 character가 처음 나타나는 위치를 반환 • strcmp(string1, string2); string1과 string2를 비교 • strcpy(string1, string2); string1에 string2를 복사 • strlen(string); string의 길이를 반환
제 2 절 표준 라이브러리 함수 • 그 밖의 루틴들 • ctype.h에 선언된 유용한 함수들 • isalpha(character); character가 알파벳이면 참, 아니면 거짓을 반환 • isupper(character); character가 대문자이면 참, 아니면 거짓을 반환 • islower(character); character가 소문자이면 참, 아니면 거짓을 반환 • isdigit(character); character가 숫자이면 참, 아니면 거짓을 반환 • toupper(character); character가 소문자이면 대문자를, 아니면 변경되지 않은 character를 반환 • tolower(character); character가 대문자이면 소문자를, 아니면 변경되지 않은 character를 반환
제 3 절 변수 유효 범위 • 변수 유효 범위 • 프로그램 내에서 변수가 유효한 공간, 즉 변수가 사용될 수 있는 위치를 정의 • 지역 유효 범위 • 함수 몸체 내에서 선언문에 의해 선언된 변수가 갖는 유효 범위 • 지역 변수 • 선언된 함수 내에서만 사용 가능 • 같은 이름의 변수는 서로 다른 함수에서 사용 가능 • 전역 유효 범위 • 함수 밖에서 선언된 변수가 갖는 유효 범위 • 전역 변수, 외부 변수 • 변수가 선언된 위치 아래에 있는 모든 함수에서 사용 가능
제 3 절 변수 유효 범위 • int firstnum; /* 전역 변수 */ • void valfun(void) { • int secnum; /* 지역 변수 */ • secnum = 30; • firstnum = 40; • } • void main(void) { • int secnum; /* 지역 변수 */ • firstnum = 10; • secnum = 20; • valfun(); • } • 전역 변수 firstnum, valfun() 함수의 지역 변수 secnum, main() 함수의 지역 변수 secnum 3개의 변수에 대한 저장 공간이 생성된다
제 3 절 변수 유효 범위 • 전역 변수의 잘못된 사용 • 함수에 인자를 전달하지 않고 모든 변수를 전역 변수로 만들어 함수에서 사용하도록 하는 것은 가능하나 이것은 함수가 서로 독립적이게 하는 특성을 무시하는 것 • 전역 변수의 무분별한 사용은 프로그램이 커질수록 프로그램은 엉망이 되며 오류를 추적하기 매우 어려워짐 • 여러 함수가 데이터를 공유할 때는 효율적
제 4 절 변수 기억 장소 부류 • 기억 장소 부류 • 변수가 어디에서 얼마나 오랫동안 유지되는가를 결정 • auto, static, extern, register 등 4개의 기억 장소 부류가 존재 • 기억 장소 부류 지정 시 변수의 데이터 형 앞에 기술 • auto int num; • static int miles; • register int dist; • extern int price; • 지역 변수 기억 장소 부류 • 지역 변수의 기억 장소 부류는 auto, static, register 중의 하나가 될 수 있다
제 4 절 변수 기억 장소 부류 • 기억 장소 부류가 지정되지 않으면 자동으로 auto 기억 장소부류가 할당 • auto 기억 장소 부류를 갖는 변수는 함수가 호출될 때마다 자동으로 기억 공간이 할당되고 제어를 반환할 때 기억 공간은 반납 • static 기억 장소 부류를 갖는 변수는 함수가 비록 제어를 반환했을 지라도 이전 값을 유지, 번역시에 생성되고 초기화되며 실행 시에는 초기화되지 않는다 • void foo(void) { • static int n = 3; /* static을 생략하면 호출될 때마다 초기화된다 */ • }
제 4 절 변수 기억 장소 부류 • register 기억 장소 부류는 auto와 같은 시간 존속을 가지며 CPU내의 register 내에 기억 공간이 할당, auto는 메모리에 할당, register 기억 장소 부류를 갖는 변수에는 번지 연산자 &를 사용할 수 없음 • 전역 변수 기억 장소 부류 • 전역 변수는 프로그램이 종료될 때까지 존재 • static, extern의 기억 장소 부류를 가질 수 있음 • extern 기억 장소 부류를 갖는 전역 변수는 선언된 파일 뿐만 아니라 다른 파일에서도 접근 가능 • extern은 새로이 기억 공간을 할당하지 않으며, 단지 이미 존재하는 변수의 범위를 다른 파일로 확장 • static은 변수가 다른 파일로 확장되지 못하게 함
제 5 절 주소 전달 • 값에 의한 호출(call by value) • 함수에게 인자 전달 시, 변수의 값을 그대로 복사하여 전달하는 호출 방식 • 참조에 의한 호출(call by reference) • 함수에게 인자 전달 시, 변수의 주소를 전달함으로써 전달된 변수를 직접 접근할 수 있게 하는 호출 방식 • 주소의 전달, 저장 그리고 사용 • 주소 연산자 &: 변수의 주소를 의미 • &firstnum: 변수 firstnum의 주소를 의미 • &secnum: 변수 secnum의 주소를 의미
제 5 절 주소 전달 • 포인터(poinger) 변수: 주소를 저장하는 변수 • char *in_addr; • int *num_pt; • 포인터 변수의 크기는 데이터형에 관계없이 같으며 데이터형은 주소 접근 시에 얼마나 많은 메모리를 접근하는가에 필요, 즉 num_pt를 이용하여 메모리 접근 시에 int형 크기 만큼의 메모리 접근이 필요 • 간접 연산자 *: 포인터 변수가 가리키는 메모리 내용 • *in_addr: in_addr이 가리키는 메모리에 있는 값 • char ch; • char *ch_pt; • ch = ‘a’; • ch_pt = &ch; /* *ch_pt는 ‘a’이다 */
제 5 절 주소 전달 • 주소를 전달 받는 함수의 예제 • void sortnum(double *num1_addr, double *num2_addr) { • double temp; • if (*num1_addr > *num2_addr) { • temp = *num1_addr; • *num1_addr = *num2_addr; • *num2_addr = temp; • } • } • 함수 호출 시에 num1_addr, num2_addr 변수가 생성되며 이들은 전달된 변수의 주소 값으로 초기화 된다
제 6 절 일반적인 프로그래밍 오류 • 함수에 틀린 데이터형을 전달: 컴파일러 오류 • 함수에 틀린 값을 전달: 함수 몸체 시작에서 전달된 모든 값을 찍어 본다 • 함수 내에 선언된 지역변수가 전역변수의 이름과 같을 때 지역변수의 변경은 전역변수의 변경에 영향을 미치지 못함. 따라서 그 함수에서는 전역변수를 절대로 변경하지 못함 • 함수의 프로토타입을 생략하는 것 • 함수 정의시 함수 헤더 마지막에 세미콜론을 찍는 것과 인자의 데이터형을 포함하는 것을 잊는 것
제 7 절 요약 • 함수 호출은 함수 이름과 괄호 내에 전달되는 데이터들을 기술함으로써 이루어지고 함수는 복사본을 받는다 • 함수의 정의 • return-type function-declarator /* 함수 헤더 */ • { /* 함수 몸체 시작 */ • declarations; • statements; • } /* 함수 몸체 끝 */ • 기억 부류를 명시하지 않으면 extern이 됨
제 7 절 요약 • 함수의 반환형은 함수가 반환하는 데이터형을 말한다. • 함수는 많아야 return문을 이용해 하나의 값을 반환한다. • 함수 프로토타입 • data-type function-name(parameter data types); • 함수가 호출되기 전에 반드시 선언되어야 한다 • 호출되는 함수가 호출하는 함수의 위에 정의되어 있다면 추가의 선언은 필요 없다
제 7 절 요약 • C언어는 입출력, 수학, 문자열 등의 처리를 위해 미리 프로그램된 라이브러리를 제공한다 • 모든 변수는 유효 범위를 가지며 그 변수가 사용될 수 있는 곳을 지정한다. • 모든 변수는 기억 장소 부류를 가지며 그 변수가 얼마나 오랫동안 유지되는가를 나타낸다. • 함수가 변수의 주소를 전달받음으로써 많은 값을 효과적으로 반환할 수 있다
제 8 절 추상화에 대한 소개 • 추상화(abstraction) • 그룹내의 어떤 특정 개체와도 독립적으로 객체 그룹의 일반적인 특징과 성질을 정의 • 데이터형 추상화 • 받아들일 수 있는 값들의 범위 • 이들 값들에 적용될 수 있는 연산자 집합 • 내장된 추상 데이터형 • 언어가 제공하는 기본적인 데이터형 • C++는 사용자 정의 추상 데이터형을 정의할 수 있도록 class 제공
제 8 절 추상화에 대한 소개 • 절차 추상화 • 함수가 간단히 이름과 인자만으로 호출 가능하도록 함수에 이름을 부여하는 것 • 사용자 정의 함수 작성은 절차 추상화를 만드는 것 • 함수가 구체적으로 수행하는 내용을 숨김 • 높은 수준에서 문제 해결 가능