예제를 사용한 C 프로그래밍의 함수: 재귀 및 인라인

⚡ 스마트 요약

C 프로그래밍에서 함수는 큰 프로그램을 더 작은 하위 프로그램으로 나누어 이해하고 테스트하고 수정하기 쉽게 만드는 재사용 가능한 코드 블록입니다. 각 함수는 선언, 정의 및 호출 부분으로 구성됩니다.

  • 🧩 각 기능의 역할은 다음과 같습니다. 함수는 재사용 가능한 명령어들을 그룹화하므로, 큰 프로그램은 더 작고 관리하기 쉬운 하위 프로그램으로 분할되어 디버깅이 더 간편해집니다.
  • 📚 두 가지 유형 : printf나 scanf 같은 라이브러리 함수는 미리 만들어져 있는 반면, 사용자 정의 함수는 프로그래머가 직접 작성하는 함수입니다.
  • 📝 세 부분으로 구성되어 있습니다. 함수를 사용하는 것은 함수의 선언 또는 프로토타입, 정의 또는 본문, 그리고 함수를 실행하는 호출을 포함합니다.
  • 🎯 인수 : 값은 위치와 기본적으로 값으로 전달되므로 원래 변수는 호출된 함수 내부에서 변경되지 않습니다.
  • 🌐 범위: 지역 변수는 해당 함수 내에서만 값을 가지는 반면, 전역 변수와 정적 변수는 프로그램 전체 또는 함수 호출 간에 값을 유지합니다.
  • 🤖 AI 지원: GitHub Copilot과 AI 비서는 C 함수의 구조를 만들고, 반환 유형을 제안하며, 반환값이 누락되었거나 인수가 일치하지 않는 경우를 표시합니다.

C 프로그래밍의 기능

C에서 함수란 무엇입니까?

C 프로그래밍의 기능 함수는 재사용 가능한 코드 블록으로, 프로그램을 더 쉽게 이해하고 테스트할 수 있게 하며, 호출하는 프로그램을 변경하지 않고도 쉽게 수정할 수 있습니다. 함수는 코드를 분할하고 프로그램을 모듈화하여 더 나은 효율적인 결과를 만들어냅니다. 간단히 말해, 큰 프로그램을 여러 개의 하위 프로그램(함수라고 함)으로 나누는 것입니다.

C의 함수란 무엇입니까?

큰 프로그램을 다양한 기능으로 나누면 각 기능을 개별적으로 관리하기가 쉬워집니다. 프로그램에 오류가 발생할 때마다 쉽게 잘못된 기능을 조사하고 해당 오류만 수정할 수 있습니다. 필요할 때마다 쉽게 기능을 호출하고 사용할 수 있어 시간과 공간이 자동으로 절약됩니다.

도서관 대. 사용자 정의 함수

모든 'C' 프로그램에는 주 기능인 하나 이상의 기능이 있지만 프로그램에는 여러 가지 기능이 있을 수 있습니다. C의 main() 함수는 프로그램의 시작점입니다.

'C' 프로그래밍에서 함수는 두 가지 유형으로 나뉩니다.

  1. 라이브러리 기능
  2. 사용자 정의 함수

C의 라이브러리와 사용자 정의 함수의 차이점은 라이브러리 함수에 대한 코드를 작성할 필요가 없다는 것입니다. 프로그램 시작 부분에 항상 포함하는 헤더 파일 내부에 이미 존재합니다. 함수 이름을 입력하고 적절한 구문과 함께 사용하면 됩니다. Printf, scanf는 라이브러리 함수의 예입니다.

사용자 정의 함수란 함수 본문을 작성하고 프로그램에서 어떤 작업을 수행할 때 함수가 필요할 때마다 함수를 호출해야 하는 유형의 함수입니다.

C에서 사용자 정의 함수는 항상 사용자가 작성하지만 나중에 'C' 라이브러리의 일부가 될 수 있습니다. 이는 'C' 프로그래밍의 주요 장점입니다.

C 프로그래밍 기능은 다음과 같은 세 가지 활동으로 나뉩니다.

  1. 함수 선언
  2. 기능 정의
  3. 함수 호출

함수 선언

