[C 기초 - 함수]

Junyeong Fred Kim·2021년 12월 6일
0

C언어

목록 보기
14/21

함수

함수란, 특정한 기능을 따로 분리해놓은 것으로 수학에서 사용하는 함수의 개념과 비슷하다.

함수의 장점


함수화 시키면 좋은 점은 대표적으로 두가지이다.

  • 첫 번째는 유지보수 및 가독성. 적절히 코드를 나누어 함수화 시키면 생산성이 높아진다.
  • 두 번째는 재활용성이다. 함수는 호출하는 것으로 함수 안에 작성된 코드를 실행시킬 수 있다. 기능을 함수로 나눈다면 똑같은 코드를 여러번 복사할 필요없이, 함수를 호출하는 것만으로 간단하게 끝낼 수 있다.

함수 맛보기


#include <stdio.h>

int arrayPlus(int arr[], int length)
{
	int result = 0;

	for(int i=0; i<length; i++)
	{
		result += arr[i];
	}

	return result;
}

int main()
{
	int arr[5] = {1, 2, 3, 4, 5};
	int result;
	int length = sizeof(arr) / sizeof(int);

	result = arrayPlus(arr, length);

	printf("모든 배열의 합 : %d", result);

	return 0;
}

출력

모든 배열의 합 : 15

출력 설명

arrayPlus라는 함수를 호출하고, (arr, length)를 인자로 넘겨준다.
이 때, 주의할 점은 넘겨받은 전달인자는 매개변수에 복사된다는 것이다. 즉, 함수에서 넘겨받은 값을 변경해도 원래의 그 값은 변경되지 않는다.

함수의 형태


함수의 형태는 다음과 같다

[반환형] [함수명] (매개변수)
{
    [호출 시 작동될 함수 내부 코드]
}

arrayPlus의 경우는 반환형이 int이다. 반환형이 있는 함수는 return이 필수적이며, int형의 경우 반환하는 건 정수라는 뜻이다. 만약 실수를 반환해야 한다면 반환형은 float. return은 함수가 종료되었다는 의미로 함수 내 어떤 변수나 값을 반환해주는 역할을 한다.

int main()을 썼을 때, return 0;을 쓰도록 권장되므로 넣어준다. 물론 쓰지 않아도 프로그램에 영향은 없다.

아무런 인자도 넘기지 않을 때에 void를 사용하면 된다. 인자를 넘기지 않을 때, void를 써도 되고, ()형태로 아무것도 적어주지 않아도 된다. int main() 또한, int main(void)와 같다.

#include <stdio.h>

void func1(void)
{
	printf("반환할 필요도 없고, 인자도 받지 않는 void 함수입니다.\n");
}

void func2(int num)
{
	printf("받은 인자는 %d 입니다.\n", num);
}

float func3(int num)
{
	printf("인자의 형과 반환형을 맞춰줄 필요는 없습니다.\n");

	return 3.14 * num;
}

int main()
{
	float result;

	func1();
	func2(2);
	result = func3(2);

	printf("result : %f\n", result);

	return 0;
}

출력

반환할 필요도 없고, 인자도 받지 않는 void 함수입니다.
받은 인자는 2 입니다.
인자의 형과 반환형을 맞춰줄 필요는 없습니다.
result : 6.280000

함수의 선언


함수를 선언할 때 주의해야 할 점은 바로 함수의 위치이다.
C언어는 절차지향언어이기 때문에 위에서 아래로 차례대로 소스 코드를 해석한다. 따라서 함수 선언이 main 함수 아래에 있다면 인식을 하지 못한다.

#include <stdio.h>

int main()
{
	func1();

	printf("함수 실행 완료\n");

	return 0;
}

int func1(void)
{
	printf("예시 함수입니다.\n");
	return 0;
}

출력

예시 함수입니다.
함수 실행 완료

출력 설명

위 코드는 문법상 틀린 코드이다. 하지만 실행을 해보면 정상적으로 컴파일 및 실행이 완료된다. 이는 컴파일러의 확장 기능 때문인데, 위와 같이 정상적으로 실행이 된다고 해서 위와 같은 코드를 사용해서는 안된다.

profile
기억보다 기록

0개의 댓글