728x90
본 내용은 POSTECH '청년 AI · Big Data 아카데미 온라인 기초과정'을 수강하며 정리한 내용입니다.
Ⅲ 함수
<사용자 정의 함수>
- 함수
- 독립적으로 수행하는 프로그램 단위
- C언어는 여러 개의 함수들로 이루어짐
- 프로그램에서 반복적으로 수행되는 기능을 함수로 만들어 호출
- 함수는 문제 해결의 방법 : 주어진 문제를 작은 문제로 나누어 생각
- 함수로 구성된 프로그램은 함수 단위로 구성되어 있어 읽기 쉽고 이해하기 쉬움
- 이미 정의된 함수는 여러 번 호출이 가능하므로 소스의 중복을 최소화하여 프로그램의 양을 줄이는 효과
- C 프로그램 함수의 종류
- 주(main) 함수
- 프로그램의 시작과 종료를 나타내는 함수
- 프로그램에 main()함수는 꼭 있어야 함
- 사용자 정의 함수라 할 수 있음
- 사용자 정의 함수
- 사용자(프로그래머)가 문제를 분석하여 필요한 기능으로 분류하여 기능별로 코딩하고자 할 때 만듦
- 예) add(), swap()
- 시스템 라이브러리 함수
- 많이 사용하는 기능의 함수들을 시스템에서 미리 만들어 놓고 사용자가 사용할 수 있도록 제공하는 함수
- 예) 입출력함수(scanf(), printf())
- 함수의 정의 (Function definition) : 함수 만들기
/* 두개의 정수를 매개변수로 입력 받아 더한 값을 리턴하는 함수 만들기 */
int add (int x, int y) /* 리턴타입 함수이름 (매개변수 리스트) <- 함수의 머리(header) */
{
int sum;
sum = x+y;
return sum;
} /* 중괄호 안쪽은 함수의 몸체(body) */
- 함수 머리(header) : 리턴 타입, 함수 이름, 매개변수 리스트
/* 사용자 정의 함수 만들기 */
#include <stdio.h>
int main(void)
{
int a=0, b=0, sum=0;
scanf("%d %d", &a, &b);
sum = a+b;
printf("%d + %d = %d \n", a, b, sum);
return 0;
}
- 함수 원형(function prototype) = 함수 선언
- 함수를 사용(호출)하기 전에 함수의 헤더 부분을 기술하는 단계
<함수와 매개변수>
- 매개변수 없는 함수 만들기
void hello(void) /* 함수 원형 */
void main()
{
hello(); /* 함수 호출 */
}
void hello /* 함수 정의 */
{
printf("Hello C!");
return;
}
- main() 함수에서 hello() 함수 호출
- hello() 함수에서 어떤 값을 가져오는 것이 아니라 실행만 하고 다시 돌아옴
- void : 아무 값도 리턴하지 않음
- 어떤 값도 리턴하지 않기 때문에 return 생략 가능
- 매개변수 있는 함수 만들기
int main(void)
{
int a=0, b=0, sum=0;
scanf("%d %d", &a, &b);
sum = add(a, b);
printf("%d + %d = %d \n", a, b, sum);
}
int add(int a, int b)
{
int sum;
sum = a+b;
return sum;
}
- 지역변수 규칙 : 함수 안에서 선언된 변수는 함수 안에서만 쓸 수 있음
- main()에서 a, b와 add()에서 a, b는 전혀 상관없는 변수
- add()에서 main()으로 돌아갈 때는 1개의 값만 리턴 가능
- 매개변수(parameter, 인자, argument) : 함수와 함수 사이에 주고받는 값 (변수값, 상수값 등)
- 지역변수 : 함수 지역 안에서 선언된 변수는 다른 변수에서 그 내용을 보거나 수정할 수 없음
<함수 호출 방법>
- 두 개의 변수 값을 서로 바꾸려면? swap()
a = 10, b = 20 temp = a a = b b = temp → a = 20, b = 10 |
- 주소에 의한 호출(call by address)
- 다른 함수를 통해서 두 개의 변수 값을 서로 바꾸려면? → 리턴 값을 2개 가지고 올 수 없는 문제 발생
- main 함수에 있는 변수의 주소 값을 가지고 swap() 함수를 호출하면 swap() 함수에서 main 함수의 변수 값을 바꿀 수 있음 (포인터 변수 사용)
- 포인터 변수 : 주소를 값으로 가지는 변수, 주소값을 저장하기 위해서는 포인터 변수가 필요함
- 포인터 변수 선언 : int *p, int *q
- 포인터 변수는 주소 값만 값으로 가질 수 있음 (int *p = &a, P=&a)
- 바꾸기 위해서는 역참조 연산자를 사용해야 함
- 역참조 연산자 : 포인터 변수 선언 후에 문장 중에 포인터 변수 앞에 *가 오면 (*p) 포인터 변수가 가리키는 main 변수의 값을 변경할 수 있음
#include <stdio.h>
int sum(int a, int b); /* 함수 원형 */
void swap(int *p, int *q); /* 함수 원형 */
int main(void)
{
int a, b, total;
printf("Input two integers : ");
scanf("%d %d", &a, &b);
printf("a : %d, b : %d \n", a, b);
total = sum(a, b); /* call by value */
printf("** sum function call ** \n");
printf("%d + %d = %d \n", a, b, total);
swap(&a, &b); /* call by address */
printf("** swap function call ** \n");
printf("a : %d, b : %d \n", a, b);
return 0;
}
int sum(int a, int b)
{
int total;
total = a + b;
return total;
}
void swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
728x90
'PROGRAMMING > C' 카테고리의 다른 글
[POSTECH MOOC] 컴퓨터공학 입문Ⅱ - 2 (0) | 2021.04.06 |
---|---|
[POSTECH MOOC] 컴퓨터공학 입문Ⅱ - 1 (0) | 2021.04.06 |
[POSTECH MOOC] 컴퓨터공학 입문Ⅰ - 4 (0) | 2021.04.05 |
[POSTECH MOOC] 컴퓨터공학 입문Ⅰ - 2 (0) | 2021.04.05 |
[POSTECH MOOC] 컴퓨터공학 입문Ⅰ - 1 (0) | 2021.04.05 |
댓글