본문 바로가기
PROGRAMMING/C

[POSTECH MOOC] 컴퓨터공학 입문Ⅰ - 3

by 안녕나는현서 2021. 4. 5.
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

댓글