본문 바로가기

primer plus

[c primer plus] chapter09 함수

  • 함수(function)

하나의 특정 작업을 수행하도록 독립적으로 설계된 프로그램 코드의 한 단위

 

strarbar() 가 어떤 유형의 함수인지 컴파일러에게 알려 주는 함수 프로토타입(function prototype)

그 함수를 실행되게 만드는 함수 호출(function call) 

그 함수가 무엇을 하는 것인지 정확하게 서술하고 있는 함수 정의(function definition)

 

프로그램은 starbar() 의 함수 프로토타입을 main()앞에 놓는다.

 

void show_n_char(char ch, int num)

두 변수 ch 와 num 을 '형식전달인자(formal argument)' 또는 '형식매개변수(formal parameter)'라고 부른다.

 

  • 실전달인자(actual argument)

실전달인자는 함수 호출에서 괄호 안에 나타나는 값

  • 형식매개변수(formal paramental)

형색매개변수는 함수 정의에서 함수 머리에 선언되는 변수

 

show_n_char(SPACE, 12);

여기서 실전달인자 SPACE, 12가 형색매개변수 ch, num에 대입된다.

 

  • 함수로부터 값 리턴하기 return

return은 뒤에 오는 표현식의 값을 함수의 리턴값으로 만든다

리턴값은 변수에 대입할 수도 있고, 표현식의 일부로 사용할 수도 있다.

 

  • 함수의 데이터형

리턴값이 없는 함수는 void형으로 선언해야한다.

함수에 데이터형을 선언하지 않으면, 구형 c 컴파일러들은 그 함수를 int형이라고 가정한다.

 

double klink(in a, int b)

두 개의 int형 전달인자를 사용하고 하나의 double형 값을 리턴하는 함수를 정의하고 있다는 것을 의미한다.

 

  • ANSI C 함수 프로토타입

함수를 선언할 때 함수의 리턴형만 선언하고 전달인자는 선언하지 않는 결점이 있었다.

전달인자의 개수나 데이터형을 알려 주지 않아서 틀리게 사용하더라도, 컴파일러가 에러를 검출하지 못한다.

->함수 선언에서 변수들의 데이터형까지 선언하도록 허용

 

전달인자가 없는 경우

void print_name(void);

print_name()은 전달인자를 사용하지 않는다는 의미

 

함수의 리턴형

그 함수가 리턴하는 값의 데이터형을 나타낸다.

리터값이 선언된 리턴형과 다를 경우, 그 값이 선언된 리턴형으로 캐스트된다.

 

함수의 스그너처

함수의 리턴형과 함수의 매개변수 리스트는 함수 시그너처를 형성한다.

함수에 사용되는 값의 형(type)과 함수가 출력하는 값의 형을 지정한다.

 

  • 재귀(recursion)

재귀의 제 1수준

up_and_down() 함수를 호출

제 2수준

자기 자신을 호출

:

제2수준은 제3수준을 호출

제3수준은 제 4수준을 호출

 

  1. 함수 호출의 각 수준으 자신만의 변수를 가진다.
  2. 각각의 함수 호출은 return 문에 의해 하나씩 청산된다.
  3. 재귀 함수에서 재귀 호출보다 앞에 있는 문장들은 그 함수들이 호출되는 순서로 실행된다.
  4. 재귀 함수에서 재귀 호출보다 뒤에 있는 문장들은 그 함수들이 호출되는 순서와 반대의 순서로 실행된다.
  5. 재귀의 각 수준이 자신만의 변수를 가질지라도, 코드 자체는 중복되지 않는다.
  6. 재귀 함수는 재귀 호출의 시퀀스를 중단시킬 수 있는 무언가를 가지고 있어야한다.

꼬리 재귀(tail recursion)또는 후미 재귀(end recursion)

재귀 호출이 함수의 끝return문 바로 앞에 있는 것

 

  • 재귀의 장점

일부 프로그래밍 문제를 푸는데 재귀가 가장 간단한 해결책을 제공한다

  • 재귀의 단점

일부 재귀 알고리즘이 컴퓨터의 메모리 자원을 매우 빠르게 고갈시킨다

 

피보나치 수열

return Fibonacci(n-1) + Fibonacci(n-2)

좋은점

간단한 정의를 제공

나쁜점

이중 재귀(double recursion)

제 1 수준으로 n이라는 변수를 하나 할당하고 제 2수준으로 n이라는 변수를 두 개 생성한다.

지수적 증가는 컴퓨터가 엄청난 메모리 크기를 요구하게 되어, 프로그램이 먹통이 된다.

 

  • 주소 연산자(&)

변수 이름 앞에 사용했을 때, 변수의 주소를 제공한다.

포인터는 주소를 저장하는 데 사용되는 변수이다.

 

  • 간접 연산자(*)

 포인터 이름이나 주소 앞에 사용했을 때, 그것이 가리키는 주소에 저장되어 있는 값을 제공한다.

 

호출 함수에 있는 변수 바꾸기

최초의 값 x 와 y 값을 보관해 두기 위한 temp에 저장을 하는 과정이 필요하다

temp=x;

x=y;

y=temp;

 

  • 포인터 선언

데이터형 키워드는 포인터가 가리키는 변수의 데이터형을 나타낸다.

애스터리스크(*)는 그 변수가 포인터라는 것을 나타낸다.

 

int *pi; 라는 선언은 pi가 포인터고 *pi는 int 형임을 나타낸다.