::
함수 작성의 기초
functions
학습 목표
함수의 의미와 용도
CFL 함수 및 작동 기저의 관찰
C언어 함수의 사용법 및 작성법의 습득
개별 변수와 배열의 파라메터 사용교재: 38장
3
MJU CE C Language Programming용어
function 함수
call 호출, 호출하다.
invoke 호출하다. ( = call )
library function 미리 만들어 놓은 함수
system call 시스템 호출(운영체제)
return 반환(하다), 돌아가다
parameter(or argument) 인수, 인자, 매개변수"function" 의 두가지 뜻
수학의 함수
기능, 작용하다 두 가지 의미가 다 있음.5
MJU CE C Language Programming알려진 함수의 호출 예제
printf("Hello");
scanf("%d", &a);n = random printf "Hello"
scanf &a
함수란 ?
Ogong("아이스크림");
이름 부르기 (call)
원하는 구체적 내용 오공아, 아이스크림좀
사오너라.
main
Ogong
7
MJU CE C Language Programming언제 사용하나?
같거나 유사한 일의 반복
자주 쓰이는 복잡한 수학 계산 (예: sin, cos)
큰 일을 나누어 여러 사람이 협동 작업
의미 있는 덩어리의 일을 함수로 대치함으로써 프로그 램의 이해를 돕는다.❖
대개의 프로그램에서 cos(x)+sin(x) 라고만 쓰면 알아 듣는 다. 실제로 cos(x)를 계산하는 프로그램을 다 써놓을 필요가 없다.❖
"I don't want to know!"함수가 없으면 안되나?
이론적으로는 없어도 모든 프로그램 작성 가능
생산성의 향상❖
코드의 재사용
전문성의 분리❖
예: 삼각 함수
프로그램 가독성(readability)❖
main함수를 간단하게 만들어 준다.9
MJU CE C Language Programming함수의 종류: 저자에 따라…
남이 만든 함수:❖
library 함수❖
system call
내가 만든 함수:필요에 따라 함수를 만들어 쓴다.
함수의 종류: 파라메터 형식에 따라
실행에 참조할 데이터를 받지 않는 함수 getchar( );
파라메터를 받는 함수 putchar(c);printf("Hello\n");
동의어:
인자, 인수, 파라메터(parameter), argument
11
MJU CE C Language Programming함수의 종류: 답(반환 값)의 사용 여부
일만 시키고 답은 받지 않는다.putchar(c);
답을 받아서 사용한다.c = getchar();
numRead = scanf("%d", &a);
수학의 '함수'와의 차이
C function
x 값이 필요
실행적 의미(x 값 줄께, sin 값 다오)
sin(x) = y; 불가능
Math function
x 값은 나중에 대입
선언적 의미
도 같다) sin( x y
y x ) sin(
y = sin(x);
:: CFL 함수
CFL functions
15
MJU CE C Language ProgrammingCFL demo
cube.cfl 을 다운 받아서 단계별로 실행해보고 관찰된 사항을 기록해보자.함수는...
정의(define)되어 있어야 쓸 수 있다.
호출해야 실행된다.:: C언어의 함수 배우기
함수의 형식: CFL vs C
CFL C
정의
int max(int a, int b) { if (a>b){
return a;
} else {
return b;
} }
호출 i = max(x, y) ;
파라메터 암시적 명시적 선언
반환값 암시적 명시적 선언
문법적 차이 괄호와 콤마 없음 괄호와 콤마 있음
19
MJU CE C Language ProgrammingHow functions work
int fun(){
... 실제 코드
...return ch;
} int main(){
...
...c = fun();
}...
1. 실행
2. 함수 실행 시작3-1. 반환값을 임시 메모리에 저장 3-2. 함수 종료
4. 실행 재개
함수의 정의 부분
함수의 호출 부분
:: 1.파라메터/반환 값 없는 함수
21
MJU CE C Language Programming파라메터/반환값이 없는 함수의 정의
void function_name( ){
실제 할 일;
}
예:
void sayHello(){
printf("Hello");
return; // 생략할 수도 있음.
}return 0; 와 비교
파라메터/반환값이 없는 함수의 호출
int main(){
///
sayHello();
// …
}23
MJU CE C Language Programming함수의 위치
#include <stdio.h>
void hello(){
}
int main(){
hello(); // 여기서 호출
return 0;
}main 의 앞에 정의해야 한다.
lab17_05
파라메터 없고 반환값 없는 함수 정의하기.
한번 호출하면 무조건 "Hello\n"를 출력하고 끝내는 함수 "hello"를 정의하고,
main에서 두 번 연속 호출해보라.:: 함수호출시 값 전달하기
2.파라메터 있는 함수
파라메터가 있는 함수
▪ printf("%d\n", x);
▪ putchar('a'); // parameter 하나.
▪ c = getchar(); // parameter 없는.
함수 이름
첫째 파라메터
둘째 파라메터 콤마로 구분
27
MJU CE C Language Programming파라메터 정의하기
void fun_one (int a){
…
}
void fun_two(int a, double x){
…
}Formal Parameter (형식 파라메터)
호출 예:
fun_one(99);
fun_two(33, 3.14);
Actual Parameter
(실질 파라메터)
Parameter: 이름이 아니고 순서
main:
int a = 999;
fun(123, a);void fun(int a, int b) {
// a,b는 함수 블록
// 안에서만 유효
}
29
MJU CE C Language Programming실습/lab17_06/param.c
파라메터를 받아 사용하는 연습
void prt(int x){ // void 란 값을 return
… // 하지 않는다는 뜻
}
와 같은 모양의 함수를 정의하고 이 함수 안에서는 받 은 정수를 "전달 받은 x 값은 5입니다." 같은 형식으로 출력한다. main함수에서는 scanf로 정수 값을 변수 n 에 입력받은 다음 prt(n); 형식으로 호출한다.:: return types
3. 값을 반환하는 함수
31
MJU CE C Language Programming함수 종료시 값의 반환
printf("%d\n", x); // 반환 값을 사용하지 // 않는 경우
c = getchar(); // 반환 값을 사용하는 경우함수 호출을 수식에 섞어 쓰기
c = a + b;a + b 의 결과는 임시 메모리에 저장 저장된 결과가 c에 copy됨.
c = getchar();getchar() 반환값이 임시 메모리에 저장, 저장된 결과가 c에 copy됨.
"반환 값", "리턴값", "함수호출식의 값" = 다 같은 뜻
비교
33
MJU CE C Language ProgrammingCFL demo
maxfunonlyReturn value Type (반환값 형식)
C언어 함수의 return 값에는 타입이 정해져 있다.
i = getchar(); // int
f = sin(0.5 * 3.14 / 180); // double35
MJU CE C Language Programming일반적인 함수의 정의 방법
type function_name(parameter_list){
실제 할 일;
}
예:
int add(int x, int y){
// anything goes in here
return x+y;
}이 값이 호출식 의 값이 됨
z = add(n, k);
값의 반환
반환 타입을 명시
return 문으로 실제 값 반환
임시 메모리에 저장
y = add(3,4); int add(int x, int y){return x+y;
}
1. 임시 메모리에 값을 저장한다.
2. 실행을 종료하면서
호출한 함수를 다시 깨워준다.
37
MJU CE C Language Programming실습 17_07
주어진 함수를 이용하여 두 수를 더해보라.+ 연산을 쓰지 않고 함수를 이용한다.
void 함수와 int 함수의 차이
z = add(3,4); //OK
z = prt(3); // NO
add(3,4); // OK
prt(3); // OKint add(int x, int y){
return x+y;
}
void prt(int x){
printf("%d\n", x);
return;
}
39
MJU CE C Language Programminglab17_08/abs.c
파라메터로 주어진 정수의 절대값을 반환하는 함수 absolute를 정의하고 main에서는 scanf로 읽은 정수 값을 주고 absolute 를 호출하여 받은 값을 출력한다.
Hint: 파라메터를 n이라면, n 값이 0이상이면 그 값을 그냥 반 환하고 아니면 –n을 반환하면 된다.
호출 방법:
pos = absolute(n);
printf("%d\n", pos);함수의 상대적 위치
int add(..){
}
int main(..){
.. add(..);
}
int main(..){
.. add(..);
}
int add(..){
}
O X
컴파일러의 특성 때문.
변수를 선언 후에 사용하는 것과 같은 이치
41
MJU CE C Language Programming부득이한 경우: prototype
// Forward declaration float fmin(float x, float y) ; // 변수명 생략가능
int main(){
z1 = fmin(x,y);
}
float fmin(float x, float y){
if (x>y) return x; else return y;
}실습 lab17_09/proto.c (배포)
목적: prototype 의 사용
배포된 프로그램에서 함수의 순서를 바꾸지 않고 prototype 선언을 추가하여 오류를 없앤다.43
MJU CE C Language Programming어쩐지 비슷하네?
int add(..){
...
}
int main(..){
...
}
함수도 함수를 호출
int square(int x){
return x * x;
}
int square_sum(int x, int y){
return square(x)+ square(y);
}
main에서:
i = square_sum(3,5)함수들의 상대적 위치에 유의 !!
45
MJU CE C Language Programming실습 lab17_10/callcall.c
목적: 연속된 호출의 연습
두 수의 절대값의 합을 구하는 함수 abs_sum 을 정의 하되 abs_sum은 다시
절대값을 구하는 함수 absolute 를 호출한다.
(함수 absolute 도 정의해야한다.)
int main(){
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", abs_sum(x, y));
}Local variables & parameters
파라메터 이외에 함수 안에서만 사용할 변수가 있다면 함수 안 에서 선언한다.
int sumto(int n){ // 1에서 n 까지 더하는 함수
int i, sum; // 이 변수는 함수 안에서만 사용.
for (i=0; .. ; ..){
...
}
return sum;
}47
MJU CE C Language Programming함수와 전역변수
int sum; int i;
int sumToN(..){
… for (i = 0; ... )
}
int main(){
...
}함수는 전역변수를 사용하지 않는 것을
원칙으로 한다.
lab17_11/ sum.c
파라메터로 주어진 정수가 있을 때,(이를 n 이라 하자) 1 부터 n 까지의 합을 구하여 돌려 주는 함수 SumToN을 작성하고
main에서는 정수를 표준 입력에서 읽어서 1부터 이 정수까지의 합을 SumToN 함수를 호출하여 값을 계산 한 뒤 main함수 내에서 출력한다. (SumToN 함수에 서는 출력은 하지 않는다.)49
MJU CE C Language Programmingsum2.c/17_12
두 정수 start 부터 end까지의 합을 구하여 반환하는 함수를 작성하고
main에서는 두 정수를 표준입력에서 입력하여 위에서 작성한 함수를 이용하여 합을 저장한 뒤 출력한다.Implicit Return (암시적 반환)
void
print_int(int x){
printf("x value is: %d\n", x);
// return;
} int
print_int(int x){
printf("x value is: %d\n", x); // Something's missing. Not good.
}51
MJU CE C Language Programming호출식은 l-value 가 없다
쉽게 말해 assignment의 좌변에 쓰지 못함.
y = f(x) + 3.5; // OK
f(x) = 3.5 ; // Not allowed
max(x)++ ; // Not allowed"Call by value"
실질 인자와 형식 인자void add_one(int x){ ... } int main(){
... // i = 99;
add_one(i);
...
}
실질 인자의 값을 형식 인자에 복사 후 함수를 수행:"call by copy"라고도 함.
53
MJU CE C Language Programming실습:
#include <stdio.h>
void add_one(int x){
// 여기서 x 값을 출력하라.
x++;
// 여기서 x 값을 출력하라.
}
int main(){
i = 99;
// 여기서 i 값을 출력하라.
add_one(i);
// 여기서 i 값을 출력하라.
}주어진 프로그램을 실행하여 결과를 기록하라.
여기서 알 수 있는 사실은 무엇인가 적어서 제출한다.
add_one 함수
수행 순서
main 함수 i 99
main 함수 99
99 복사
add_one 함수
main 함수 99
100
main 함수 99
add_one 함수 100
+1 종료
n
55
MJU CE C Language ProgrammingCFL에서 call-by-copy
"call by copy"demo: add_one.cfl