티스토리 뷰
반응형
1) 목표
- 함수 이해하기
- 함수 리턴값 이해하기
- 함수 파라메타 이해하기
2) 설명
// 함수형식
int func(int arg1) {
return 0;
}
// 리턴값이 있는 함수
int func() {
return 0;
}
// 리턴값이 없는 함수
void func() {
}
// 파라메타가 있는 함수
int func(int arg1) {
return 0;
}
// 파라메타가 여러개 있는 함수
int func(int arg1, int arg2, char arg3) {
return 0;
}
▶ 함수구성은
리턴값타입 함수명(파라메타) { 함수 내용 }
int func(int argc); 리턴타입은 int 함수명은 func 파라메타는 int argc 1개로 정의된 함수입니다.
int func(); 리턴타입은 int 함수명은 func 파라메타는 없는 함수입니다.
void func(); 리턴값이 없고 (void) 함수명은 func 파라메타는 없는 함수입니다.
리턴값이 없는 경우는 void 로 표기합니다. 참조하세요.
▶ 함수의 끝은 return 문을 만나면 끝이나고, 만약 return문이 없다면 함수의 끝을 나타내는 } 를 만나면 끝이 납니다.
▶ 이제는 이런 함수형식으로 내가 원하는 기능을 하는 함수를 만들어서 사용하시면 됩니다.
3-1) 예제프로그램
▶ vi func.c
#include <stdio.h>
// 리턴값이 없는 함수
void func1() {
printf("func1()...\n");
}
// 리턴값이 있는 함수
int func2() {
return 1;
}
// 더하기 함수
int sum(int a, int b) {
int sum;
sum = a + b;
return sum;
}
int main() {
int ret;
// 리턴타입이 없는 함수 호출
func1();
// 리턴값이 있는 함수 호출
ret = func2();
printf("func2() return value:[%d]\n", ret);
// 더하기 함수
ret = sum(1, 3);
printf("sum() return value:[%d]\n", ret);
return 0;
}
▶ 컴파일/실행
~/c-lecture (master ✘)✭ ᐅ gcc -o func func.c
~/c-lecture (master ✘)✭ ᐅ ./func
func1()...
func2() return value:[1]
sum() return value:[4]
~/c-lecture (master ✘)✭ ᐅ
▶ 분석
- 함수를 사용할때는 함수의 타입/파라메타 갯수-형식등을 보고 타입을 맞쳐서 사용하시면 됩니다.
- 리턴값이 없는 함수 void func1() 를 사용할때는 func1(); 이렇게 불러서 사용하시면 됩니다.
void func1() 에는 return문이 없습니다. 리턴값타입이 void라서 없습니다. 그런데 함수내에서
return; 문을 추가 할수도 있습니다. 보통은 return 값; 이런 형식으로 사용하는데 void형의 리턴은 값이 없기 때문에 그냥 return; 문으로 사용할 수 있습니다.
...
void func1() {
printf("func1()...\n");
return;
}
- 리턴값이 있는 함수 int func2() 를 사용할때는 리턴값을 받아서 사용할 수 있으므로
ret = func2(); 이렇게 사용하고 func2()함수에서 리턴해주는 값을 ret를 조회해서 확인합니다. - 리턴값이 있고 파라메타도 int 형으로 2개가 있는 함수 int sum(int a, int b)를 사용할때는
ret = sum(1, 3); 이렇게 사용하고 sum()함수에서 리턴해주는 값은 ret를 조회해서 확인합니다. - ※ c에서는 사용할 함수가 소스 위에 있어야 합니다. 즉, main()함수에서 func1(), func2()를 호출 하는데는 main()함수 보다 먼저 func1(), func2() 함수가 있는걸 보실수 있습니다. 이렇게 사용할 함수가 먼저 나와야 합니다. 아니면 컴파일시 오류가 발생합니다.
3-2) 함수정의 예제프로그램
▶ vi func2.c
#include <stdio.h>
int main() {
int ret;
// 리턴타입이 없는 함수 호출
func1();
// 리턴값이 있는 함수 호출
ret = func2();
printf("func2() return value:[%d]\n", ret);
// 더하기 함수
ret = sum(1, 3);
printf("sum() return value:[%d]\n", ret);
return 0;
}
// 리턴값이 없는 함수
void func1() {
printf("func1()...\n");
}
// 리턴값이 있는 함수
int func2() {
return 1;
}
// 더하기 함수
int sum(int a, int b) {
int sum;
sum = a + b;
return sum;
}
▶ 컴파일/실행
~/c-lecture (master ✘)✭ ᐅ gcc -o func2 func2.c
func2.c: In function ‘main’:
func2.c:7:2: warning: implicit declaration of function ‘func1’ [-Wimplicit-function-declaration]
7 | func1();
| ^~~~~
func2.c:10:8: warning: implicit declaration of function ‘func2’ [-Wimplicit-function-declaration]
10 | ret = func2();
| ^~~~~
func2.c:14:8: warning: implicit declaration of function ‘sum’ [-Wimplicit-function-declaration]
14 | ret = sum(1, 3);
| ^~~
func2.c: At top level:
func2.c:21:6: warning: conflicting types for ‘func1’
21 | void func1() {
| ^~~~~
func2.c:7:2: note: previous implicit declaration of ‘func1’ was here
7 | func1();
| ^~~~~
~/c-lecture (master ✘)✭ ᐅ
- 이렇게 사용할 함수의 형식(프로토타입)이 사용하는 위치 보다 선행되어 있어야 합니다.
- 지금까지 예제에서 #include <stdio.h> 를 사용하였는데 바로 stdio.h 파일에는 제공하는 함수의 형식(프로토타입)이 정의 되어 있습니다.
- 그럼 오류를 바로 잡아 보겠습니다.
#include <stdio.h>
// 리턴값이 없는 함수
void func1();
// 리턴값이 있는 함수
int func2();
// 더하기 함수
int sum(int a, int b);
int main() {
int ret;
// 리턴타입이 없는 함수 호출
func1();
// 리턴값이 있는 함수 호출
ret = func2();
printf("func2() return value:[%d]\n", ret);
// 더하기 함수
ret = sum(1, 3);
printf("sum() return value:[%d]\n", ret);
return 0;
}
// 리턴값이 없는 함수
void func1() {
printf("func1()...\n");
}
// 리턴값이 있는 함수
int func2() {
return 1;
}
// 더하기 함수
int sum(int a, int b) {
int sum;
sum = a + b;
return sum;
}
- 함수를 사용하는 main()함수 위에 사용할 함수의 형식을 정의합니다.
void func1();
int func2();
int sum(int a, int b);
▶ 컴파일/실행
~/c-lecture (master ✘)✭ ᐅ gcc -o func2 func2.c
~/c-lecture (master ✘)✭ ᐅ ./func2
func1()...
func2() return value:[1]
sum() return value:[4]
~/c-lecture (master ✘)✭ ᐅ
- 정상적으로 컴파일이 되고 실행됩니다.
- c언어에서는 사용할 함수가 먼저 정의되어 있어야 한다. 라고 이해하시면 됩니다.
좀 더 큰 프로그램을 개발할때는 이런 함수의 형식을 모아서 하나의 include파일로 만들어서 사용합니다.
반응형
'리눅스 C-언어 초급과정' 카테고리의 다른 글
15. 문자열(배열) 다루기 (0) | 2022.11.17 |
---|---|
14. 함수 파라메타 유형 (0) | 2022.11.17 |
13. 포인터 (0) | 2022.11.16 |
12. 문자열(string) (1) | 2022.11.16 |
11. 다차원 배열 (0) | 2022.11.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- #ifdef
- String
- 포인터
- strcpy
- #define
- Call-By-Reference
- struct
- 배열
- array
- #include
- Linux
- memset
- IPC
- GCC
- 문자열
- While
- 파라메타
- 의유
- 전처리기
- 재고
- Clang
- memcpy
- Call-by-value
- 리눅스
- Member
- Pointer
- c프로그램
- 소켓
- sharetravelplan
- C언어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함