일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 고정비트레이트
- 저장소와 동적메모리
- Patch Cleaner
- c언어
- 실생활알고리즘
- C Mount
- 카메라
- Pixel Bit Format
- Depth of Fileld
- 이미지센서
- 프로그래머스 lv2
- 변수
- AppInventer
- camera
- Zoom Lense
- ASCCII
- 무게선별자동화
- 심도
- Digital Slow Shutter
- 렌즈
- 조건 제어문
- 아이리스
- image sensor
- 과초점거리
- main 함수 인자 전달
- CS Mount
- Gain
- 간단한 앱만들어보기
- 저조도
- 변수의 초기화와 대입
- Today
- Total
카메라 개발자 공부방(SW)
[8장] 사용자 함수 본문
오늘은 사용자 함수에 대해 공부해보겠습니다.
지금까진 우리는 main이라는 함수의 내용(구현부)을 채워가며 실습을 해봤습니다.
C언어에서 함수의 비중이 큰 만큼 명칭 하나하나 자세히 보겠습니다.
returnType functionName(parameter)
{
/* your code */
return value;
}
반환(return)이란 이 함수가 종료될 때 계산된 결과값을 다시 돌려준다는 의미입니다.(정확히는 함수를 호출했던 지점에 함수의 결과 값을 되돌려줍니다.)
반환이 있다면 반환 타입(returnType)과 return에 어떤 값을 반환할지 명시해야 합니다.
반환 타입이 없다면 반환 타입이 없다는 뜻으로 void로 선언하면 됩니다. 그리고 return도 없습니다.
함수의 이름(functionName)은 함수의 이름을 작성하는 부분이며, 변수처럼 원하는 이름으로 작성할 수 있습니다. 함수의 목적에 맞게 네이밍 하는 것이 중요합니다.
매개변수(parameter)는 함수의 인자를 전달받아 사용할 용도로 선언된 변수입니다.
함수의 반환 타입과 이름 매개 변수만 봐도 함수에 대한 정보가 많이 포함되어있었죠?
함수에서 returnType functionName(parameter) 정보가 굉장히 중요합니다!
이를 다른 용어로 함수의 선언이라 합니다.
void Print(); // 함수의 선언
void Print()
{
printf("Print function\n");
}
print 함수는 반환 타입이 없기 때문에 반환 타입이 void고 return이 없습니다.
void Print(int parameter); // 함수의 선언
void Print(int parameter)
{
printf("Print function: %d\n", parameter);
}
print 함수는 반환 타입이 없지만, 전달받을 인자가 하나 존재합니다.
float getPI(); // 함수의 선언
float getPI()
{
return 3.145192f
}
getPI란 함수는 반환 타입이 float이며 3.141592를 반환합니다.
함수 호출
함수를 작성했으면 그 함수를 이름을 통해서 수행할 수 있습니다.
함수의 이름을 이용해서 부르는 행위를 함수 호출이라고 부릅니다.
함수의 이름()을 붙여서 호출을 합니다.
함수에 매개 변수 인자가 있다면(전달할 인자 값이 있다면) 인자까지 전달해서 호출을 해야 합니다..
다음 예제를 볼까요?
#include <stdio.h> // 1 line
// 2
void Print() // 3
{ // 4
printf("hello world\n"); // 5
} // 6
// 7
int main() // 8
{ // 9
Print(); // 10
return 0; // 11
} // 12
// 실행 결과
// hello world
Print라는 이름의 함수를 호출해보았습니다.
9라인 지점에서 Print()가 실행될 때, Print라는 이름의 함수가 동작하게 됩니다!
2라인에서 3~6라인을 수행하여 Print가 종료된 후 다시 main의 10라인을 실행하게 됩니다.
(전달한 인자가 없기 때문에 함수의 인자가 없는 상태로 함수 호출을 하였습니다.)
#include <stdio.h> // 1 line
// 2
void Print() // 3
{ // 4
printf("hello world\n"); // 5
} // 6
// 7
int main() // 8
{ // 9
Print(); // 10
Print(); // 11
Print(); // 12
return 0; // 13
} // 14
// 15
// 실행 결과
// hello world
// hello world
// hello world
그러면 인자가 있는 경우엔 어떻게 될까요?
#include <stdio.h>
void Add(int x, int y)
{
printf("%d + %d = %d\n", x, y, x + y);
}
// void는 반환 type 없고, 함수의 이름은 Add입니다. 매개변수는 int x, int y 2개가 존재합니다.
int main()
{
Add(3, 7);
Add(8, 2);
Add(9, 9);
return 0;
}
// 실행 결과
// 3 + 7 = 10
// 8 + 2 = 10
// 9 + 9 = 18
인자가 있는 사용자 함수의 호출시 전달한 인자의 값들이 호출된 함수의 매개변수로 data copy가 발생됩니다.
main에선 3, 7이란 상수 메모리는 그대로 존재하고,
Add 함수에선 3, 7이 각각 변수 int x, int y인 독립적인 메모리 공간으로 카피가 됩니다.
결과적으로 main 3, 7과, Add의 int x, int y에 저장된 3, 7은 서로 다른 메모리 공간에 존재하는 값들입니다.
이렇게 값 자체를 복사해서 전달하는 방식을 call by value라고 합니다.
그리고 지금까지 우리가 써왔던 printf()도 함수입니다~
그런데 우리는 함수의 내용을 작성하지 않았는데도 잘 사용해왔습니다. 어떻게 된 것이죠?
그 이유는 printf() 함수의 내용은 <stdio.h>에 라이브러리 형태로 이미 구현돼서 저장되어있었기 때문입니다.
그래서 <stdio.h> 헤더를 선언한 후 함수 호출만 하면 된답니다.
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
// 실행 결과
// Hello World
다음은 반환 타입이 있는 사용자 함수 예제입니다.
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x / y;
}
int main()
{
printf("result: %d\n", Add(3, 7));
printf("result: %d\n", Sub(8, 2));
printf("result: %d\n", Mul(9, 9));
printf("result: %d\n", Div(3, 9));
return 0;
}
// 실행 결과
// result: 10
// result: 6
// result: 81
// result: 0
다음은 반환 타입이 없는 사용자 함수 예제입니다.
#include <stdio.h>
void Add(int x, int y)
{
printf("%d + %d = %d\n", x, y, x + y);
}
void Sub(int x, int y)
{
printf("%d - %d = %d\n", x, y, x - y);
}
void Mul(int x, int y)
{
printf("%d * %d = %d\n", x, y, x * y);
}
void Div(int x, int y)
{
printf("%d / %d = %d\n", x, y, x / y);
}
int main()
{
Add(3, 7);
Sub(8, 2);
Mul(9, 9);
Div(3, 9);
return 0;
}
// 실행 결과
// 3 + 7 = 10
// 8 - 2 = 6
// 9 * 9 = 81
// 3 / 9 = 0
'Langauge > C' 카테고리의 다른 글
[10장] 포인터 (0) | 2021.09.29 |
---|---|
[9장] 변수와 주소 (0) | 2021.09.28 |
[7장] 변수의 초기화와 대입 (0) | 2021.09.26 |
[6장] 자료형(data type) (0) | 2021.09.25 |
[5장] 반복문 (0) | 2021.09.24 |