함수

정의

  • 특정한 작업(기능)을 수행하도록 설계된 독립적인 코드 블럭
  • 함수의 기능이 필요한 함수의 외부의 특정 지점에서, 해당 함수를 호출(call)해 사용한다.
  • C 프로그램은 함수를 기본 단위로 하여 구성된다.

문법

1
2
3
4
5
6
7
8
9
10
// 반환값이 있는 경우

// 선언 및 정의
ret_type func_name(param_type param_name, ...){
  statement ...
  return ret_expr;
}

// 사용 : 반환값이 있는 경우
ret_type var_name = func_name(param1, ...);
1
2
3
4
5
6
7
8
9
// 반환값이 없는 경우

// 선언 및 정의
void func_name(param_type param_name, ...){
  statement ...
}

// 사용
func_name(param1, ...);

함수의 선언과 정의

  • 함수의 선언은, 해당 함수의 이름과 반환 자료형, 매개변수의 자료형을 지정하여 컴파일러에게 알리는 것을 의미한다.
  • 함수의 정의는, 해당 함수가 내부적으로 어떤 작업을 수행할지 코드로 정의하는(구현하는) 것을 의미한다.
1
2
3
4
5
6
7
8
// 함수의 선언
int add_function(int a, int b);

// 함수의 정의
int add_function(int x, int y){
  int result = x + y;
  return result;
}

함수의 사용

1
2
3
4
5
6
7
8
9
int add_function(int x, int y){ //--- 2
  int result = x + y; //--- 3
  return result; //--- 4 & 5
}

void main(){
  int bn = 10;
  int result = add_function(bn, 20); //--- 1 & 5
}
순번 단계 설명
1 호출 함수를 호출하면서 함수에 인수(argument)를 전달한다.
2 매개변수 전달 전달된 인수가 매개변수(parameter)에 바인딩된다.
3 함수 실행 함수의 본문이 실행된다.
4 반환 return 문을 통해 값이 호출 지점으로 반환된다.
5 복귀 반환과 함께 프로그램의 실행 흐름이 함수를 호출했던 위치로 돌아온다.

함수의 장점

  • 작은 단위로 분할 : 크고 복잡한 프로그램을 작은 크기의 작업 단위로 분할해 구성할 수 있다.
  • 간결한 코드 : 이에 따라 간결하고 이해가 쉽고, 유지관리가 쉬운 코드를 작성할 수 있다.
  • 재사용성 : 잘 설계된 함수는 동일 기능이 필요한 곳에서 재사용될 수 있다.
  • 중복 최소화 : 같은 기능이 필요한 곳에서 재사용 함으로써 코드 중복을 최소화할 수 있다.

함수의 단점

  • 함수의 호출과 복귀 과정에서 부대비용이 발생한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1.	스택 프레임 생성·해제 비용
		함수 호출   지역 변수 공간 확보 & 반환 주소 저장하는 비용
		함수 종료   스택 프레임 제거 & 메모리 접근과 포인터 조작 비용

2.	인수 전달 비용
		인수를 레지스터 또는 스택에 복사하는 비용
		 전달(call by value) 경우 데이터 복사가 발생함.
	
3.	반환 처리 비용
		반환값을 레지스터 또는 메모리로 이동할 때의 비용과
		호출자  변수에 다시 저장할 때의 비용

4.	분기(branch)  파이프라인 손실
		함수 호출은 제어 흐름을 변경하는데, 이에 대한 비용.
		CPU 분기 예측 실패  파이프라인이 비워질  있다.

5.	레지스터 저장·복원 비용
		호출 규약(calling convention) 따라
   일부 레지스터를 스택에 저장하고, 복귀  복원하는 비용

함수의 유형

  • 표준함수 : C 언어 자체에서 제공하는 함수
  • 사용자 정의 함수 : 사용자가 필요에 따라 특정 기능을 수행하도록 정의한 함수

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)

Comments