• 검색 결과가 없습니다.

함수 작성의 기초

N/A
N/A
Protected

Academic year: 2022

Share "함수 작성의 기초"

Copied!
57
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

::

함수 작성의 기초

functions

(2)

학습 목표

함수의 의미와 용도

CFL 함수 및 작동 기저의 관찰

C언어 함수의 사용법 및 작성법의 습득

개별 변수와 배열의 파라메터 사용

교재: 38장

(3)

3

MJU CE C Language Programming

용어

function 함수

call 호출, 호출하다.

invoke 호출하다. ( = call )

library function 미리 만들어 놓은 함수

system call 시스템 호출(운영체제)

return 반환(하다), 돌아가다

parameter(or argument) 인수, 인자, 매개변수

(4)

"function" 의 두가지 뜻

수학의 함수

기능, 작용하다 두 가지 의미가 다 있음.

(5)

5

MJU CE C Language Programming

알려진 함수의 호출 예제

printf("Hello");

scanf("%d", &a);

n = random printf "Hello"

scanf &a

(6)

함수란 ?

Ogong("아이스크림");

이름 부르기 (call)

원하는 구체적 내용 오공아, 아이스크림좀

사오너라.

main

Ogong

(7)

7

MJU CE C Language Programming

언제 사용하나?

같거나 유사한 일의 반복

자주 쓰이는 복잡한 수학 계산 (예: sin, cos)

큰 일을 나누어 여러 사람이 협동 작업

의미 있는 덩어리의 일을 함수로 대치함으로써 프로그 램의 이해를 돕는다.

대개의 프로그램에서 cos(x)+sin(x) 라고만 쓰면 알아 듣는 다. 실제로 cos(x)를 계산하는 프로그램을 다 써놓을 필요가 없다.

"I don't want to know!"

(8)

함수가 없으면 안되나?

이론적으로는 없어도 모든 프로그램 작성 가능

생산성의 향상

코드의 재사용

전문성의 분리

예: 삼각 함수

프로그램 가독성(readability)

main함수를 간단하게 만들어 준다.

(9)

9

MJU CE C Language Programming

함수의 종류: 저자에 따라…

남이 만든 함수:

library 함수

system call

내가 만든 함수:

필요에 따라 함수를 만들어 쓴다.

(10)

함수의 종류: 파라메터 형식에 따라

실행에 참조할 데이터를 받지 않는 함수 getchar( );

파라메터를 받는 함수 putchar(c);

printf("Hello\n");

동의어:

인자, 인수, 파라메터(parameter), argument

(11)

11

MJU CE C Language Programming

함수의 종류: 답(반환 값)의 사용 여부

일만 시키고 답은 받지 않는다.

putchar(c);

답을 받아서 사용한다.

c = getchar();

numRead = scanf("%d", &a);

(12)

수학의 '함수'와의 차이

C function

x 값이 필요

실행적 의미

(x 값 줄께, sin 값 다오)

sin(x) = y; 불가능

Math function

x 값은 나중에 대입

선언적 의미