함수 선언은 프로그램의 이름을 작성하는 것을 의미합니다. 코드에서 함수를 사용하기 위해서는 필수적인 부분입니다. 함수 선언에서는 변수를 선언하는 것처럼 프로그램에서 사용할 함수의 이름을 지정합니다. 프로그램에서 함수가 선언되지 않으면 사용할 수 없습니다. 함수 선언은 "함수 프로토타입"이라고도 합니다.

함수 선언(프로토타입이라고 함)은 일반적으로 기본() 함수 위에서 수행되며 다음과 같은 일반적인 형식을 취합니다.

return_data_type function_name (data_type arguments);
  • return_data_type은 값 함수가 호출 문으로 반환하는 데이터 유형입니다.
  • 함수 이름 뒤에 괄호가 붙습니다.
  • 인수의 이름과 해당 데이터 형식 선언은 선택적으로 괄호 안에 넣을 수 있습니다.

정수 변수의 세제곱 값을 계산하는 세제곱 함수를 선언하는 방법을 보여주는 다음 프로그램을 고려합니다.

#include <stdio.h>
/*Function declaration*/
int add(int a,b);
/*End of Function declaration*/
int main() {

함수가 반드시 값을 반환하는 것은 아니라는 점을 명심하세요. 이 경우 void 키워드가 사용됩니다.

예를 들어, output_message 함수 선언은 함수가 값을 반환하지 않음을 나타냅니다. void output_message();

기능 정의

함수 정의는 함수의 본문을 작성하는 것을 의미합니다. 함수 본문은 특정 작업을 수행할 명령문으로 구성됩니다. 함수 본문은 단일 또는 명령문 블록으로 구성됩니다. 이는 또한 기능의 필수 부분이기도 합니다.

int add(int a,int b)	//function body	
{
	int c;
	c=a+b;
	return c;
}

함수 호출

함수 호출은 프로그램에서 필요할 때마다 함수를 호출하는 것을 의미합니다. 함수를 호출할 때마다 함수는 설계된 작업을 수행합니다. 함수 호출은 프로그램의 선택적 부분입니다.

  result = add(4,5);

다음은 전체 코드입니다.

#include <stdio.h>
int add(int a, int b);	//function declaration
int main()
{
	int a=10,b=20;
	int c=add(10,20); 	//function call
	printf("Addition:%d\n",c);
	getch();
}
int add(int a,int b)	//function body
{
	int c;
	c=a+b;
	return c;
}

출력:

Addition:30

함수 인수

함수의 인수는 함수 호출을 통해 필요한 값을 받는 데 사용됩니다. 위치별로 일치합니다. 첫 번째 인수는 첫 번째 매개변수로 전달되고 두 번째 인수는 두 번째 매개변수로 전달됩니다.

기본적으로 인수는 값으로 전달되며, 호출된 함수에는 데이터의 복사본이 제공됩니다. 실제로 전달되는 변수는 변경되지 않습니다.

값으로 전달되는 매개변수를 보여주는 다음 프로그램을 고려해 보겠습니다.

int add (int x, int y); 
int main() {
  int a, b, result;
  a = 5;
  b = 10;
  result = add(a, b);
  printf("%d + %d\ = %d\n", a, b, result);
return 0;}
int add (int x, int y) { 
x += y;
  return(x);}

프로그램 출력은 다음과 같습니다.

5 + 10 = 15

add 함수에 전달된 a와 b의 값은 해당 값만 매개변수 x에 전달되었기 때문에 변경되지 않았음을 명심하세요.

가변 범위

변수 범위는 프로그램 코드 내에서 변수의 가시성을 의미합니다.

C 언어에서 함수 내부에 선언된 변수는 해당 코드 블록 내에서만 유효하며 함수 외부에서는 참조할 수 없습니다. 반면, 함수 외부에 선언된 변수는 전역 변수이며 프로그램 전체에서 접근 가능합니다. 프로그램 맨 위에 `#define`으로 선언된 상수 또한 프로그램 전체에서 사용할 수 있습니다. 다음 프로그램은 main 함수와 사용자 정의 함수 모두에서 전역 변수의 값을 출력합니다.

#include <stdio.h>
int global = 1348;
void test();
int main() {
  printf("from the main function : global =%d \n", global);
  test () ;
return 0;}

void test (){
printf("from user defined function : global =%d \n", global);}

결과 :

from the main function : global =1348
from user defined function : global =1348

우리는 프로그램 세부 사항에 대해 논의합니다:

가변 범위

  1. 초기값이 1348인 정수 전역 변수를 선언합니다.
  2. 인수를 취하지도 않고 값을 반환하지도 않는 test() 함수를 선언하고 정의합니다. 이 함수는 전역 변수 값만 인쇄하여 프로그램의 어느 곳에서나 전역 변수에 액세스할 수 있음을 보여줍니다.
  3. main 함수 내에서 전역 변수를 인쇄합니다.
  4. 전역 변수 값을 인쇄하기 위해 테스트 함수를 호출합니다.

C에서 인수가 함수 매개변수에 전달되면 매개변수는 지역 변수처럼 작동하여 함수를 종료할 때 파괴됩니다.

때 사용 전역 변수, 오류가 발생할 수 있고 프로그램 어디에서나 변경될 수 있으므로 주의해서 사용하세요. 사용하기 전에 초기화해야 합니다.

정적 변수

정적 변수는 로컬 범위를 갖습니다. 그러나 함수를 종료할 때 파괴되지 않습니다. 따라서 정적 변수는 값을 영원히 유지하며 함수에 다시 들어갈 때 액세스할 수 있습니다. 정적 변수는 선언될 때 초기화되며 접두사 static이 필요합니다.

다음 프로그램은 정적 변수를 사용합니다.

#include <stdio.h>
void say_hi();
int main() {    
  int i;
  for (i = 0; i < 5; i++) { say_hi();}
   return 0;}
void say_hi() {
  static int calls_number = 1;
  printf("Hi number %d\n", calls_number);
  calls_number ++; }

프로그램은 다음을 표시합니다:

Hi number 1
Hi number 2
Hi number 3
Hi number 4
Hi number 5

재귀 함수

어떤 수의 팩토리얼을 다음과 같이 계산한다고 가정해 봅시다. 6! = 6 * 5 * 4 * 3 * 2 * 1.

이 계산은 사실이 1이 될 때까지 사실 *(사실 -1)을 반복적으로 계산하여 수행됩니다.

재귀 함수는 자신을 호출하고 재귀 호출을 완료하기 위해 종료 조건을 포함하는 함수입니다. 계승수 계산의 경우 종료 조건은 1과 동일합니다. 재귀는 종료 조건이 true가 될 때까지 호출을 "스택"하는 방식으로 작동합니다.

예 :

#include <stdio.h>
int factorial(int number);
int main() {    
  int x = 6;
  printf("The factorial of %d is %d\n", x, factorial(x)); 
  return 0;}
int factorial(int number) {
 if (number == 1)    return (1); /* exiting condition */
  else
    return (number * factorial(number - 1));
}

프로그램은 다음을 표시합니다:

 The factorial of 6 is 720

여기서는 프로그램 세부 사항에 대해 논의합니다.

재귀 함수

  1. 정수 매개변수를 취하고 이 매개변수의 계승을 반환하는 재귀 계승 함수를 선언합니다. 이 함수는 자신을 호출하고 종료할 때까지 또는 기본 조건에 도달할 때까지 숫자를 줄입니다. 조건이 true인 경우 이전에 생성된 값을 서로 곱하여 최종 계승 값을 반환합니다.
  2. 값이 "6"인 정수 변수를 선언하고 초기화한 다음 계승 함수를 호출하여 계승 값을 인쇄합니다.

다음 표를 참고하면 재귀 메커니즘을 더 잘 이해할 수 있습니다. 이 메커니즘은 기본 사례 또는 종료 조건에 도달할 때까지 함수가 자기 자신을 호출하는 방식으로 구성됩니다.ping 조건이 충족되면 그 후 이전 값들을 수집합니다.

재귀 함수

인라인 함수

C 프로그래밍의 함수는 가장 자주 사용되는 명령어를 저장하는 데 사용됩니다. 프로그램을 모듈화하는데 사용됩니다.

함수가 호출될 때마다 명령 포인터는 함수 정의로 이동합니다. 함수를 실행한 후 명령 포인터는 함수 정의로 점프한 명령문으로 돌아갑니다.

함수를 사용할 때마다 추가 항목이 필요합니다. 포인터 함수 정의로 점프하고 명령문으로 돌아갑니다. 이러한 포인터 헤드의 필요성을 없애기 위해 우리는 인라인 함수를 사용합니다.

인라인 함수에서 함수 호출은 실제 프로그램 코드로 직접 대체됩니다. 모든 작업이 인라인 함수 내부에서 수행되기 때문에 어떤 블록으로도 점프하지 않습니다.

인라인 함수는 주로 작은 계산에 사용됩니다. 대규모 컴퓨팅이 관련된 경우에는 적합하지 않습니다.

인라인 함수는 일반 함수와 비슷하지만 키워드 inline이 함수 이름 앞에 위치합니다. 인라인 함수는 다음 구문으로 생성됩니다.

inline function_name ()
{
    //function definition
}

인라인 함수를 구현하는 프로그램을 작성해 보겠습니다.

inline int add(int a, int b)		//inline function declaration
{
	return(a+b);
}
int main()
{
	int c=add(10,20);
	printf("Addition:%d\n",c);
	getch();
}

출력:

Addition: 30

위의 프로그램은 두 수를 더하기 위한 인라인 함수의 사용을 보여줍니다. 보시다시피, 우리는 추가 줄을 쓰지 않고 인라인 함수 내에서 두 수에 대한 더하기를 반환했습니다. 함수 호출 동안 우리는 더하기를 수행해야 하는 값만 전달했습니다.

자주 묻는 질문

값에 의한 호출은 인수를 함수 안으로 복사하므로 변경 사항은 지역 변수에만 적용되고 원래 변수는 그대로 유지됩니다. 참조에 의한 호출은 포인터를 통해 변수 주소를 전달하므로 함수가 호출자의 원래 데이터를 직접 수정할 수 있습니다.

실제 매개변수는 함수 호출 시 호출자가 전달하는 실제 값 또는 변수입니다. 형식 매개변수는 해당 매개변수를 받는 함수 정의에 이름이 지정된 자리 표시자입니다. 이들은 위치를 기준으로 짝을 이루며, 첫 번째 매개변수는 첫 번째 매개변수와, 두 번째 매개변수는 두 번째 매개변수와 짝을 이룹니다.

AC 함수는 return 문을 통해 직접 하나의 값만 반환합니다. 여러 결과를 반환하려면 구조체로 묶거나, 배열을 채우거나, 포인터를 인수로 전달하여 함수가 각 결과를 호출자의 변수에 저장하도록 해야 합니다.

함수는 재사용성을 제공하여 하나의 코드 블록이 여러 번 실행되도록 하고, 모듈성을 통해 큰 프로그램을 더 작은 단위로 분할할 수 있게 합니다. 또한 가독성을 향상시키고, 테스트 및 디버깅을 간소화하며, 복잡한 세부 사항을 하나의 이름 뒤에 숨겨 개발 시간을 절약해 줍니다.

main() 함수는 모든 C 프로그램의 실행이 시작되는 진입점입니다. 운영체제가 이 함수를 가장 먼저 호출하며, 반환 값(일반적으로 0)은 성공을 나타냅니다. main() 함수는 명령줄 인수를 받기 위해 argc와 argv를 사용할 수 있습니다.

재귀는 트리 순회나 팩토리얼처럼 구조가 반복적인 문제에 적합하여 코드를 더 간결하고 명확하게 만들어 줍니다. 반복문은 일반적으로 반복적인 함수 호출을 피하기 때문에 더 빠르고 메모리 사용량도 적습니다. 코드의 가독성을 위해서는 재귀를, 대규모 입력값을 처리할 때는 성능을 위해서는 반복문을 선택하세요.

네. AI 코딩 도우미는 일반적인 언어로 작성된 프롬프트에서 C 함수를 작성하고, 매개변수와 반환 유형을 제안하며, 반환값이 누락되었거나 인수가 일치하지 않는 등의 버그를 표시할 수 있습니다. 생성된 함수를 사용하기 전에 항상 컴파일하고 테스트하십시오.

GitHub 부조종사 C 함수를 작성할 때 함수 이름이나 간단한 주석을 기반으로 함수 본문을 완성하고, 함수 선언, 반복문, 재귀 호출 등을 제안합니다. 종종 main() 함수 위에 해당 함수의 프로토타입을 추가하지만, 로직을 직접 검토해야 합니다.

이 게시물을 요약하면 다음과 같습니다.