10. 함수
함수의 개념
함수는 간단하게 2가지를 생각해볼 수 있습니다.
입력과 출력이 있는 경우와 어떠한 작업을 하는 경우입니다.
두 수의 합을 구해주거나 주어진 값의 제곱근을 구해주는 함수는 입력과 출력이 있는 경우이고
주어진 문장을 화면에 출력해주는 printf같은 경우는 작업을 하는 경우입니다.
1) 함수의 구조와 종류
입력과 출력이 있는 함수
함수는 다음의 구조를 갖습니다.
반환형 함수이름(매개변수)
{
내용
return 출력;
}
예를 들어 int형 정수 2개의 합을 int형 정수로 출력하는 함수 add를 만들어봅시다.
int add(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
맨 처음의
int
는 함수의 결과값을 의미하고, 괄호 안의 int
는 입력할 값을 의미합니다.
만약 add함수에 2.13같은 실수를 입력하면 오류가 발생합니다.
작업을 하는 경우
함수가 특별한 출력값을 낼 필요가 없다면 반환형을
void
로 설정하면 됩니다.
이 경우 함수는 어떠한 값도 돌려주지 않고 묵묵히 할 일을 합니다.
예를 들어 게임에서 데미지만큼 체력을 깎는 경우를 생각해봅시다.
void subHp(float damage)
{
playerHp -= damage;
}
약간씩 차이는 있겠지만 대략 위와 같은 형태일 것입니다.
2) 함수의 역할
함수를 사용하는 경우
함수는 주로 2가지 이유로 사용합니다.
주어진 입력에 따른 결과값이 필요할 때와 어떠한 행동을 요약할 때입니다.
예를 들어 제곱근을 구하는 과정을 필요할 때마다 매번 작성하는 것은 보기에도 좋지 않을 뿐더러 소스코드가 길어집니다.
하지만 이를 sqrt라는 하나의 함수로 만들면 간단하게 사용할 수 있어 프로그래머에게 매우 도움이 됩니다.
또는 매 프레임마다 또는 플레이어가 이동할때마다 플레이어의 상태를 화면에 출력해주어야 한다면, 코드를 난잡하게 붙여넣는 것 보다 showPlayerState와 같이 알아보기 쉬운 함수로 만들면 깔끔하고 수정하기도 편합니다.
만약 100군데에 저러한 코드를 복사해 넣었다면 한 번 코드를 수정할 때 100번씩 고쳐야 하니 끔찍하기 그지없습니다.
이처럼 코드를 알아보기 쉽게하고 수정하기 쉽게하는 것은 프로그램을 작성할 때 항시 지녀야 할 마음가짐입니다.
함수를 잘 사용하는 사람이 C언어를 잘하는 사람이라는 말이 있을 정도로 함수는 중요한 역할을 합니다.
예시
만약 앞의 예시에서 만들었던 구구단 출력을 함수로 표현하자면 다음과 같습니다.
#include <stdio.h>
void showDan(int num)
{
printf("=== %d단 ===\n", dan);
for (num = 1; num <= 9; num++)
{
printf("%d * %d = %d\n", dan, num, dan * num);
}
}
int main(void)
{
int dan = 1;
for (dan = 1; dan <= 9; dan++)
{
showDan(dan);
}
}
for문이 중첩되면 알아보기 힘들지만 이처럼 함수로 나타내면 1부터 9단을 출력한다는 것을 알아보기 더 쉽습니다.
3) 프로토타입
함수의 선언과 정의
함수를 사용하려면 2가지가 필요한데 바로 함수의 선언과 정의입니다.
선언은 이러한 입력과 출력을 가지는 함수가 존재한다는 것을 밝히는 부분이고
정의는 그 함수가 구체적으로 어떤 내용을 가지고 있다는 것을 밝히는 부분입니다.
예를 들어 두 정수의 합을 출력해주는 addInt라는 함수를 선언하려면
int addInt(int num1, int num2);
와 같이 작성하면 됩니다.
이렇게 선언과 정의를 분리하는 이유는 다음과 같은 소스코드에서 오류가 발생하기 때문입니다.
#include <stdio.h>
int main(void)
{
int dan = 1;
int num = 1;
for (dan = 1; dan <= 9; dan++)
{
showDan(dan);
}
}
void showDan(int num)
{
printf("=== %d단 ===\n", dan);
for (num = 1; num <= 9; num++)
{
printf("%d * %d = %d\n", dan, num, dan * num);
}
}
앞선 예시와의 차이점은 정의를 main보다 아래에서 했다는 점입니다.
C언어는 소스코드를 맨 위에서부터 읽어내려오는데 도중에 showDan이라는 알수 없는 단어를 만나자 오류가 나는 것입니다.
이를 방지하기 위해 C언어에게 미리 showDan이라는 함수가 대략 이렇게 생겼다는 것을 미리 알려주어야 합니다.
#include <stdio.h>
void showDan(int num);
int main(void)
{
int dan = 1;
int num = 1;
for (dan = 1; dan <= 9; dan++)
{
showDan(dan);
}
}
void showDan(int num)
{
printf("=== %d단 ===\n", dan);
for (num = 1; num <= 9; num++)
{
printf("%d * %d = %d\n", dan, num, dan * num);
}
}
이처럼 함수의 선언을 맨 위에 적어주고 정의를 아래에 하는 경우, 맨 위의 함수의 선언을 프로토타입이라고 합니다.
3) 프로토타입
함수의 선언과 정의
함수를 사용하려면 2가지가 필요한데 바로 함수의 선언과 정의입니다.
선언은 이러한 입력과 출력을 가지는 함수가 존재한다는 것을 밝히는 부분이고
정의는 그 함수가 구체적으로 어떤 내용을 가지고 있다는 것을 밝히는 부분입니다.
예를 들어 두 정수의 합을 출력해주는 addInt라는 함수를 선언하려면
int addInt(int num1, int num2);
와 같이 작성하면 됩니다.
이렇게 선언과 정의를 분리하는 이유는 다음과 같은 소스코드에서 오류가 발생하기 때문입니다.
#include <stdio.h>
int main(void)
{
int dan = 1;
int num = 1;
for (dan = 1; dan <= 9; dan++)
{
showDan(dan);
}
}
void showDan(int num)
{
printf("=== %d단 ===\n", dan);
for (num = 1; num <= 9; num++)
{
printf("%d * %d = %d\n", dan, num, dan * num);
}
}
앞선 예시와의 차이점은 정의를 main보다 아래에서 했다는 점입니다.
C언어는 소스코드를 맨 위에서부터 읽어내려오는데 도중에 showDan이라는 알수 없는 단어를 만나자 오류가 나는 것입니다.
이를 방지하기 위해 C언어에게 미리 showDan이라는 함수가 대략 이렇게 생겼다는 것을 미리 알려주어야 합니다.
#include <stdio.h>
void showDan(int num);
int main(void)
{
int dan = 1;
int num = 1;
for (dan = 1; dan <= 9; dan++)
{
showDan(dan);
}
}
void showDan(int num)
{
printf("=== %d단 ===\n", dan);
for (num = 1; num <= 9; num++)
{
printf("%d * %d = %d\n", dan, num, dan * num);
}
}
이처럼 함수의 선언을 맨 위에 적어주고 정의를 아래에 하는 경우, 맨 위의 함수의 선언을 프로토타입이라고 합니다.
댓글 없음:
댓글 쓰기