도 같다

) sin( x y

y x  ) sin(

y = sin(x);

(13)

:: CFL 함수

(14)

CFL functions

(15)

15

MJU CE C Language Programming

CFL demo

cube.cfl 을 다운 받아서 단계별로 실행해보고 관찰된 사항을 기록해보자.

(16)

함수는...

정의(define)되어 있어야 쓸 수 있다.

호출해야 실행된다.

(17)

:: C언어의 함수 배우기

(18)

함수의 형식: CFL vs C

CFL C

정의

int max(int a, int b) { if (a>b){

return a;

} else {

return b;

} }

호출 i = max(x, y) ;

파라메터 암시적 명시적 선언

반환값 암시적 명시적 선언

문법적 차이 괄호와 콤마 없음 괄호와 콤마 있음

(19)

19

MJU CE C Language Programming

How functions work

int fun(){

... 실제 코드

...return ch;

} int main(){

...

...c = fun();

}...

1. 실행

2. 함수 실행 시작

3-1. 반환값을 임시 메모리에 저장 3-2. 함수 종료

4. 실행 재개

함수의 정의 부분

함수의 호출 부분

(20)

:: 1.파라메터/반환 값 없는 함수

(21)

21

MJU CE C Language Programming

파라메터/반환값이 없는 함수의 정의

void function_name( ){

실제 할 일;

}

예:

void sayHello(){

printf("Hello");

return; // 생략할 수도 있음.

}

return 0; 와 비교

(22)

파라메터/반환값이 없는 함수의 호출

int main(){

///

sayHello();

// …

}

(23)

23

MJU CE C Language Programming

함수의 위치

#include <stdio.h>

void hello(){

}

int main(){

hello(); // 여기서 호출

return 0;

}

main 의 앞에 정의해야 한다.

(24)

lab17_05

파라메터 없고 반환값 없는 함수 정의하기.

한번 호출하면 무조건 "Hello\n"를 출력하고 끝내는 함수 "hello"를 정의하고,

main에서 두 번 연속 호출해보라.

(25)

:: 함수호출시 값 전달하기

2.파라메터 있는 함수

(26)

파라메터가 있는 함수

▪ printf("%d\n", x);

▪ putchar('a'); // parameter 하나.

▪ c = getchar(); // parameter 없는.

함수 이름

첫째 파라메터

둘째 파라메터 콤마로 구분

(27)

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

(실질 파라메터)

(28)

Parameter: 이름이 아니고 순서

main:

int a = 999;

fun(123, a);

void fun(int a, int b) {

// a,b는 함수 블록

// 안에서만 유효

}

(29)

29

MJU CE C Language Programming

실습/lab17_06/param.c

파라메터를 받아 사용하는 연습

void prt(int x){ // void 란 값을 return

… // 하지 않는다는 뜻

}

와 같은 모양의 함수를 정의하고 이 함수 안에서는 받 은 정수를 "전달 받은 x 값은 5입니다." 같은 형식으로 출력한다. main함수에서는 scanf로 정수 값을 변수 n 에 입력받은 다음 prt(n); 형식으로 호출한다.

(30)

:: return types

3. 값을 반환하는 함수

(31)

31

MJU CE C Language Programming

함수 종료시 값의 반환

printf("%d\n", x); // 반환 값을 사용하지 // 않는 경우

c = getchar(); // 반환 값을 사용하는 경우

(32)

함수 호출을 수식에 섞어 쓰기

c = a + b;

a + b 의 결과는 임시 메모리에 저장 저장된 결과가 c에 copy됨.

c = getchar();

getchar() 반환값이 임시 메모리에 저장, 저장된 결과가 c에 copy됨.

"반환 값", "리턴값", "함수호출식의 값" = 다 같은 뜻

비교

(33)

33

MJU CE C Language Programming

CFL demo

maxfunonly

(34)

Return value Type (반환값 형식)

C언어 함수의 return 값에는 타입이 정해져 있다.

i = getchar(); // int

f = sin(0.5 * 3.14 / 180); // double

(35)

35

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);

(36)

값의 반환

반환 타입을 명시

return 문으로 실제 값 반환

임시 메모리에 저장

y = add(3,4); int add(int x, int y){

return x+y;

}

1. 임시 메모리에 값을 저장한다.

2. 실행을 종료하면서

호출한 함수를 다시 깨워준다.

(37)

37

MJU CE C Language Programming

실습 17_07

주어진 함수를 이용하여 두 수를 더해보라.

+ 연산을 쓰지 않고 함수를 이용한다.

(38)

void 함수와 int 함수의 차이

z = add(3,4); //OK

z = prt(3); // NO

add(3,4); // OK

prt(3); // OK

int add(int x, int y){

return x+y;

}

void prt(int x){

printf("%d\n", x);

return;

}

(39)

39

MJU CE C Language Programming

lab17_08/abs.c

파라메터로 주어진 정수의 절대값을 반환하는 함수 absolute를 정의하고 main에서는 scanf로 읽은 정수 값을 주고 absolute 를 호출하여 받은 값을 출력한다.

