JUST GO

[C] 함수 본문

C/학습내용

[C] 함수

root_go 2022. 10. 6. 09:07

함수

- 특정 기능을 제공하는 일련의 코드를 묶어서 이름을 붙인 것

- 일종의 블랙 박스

- 전달하는 인자의 의미와 호출 결과만 알면 된다.

 

함수의 필요성

 

함수를 사용할 때의 장점

- 코드가 중복되지 않으므로 간결하고 알아보기 쉽다.

- 한 번 작성해둔 코드를 여러 번 사용하므로 코드의 재사용성이 높다.

- 기능 위주로 함수를 작성해서 사용하므로 프로그램의 모듈화가 증대된다.

- 함수 코드를 수정하더라도 함수를 호출하는 부분은 수정할 필요가 없으므로 프로그램을 유지 보수하기 쉽다.

 

함수의 종류

 

함수의 요건

- 함수의 정의(definition) : 함수가 수행할 내용을 기술

- 함수의 호출(call) : 이미 정의된 함수를 사용

- 함수의 선언(declaration) : 사용될 함수에 대한 정보를 미리 제공

 

함수의 정의

 

함수의 리턴형

- 함수가 처리 결과로 리턴하는 값의 데이터형

- 함수가 처리 결과로 리턴하는 값이 없을 때는 void라고 적어준다.

- 리턴형을 생략하면, int형을 리턴하는 함수로 간주된다.

- 함수는 반드시 하나의 값만 리턴할 수 있다.

 

함수의 이름

- 어떤 일을 하는 함수인지 명확하게 알 수 있는 이름을 사용한다.

- 식별자를 만드는 규칙에 따라서 정해야 한다.

- 일관성 있는 이름을 사용하는 것이 좋다.

- 서로 다른 함수가 같은 이름을 사용할 수 없다.

- 명명 규칙(Naming Convention)

식별자로 사용되는 이름을 정할 때 적용되는 규칙

프로그래머가 직접 자신만의 명명 규칙을 정하고 따르면 코드의 가독성을 높일 수 있다.

 

매개변수 목록

- 매개변수(parameter)

함수를 호출한 곳에서 함수 안으로 전달되는 값을 보관하기 위한 변수

- 인자, 인수(argument)

함수를 호출할 때, 실제로 전달되는 값

- 매개변수의 개수에는 제한이 없다.

매개변수가 없을 때는 void를 써주는데, 이때의 void는 생략할 수 있다.

- 함수를 정의할 때, 매개변수의 데이터형을 생략하거나 매개변수의 이름을 생략하면 컴파일 에러가 발생한다.

 

함수의 내용

- 함수의 정의는 헤더(header)와 바디(body)로 구성된다.


함수 예시

#include <iostream>
void draw_line(char, int); // 함수 선언부
int main(void){

      draw_line('*',5); // 함수 호출부
      return 0;
}
void draw_line(char ch, int len) // 함수 정의부
{
     int i; // 지역변수
     for(i=0;i<len;i++)
          printf("%c", ch);
     printf("\n");
}
 

리턴 값과 매개변수가 없는 함수

- 리턴형과 매개변수 목록을 void로 지정한다.

- void형의 함수를 호출하면 정해진 코드를 수행하고, 함수의 끝을 만나면 리턴한다.

 

리턴 값은 없고 매개변수만 있는 함수

 

리턴 값과 매개변수가 있는 함수

- 리턴형이 있는 함수에서 return문을 생략하면 안된다.

 

기존의 코드로부터 함수를 정의하는 과정

 

처음부터 함수를 정의하는 과정


함수의 호출

- 이미 만들어진 함수를 불러 쓰는 것

- 함수 이름 다음에 ( )를 쓰고, ( ) 안에 함수의 인자를 써준다.

- 함수를 호출할 때 넘겨준 인자가 매개변수로 전달된다.

 

매개변수가 있는 print sum 함수의 사용

 

get factorial 함수의 사용

#include <stdio.h>
int get_factorial(int num)
{
	int i;
	int result = 1;

	for (i = 1; i <= num; i++) // num!을 구한다
		result *= i;
	return result; // num! 값을 리턴한다.
}
int main(void)
{
	int i;
	int fact;

	for (i = 1; i <= 5; i++) 
	{
		fact = get_factorial(i); // get_factorial(i)의 리턴 값을 저장한다.
		printf("%2d! = %3d\n", i, fact);
	}
	get_factorial(5); // 리턴 값을 어디에도 이용하지 않는다.

	return 0;
}
 

인자 전달 과정의 의미

 

get max 함수의 사용

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int get_max(int a, int b, int c)
{
	int max = a > b ? a : b;
	max = c > max ? c : max;
	return max;
}

int main(void)
{
	int x, y, z;

	while (1)
	{
		printf("정수 3개를 입력하세요 (0 0 0 입력 시 종료): ");
		scanf("%d %d %d", &x, &y, &z);

		if (x == 0 && y == 0 && z == 0)
			break;
		printf("최대값: %d\n", get_max(x, y, z));
		}
		return 0;
	}
 

함수 선언문의 위치

 

지역변수와 전역변수

- 지역 변수(local variable) : 함수나 블록 안에 선언되는 변수

- 전역 변수(global variable) : 함수 밖에 선언되는 변수

 

전역 변수의 선언 및 사용

#include <stdio.h>
void print_count(void);
void increment(void);
void decrement(void);

int count; // 전역 변수 선언

int main()
{
	int i;
	count = 0;
	print_count();
	for (i = 0; i < 3; i++)
		increment();
	print_count();
	for (i = 0; i < 3; i++)
		decrement();
	print_count();
}
void print_count(void) {
	printf("count = %d\n", count);
}
void increment(void) {
	count++;
}
void decrement(void) {
	count--;
}

'C > 학습내용' 카테고리의 다른 글

[C] 포인터(2)  (0) 2022.10.06
[C] 배열  (0) 2022.10.06
[C] 반복문(2)  (1) 2022.10.05
[C] 반복문  (1) 2022.10.05
[C] 제어문(switch문)  (0) 2022.10.05