함수 보고서

함수의 정의

함수란 무엇일까?
중학생 이상이라면 수학시간에 지겹도록 들어봤을 이 친구, 프로그래밍에서도 비슷한 개념의 물건이다.

"특정 값을 넣으면, 그 값을 변형해서 하나의 값을 만들어 내는 것"

수학에서는 그 만들어진 값에 크게 의미를 둔다. 그러나 프로그래밍에서의 함수는 하나의 값을 만들어 내지 않을수도 있고, 만들어진 값이 크게 의미가 없을수도 있다. 함수의 실행 과정에 더 중점을 주는 경우도 있다는 뜻이다.

이 내용은 뒤에서 다시한번 언급하도록 하겠다.

C의 함수의 예시로는 우리가 익히 알고있는 헤더 stdio.h 안에있는 내용, printf() 나 scanf(), gets()와 같은 내용들이 있을것이다.
또한 우리가 익히 코드를 작성하던 main()또한 함수이다.


함수를 쓰는 이유

저번시간 배열 보고서에서 재밌는 스토리를 통해 이해를 도왔었다. 이번시간에도 연규의 이야기를 통해서 재미있게 이야기를 풀어볼까 한다.


연규는 국어시간 수행평가로 "사자성어 외우기" 라는 미션을 받았다. 그런데 봉사정신이 투철했던 연규는, 외우기를 도와주는 프로그램을 만들기로 했다.

외워야할 사자성어와 그 뜻을 코드에 저장해놓고, 뜻을 보여주며 사자성어와 일치하면 정답으로 처리하는 간단한 퀴즈 프로그램 말이다.
연규는 무려 60개 가량의 사자성어와 그 뜻을 타이핑해서 저장했고, 랜덤으로 그것을 출력해서 정답과 비교하는 코드를 작성했다.

이후 시험이 끝나면 '뭘 틀렸고 뭘 맞았는지 텍스트파일로 저장하는 기능'과, 중간에 종료하여도 '뭘 틀렸고 뭘 맞았는지 텍스트 파일로 저장하는 기능'을 만들려고 하는데, 연규는 이런 고민이 생겼다.
'같은 내용의 코드를 두번이나 작성해야하나? 만약 내가 코드를 수정할일이 생긴다면, 두군데나 수정을 해야하는건가? 너무 비효율적인데?'
이럴때 저장하는 과정을 함수로 만들어두고, 필요할때마다 해당 함수를 호출한다면?
문제는 해결될것이다.



함수의 사용법

이제, 함수를 어떻게 사용할지에 대해서 배워보도록 하자.

선언

함수의 선언은 크게 두가지 방법이 있는데, 하나는 main 함수 위에서 함수룰 선언만 한 후 뒤에서 내용을 만들어주는 방법,
그리고 또 하나는 애초에 선언해주면서 내용을 만들어주는 방법이다.

백문이 불여일견, 코드로 보자.


0. 함수를 선언만 한 후, 뒤에서 내용을 만들어주는 방법
#include <stdio.h>

void save();

int main(){
    return 0;
}

void save(){
    //저장시키는코드
    printf("saved\n");
}

1. 선언과 함께 내용 만들기
#include <stdio.h>

void save(){
    //저장시키는코드
    printf("saved\n");
}
int main(){
    return 0;
}


함수는 다음과 같이 선언 할 수 있다.

<반환 할 값의 자료형> <이름>(<받을 인자값>){
    <내용>
}

void는 '빈 자료형' 으로서, 함수가 아무값도 반환하지 않을 때 사용하는 자료형이다.
반환할 값이 있을때는 함수를 끝낼 부분에 다음과 같은 코드를 넣어주어야 한다.

return <반환할 값>;

그래서 함수는 총 4개의 형태가 있는데, 각각 다음과 같다.
인자 o 반환 o
#include <stdio.h>

int temp(int a){
    return a+3;
}

int main(){
    return 0;
}
인자 o 반환 x
#include <stdio.h>

void temp(int a){
    printf("%d", a);
}

int main(){
    return 0;
}
인자 x 반환 o
#include <stdio.h>

int temp(){
    return 55;
}

int main(){
    return 0;
}
인자 x 반환 x
#include <stdio.h>

void temp(){
}

int main(){
    return 0;
}

사용

그렇다면 사용은 어떻게 해야할까? 사실 우리는 이미 답을 알고있다.
<실행할 함수>(<넣을 인자값>);
에시로는 printf("helloworld");가 있겠다.

전역변수, 지역변수, 매개변수

퀴즈 하나를 내겠다.
#include <stdio.h>

void temp(){
    printf("%d", a);
}

int main(){
    int a=3;
    return 0;
}
해당 코드는 실행이 될까?
정답은 아니다.

a는 main()의 지역변수이고, printf()가 실행된 곳은 main() 안이 아니니까.
지역변수란 한 함수 안에 속해있는 변수로서 해당 지역 안에서만 접근 가능한 변수이다.
그렇다면 어떻게 해야 main()과 temp() 에서 동시에 접근이 가능한 변수를 만들 수 있을까?
여기서 나오는게 전역변수이다.

#include <stdio.h>
int a=3;
void temp(){ printf("%d", a); } int main(){ printf("%d", a); return 0; }

여담으로, 함수를 실행시키면서 전달받은 값을 저장시키는 변수는 매개변수라고 한다.
#include <stdio.h>
void temp(int a){
    printf("%d", a);
}

int main(){
    printf("%d", a);
    return 0;
}
여기서 int a가 매개 변수라고 할 수 있다.

재귀함수

자기 자신을 실행시키면서, 반복문처럼 내가 원하는 조건이 맞춰질때까지 실행되는 함수를 재귀함수라고한다.
재귀함수는 많은 말로 설명하는것보다 코드로 이해하는게 쉬울테니, 피보나치 수열을 출력하는 재귀함수를 적으며 글을 마치겠다.
#include <stdio.h>

int factorial(int n)
{
    if (!n)
        return 1;
    return n * factorial(n - 1);
}

int main(void)
{
    printf("%d", factorial(3));
    return 0;
}

Comments

Popular Posts