컴퓨터 공부/© C

[C언어] 5. 함수

letzgorats 2021. 1. 27. 15:40

5. 함수

 

- 함수는 입력을 받아 처리한 뒤에 출력하는 구조를 가진다. (“입력함수출력”)

- 특정한 기능에 대한 소스코드가 반복되는 것을 줄이도록 해준다.

- 함수의 형태는

 

반환자료형 함수명(매개변수){

                 수행될 명령어

return 반환할 값;

}

 

여기서, 반환자료형은 함수가 수행되어서 처리된 결과어떠한 자료형으로 반환할 것이지 써줘야한다.

ex) int,boolean...

 

- 함수에서 매개변수와 return 반환할 값은 경우에 따라서 없을 수 있다.(예를 들어, 어떠한 내용을 단순히 출력만 하고자 하는 함수라면 굳이 어떠한 매개변수를 받을 필요가 없기 때문에 매개변수 자리나 return값이 없어도 된다)

- 이럴 때에 자료형에는 void가 들어간다.

 

(예제1)말머리 붙이기

#include <stdio.h>

void dice(int input) {

        printf("정엽이가 던진 주사위:%d\n", input);

}      

int main(void){

        dice(3);
        
        dice(5);
        
        dice(1);

    	system("pause");
        return 0;
}

(해설) dice라는 이름을 가진 함수를 만든 것이다. 간단하게 함수를 수행하면 출력하는 형태이기 때문에 “void 함수명(매개변수)”로 써줬고, 똑같이 main함수 안에서 dice함수를 불러오면(요청하면) 그에 따라 출력이 되는 것이다.

여기서 주의할 점은 main함수 밖에서 함수를 만들어줘야 한다는 것이다. 또한, 함수를 만들 때도 뭐든 마찬가지로 {중괄호}로 열고 닫아줘야 한다.

 

(예제2) 더하기 함수 만들기

#include <stdio.h>

int add(int a, int b) {

        return a + b;

}

int main(void){

        printf("%d\n",add(10,20));

        printf("%d\n", add(50, -10));

        printf("%d\n", add(900, 99));

    	system("pause");
        return 0;
}

(해설) 함수를 만들어주는데 int형으로 결과값을 출력할 거니까 당연히 int 함수명(매개변수)로 함수를 만들어주고 return 값은 a+b로 한다.

int을 출력할거니까 main함수안의 printf문에는 %d로 형식지정자를 써주고, 함수를 이용해서 값을 출력한다.(30,40,999)

 

(예제3) 사칙연산 함수 만들기

#include <stdio.h>


void calculator(int a, int b) {

        printf("%d + %d = %d\n",a,b,a+b);

        printf("%d - %d = %d\n", a, b,a-b);

        printf("%d * %d = %d\n", a, b,a*b);

        printf("%d / %d = %d\n", a, b,a/b);

        printf("\n");

}


int main(void){

        calculator(10, 3);

        calculator(45, 5);

        calculator(17,3);

        system("pause");
        return 0;

}

(해설) 단순히 printf문을 출력하는 함수이기 때문에 함수명 앞에void를 써주었고, 마지막printf문은 줄바꿈으로 보기 편하게 하기 위함이다. 함수를 만들고 int main(void)안에 함수를 불러주고 원하는 값을 넣어주면 값이 출력된다.

이로써 함수를 이용하게 된다면 main함수가 매우 간결해지고 전반적인 프로그래밍의 형태가 매우 예쁘게 자리잡게 된다는 점에서 함수를 많이 사용하는 습관을 들이는 것이 좋다.

 또한, 이러한 다양한 함수들을 한데 묶어서 만든 것을 라이브러리라고 하는데, 우리가 이렇게 불러오는 다양한 라이브러리도 내부적으로 이렇게 다양한 함수와 기능들을 묶어서 하나의 패키지 형태로 만들어 놓은 거라고 이해하면 된다.

다시말해, 우리가 우리만의 라이브러리를 또한 만들어 볼 수 있다는 뜻이다.

 

<재귀함수>

- 자기 자신을 포함하는 함수

- 기본적으로 자기 자신을 계속 불러낸다.

- 따라서 반드시 재귀 종료 조건이 필요하다.

 

(예제4) 재귀함수를 이용한 팩토리얼

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>


int factorial(int a) {

        if (a == 1) {
                return 1;
        }
        else {
                return a * factorial(a - 1);
        }
}


int main(void){

        int n;

        printf("n팩토리얼을 계산합니다.");

        scanf("%d",&n);

		printf("%d\n", factorial(n));

        system("pause");
        return 0;
}

(해설) 함수를 만들어 주는데, facorial의 성질에 의해 1일 때는 1만 출력 그 후부터는 n*f(n-1)로 반환값을 정해준다.

main함수에서는 int n을 초기화 시켜주고 사용자에게 받는 nscantf에 넣어주면 된다. 사용자는 "n팩토리얼을 계산합니다"라는 문구를 보게 될 것이고 n을 넣어준다. 사용자가 n을 입력하면 n에 따른 함수 factorial의 값이 출력나오게 printf문에 적절히 적어준다.

 

함수를 만들어줄 때를 봐보자. 위처럼 if문과 else 문을 따로 따로 작성해도 되지만 {중괄호}정리가 너무 불편해진다. 따라서 if (a==1) return 1; 을 적고 밑에 그냥 else return a+factorial(a);를 적어주면 함수 {중괄호} 하나만으로 정리 할 수 있게 된다.

 

int factorial(int a) {

        if (a == 1) return 1;

        else return a * factorial(a - 1);

}

이렇게 말이다.(이거나 저거나 같지만 더 간결해보인다.)

 

- 재귀함수는 이처럼 때에 따라 매우 짧은 코드로 작성할 수 있다. 재귀함수 인지 아닌지 판별 하려면, 자신의 함수명함수몸통 부분에 들어가 있는지 아닌지를 보면 되는데 , f(a)=a*f(a-1) 처럼 다시 자기 자신을 불러오고 있으므로 재귀함수라고 할 수 있는 것이다.

 

(정리)

1) C언어는 함수로 시작해서 함수로 끝나는 언어이다.

- 왜냐하면, 프로그램이 실행과 동시에 main함수가 실행이 되기 때문이다. main함수는 또다른 함수를 불러오기 때문이다. (ex,printf문,...)

2) 재귀함수는 반복적으로 자기 자신을 불러내므로 경우에 따라서 연산 횟수가 급격히 증가할 수 있다.

 – 무한루프가 발생하지 않도록 종료조건을 자세히 확인하자!

반응형

'컴퓨터 공부 > © C' 카테고리의 다른 글

[C언어] 7. 포인터  (0) 2021.01.28
[C언어] 6. 배열  (0) 2021.01.28
[C언어] 4. 반복문  (0) 2021.01.27
[C언어] 3. 조건문  (0) 2021.01.27
[C언어] 2. 연산자  (0) 2021.01.27