Hint: 파라메터를 n이라면, n 값이 0이상이면 그 값을 그냥 반 환하고 아니면 –n을 반환하면 된다.

호출 방법:

pos = absolute(n);

printf("%d\n", pos);

(40)

함수의 상대적 위치

 int add(..){

}

 int main(..){

.. add(..);

}

 int main(..){

.. add(..);

}

 int add(..){

}

O X

컴파일러의 특성 때문.

변수를 선언 후에 사용하는 것과 같은 이치

(41)

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;

}

(42)

실습 lab17_09/proto.c (배포)

목적: prototype 의 사용

배포된 프로그램에서 함수의 순서를 바꾸지 않고 prototype 선언을 추가하여 오류를 없앤다.

(43)

43

MJU CE C Language Programming

어쩐지 비슷하네?

 int add(..){

...

}

 int main(..){

...

}

(44)

함수도 함수를 호출

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)

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));

}

(46)

Local variables & parameters

파라메터 이외에 함수 안에서만 사용할 변수가 있다면 함수 안 에서 선언한다.

int sumto(int n){ // 1에서 n 까지 더하는 함수

int i, sum; // 이 변수는 함수 안에서만 사용.

for (i=0; .. ; ..){

...

}

return sum;

}

(47)

47

MJU CE C Language Programming

함수와 전역변수

int sum; int i;

int sumToN(..){

… for (i = 0; ... )

}

int main(){

...

}

함수는 전역변수를 사용하지 않는 것을

원칙으로 한다.

(48)

lab17_11/ sum.c

파라메터로 주어진 정수가 있을 때,

(이를 n 이라 하자) 1 부터 n 까지의 합을 구하여 돌려 주는 함수 SumToN을 작성하고

main에서는 정수를 표준 입력에서 읽어서 1부터 이 정수까지의 합을 SumToN 함수를 호출하여 값을 계산 한 뒤 main함수 내에서 출력한다. (SumToN 함수에 서는 출력은 하지 않는다.)

(49)

49

MJU CE C Language Programming

sum2.c/17_12

두 정수 start 부터 end까지의 합을 구하여 반환하는 함수를 작성하고

main에서는 두 정수를 표준입력에서 입력하여 위에서 작성한 함수를 이용하여 합을 저장한 뒤 출력한다.

(50)

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)

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

(52)

"Call by value"

실질 인자와 형식 인자

void add_one(int x){ ... } int main(){

... // i = 99;

add_one(i);

...

}

실질 인자의 값을 형식 인자에 복사 후 함수를 수행:

"call by copy"라고도 함.

(53)

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 값을 출력하라.

}

주어진 프로그램을 실행하여 결과를 기록하라.

여기서 알 수 있는 사실은 무엇인가 적어서 제출한다.

(54)

add_one 함수

수행 순서

main 함수 i 99

main 함수 99

99 복사

add_one 함수

main 함수 99

100

main 함수 99

add_one 함수 100

+1 종료

n

(55)

55

MJU CE C Language Programming

CFL에서 call-by-copy

"call by copy"

demo: add_one.cfl

(56)

그러나 배열은 원본을 쓰게 된다.

배열 주소만 복사. 원소들은 별도 사본이 없다.

void fun(int A[3]){ A[0] = 1; }

int main(){

int mydata[3] = { 0 };

fun(mydata);

printf("%d\n", mydata[0]); // ???

(57)

57

MJU CE C Language Programming

단원 요구사항

함수의 프로토타입과 설명서를 주었을 때에 호출하고 반환값을 사용할 수 있어야 한다.

프로그램의 특정 기능을 설명하였을 때에 이에 대해 필 요한 파라메터와 반환값을 스스로 정하여 함수로 만들 어내고 호출하여 사용할 수 있어야 한다.

배열을 파라메터로 전달할 경우에 이를 받아서 사용하 는 함수를 작성할 수 있어야 한다.

참조

관련 문서