[KOCW 한국산업기술대학교 박정민 교수님] C 프로그래밍 9강

MinWoo Park·2021년 8월 21일
0

KOCW

목록 보기
9/19
post-thumbnail

Part9 함수란 무엇인가

9.1 함수란

함수

  • 특정 작업을 수행하는 코드의 집합

함수의 종류:

  • 표준 라이브러리 함수
  • 사용자 정의 라이브러리 함수

함수 사용의 장점

  • 코드의 안정성 향상
  • 에러 수정이 쉬움
  • 재사용성 향상
  • 복잡성을 낮추고, 응집력을 높여줌

9.2 다양한 형태의 함수들

11 형태

  • 출력 형태: 있음
  • 입력 형태: 있음
    ex)
int sum (int x, int y)

10 형태

  • 출력 형태: 있음
  • 입력 형태: 없음(void 생략 가능)
    ex)
int input (void) // 

01 형태

  • 출력 형태: 없음
  • 입력 형태: 있음
    ex)
void print (int x)

00 형태

  • 출력 형태: 없음
  • 입력 형태: 없음(void 생략 가능)
    ex)
void output (void)

9.3 함수 적용 방법

첫 번째 방법: 함수의 정의 => 함수의 호출

  • 함수의 정의: 함수의 기능을 정의한 문장
  • 함수의 호출: 정의한 함수를 호출하는 문장
    ex)
#include <stdio.h>
int max(int a, int b) // Function definition
{
    if(a>b)
        return a;
    else
        return b;
}

int main(void) // Function call 
{
    int i, j;
    int k;

    printf("Enter two numbers :");
    scanf("%d %d", &i, &j);

    k = max(i, j);
    printf("The large number of %d or %d is %d \n", i, j, k);

    return 0;
}

두 번째 방법: 함수의 선언 => 함수의 호출 => 함수의 정의

  • 함수의 원형 선언을 통해 함수 목록이 몇 개 인지 직관적으로 볼 수 있음

ex)

#include <stdio.h>
double divide(double x, double y); // Function declaration
double input(void); // Function declaration
void output(double x); // Function declaration
void information(void); // Function declaration

int main(void)
{
    double num1, num2, result;

    information(); // Function call
    printf("Enter the first real number: ");
    num1 = input(); // Function call

    printf("Enter the second real number: ");
    num2 = input(); // Function call

    result = divide(num1, num2);
    output(result);

    return 0;
}

double divide(double x, double y) // Function definition
{
    double val;
    val = x / y;
    return val;
}

double input(void) // Function definition
{
    double val;
    scanf("%lf", &val);
    return val;
}

void output(double x) // Function definition
{
    printf("Divide results: %lf \n", x);
    return;
}

void information(void)
{
    printf("----- start program ----- \n");
    return;
}


9.4 변수의 종류와 범위

지역 변수(Local Variable)

  • 함수, 조건문, 반복문 등 중괄호 블록 내부와 함수의 매개 변수로 사용되는 변수
  • 초기화를 하지 않으면 garbage value가 저장됨.
  • 메모리 생성 시점은 중괄호 내에서 초기화할 때
  • 메모리 소멸 시점은 중괄호를 탈출할 떄

전역 변수(Global Variable)

  • 중괄호 외부에서 선언되는 변수
  • 메모리 생성 시점: 프로그램 시작할 때
  • 메모리 소멸 시점: 프로그램 종료될 때
  • 프로그램이 종료되지 않는 한 메모리에 존재하기 때문에 영역에 제한받지 않고 사용 가능한 것
  • 초깃값 지정하지 않으면 기본값으로 0 할당, 초기화 반드시 상수로 해야 함(상수 값을 가진 변수도 안됨)

정적 변수(Static Variable)

  • 자료형 앞에 static 키워드를 붙임
  • 전역 변수의 단점을 부분적으로 보완
  • 메모리 생성 시점: 중괄호 내에서 초기화될 때
  • 메모리 소멸 시점: 프로그램이 종료될 때
  • 초깃값 기본값으로 0을 가짐, 차이점은 초기화를 최초 한 번만 수행
  • 함수 내부, 조건문, 반복문 등 중괄호 내에서 전역 변수의 기능을 사용하고 싶을 때 사용
  • 중괄호 내에서만 전역 변수처럼 사용되는 정적 변수를 '정적 지역 변수'라고 부름

cf. '정적 전역 변수'도 존재함, 해당 파일 내에서만 전역 변수로 사용하고 외부에서 참조 못하게 하는 변수

ex)

while(1)
{
    static int num=0; // 초기화는 최초 한 번만 실행
    num=num+1;
    printf("%d \n", num);
}

위와 같은 코드가 있을 때 num은 한 번만 초기화 되기에 0,1,2,3,4, ... 값을 받을 수 있음

외부 변수(External Variable)

  • 외부 파일에 선언된 변수를 참조하여 사용하는 변수
  • 자료형 앞에 extern 키워드를 붙임

레지스터 변수(Register Variable)

  • CPU 레지스터에 변수 할당하여 처리 속도가 빠름
  • 자료형 앞에 register를 붙여서 사용
  • 그러나 대부분 컴파일러가 코드 최적화 단계에서 자동으로 레지스터 변수를 설정하느 기능을 제공하여 따로 사용 안 함

프로세스 메모리 구조

실행 중인 프로그램을 프로세스라고 함.
프로세스는 메모리 공간을 위와 같이 크게 나누어 사용.
이러한 영역들을 기억 부류(Storage Class)라고 함.

기억 부류(Storage Class)의 역할

  • 코드 영역: 실행 코드, 함수들이 저장되는 역역
    말 그대로 코드 영역이니 실행 코드가 들어감

  • 스택 영역: 함수 호출에 의한 매개 변수, 지역 변수
    전역 변수와 달리 프로그램 진행 시에도 메모리가 소멸되는 변수들은 구분하여 스택에 들어감

  • 데이터 영역: 전역 변수와 정적 변수
    프로그램 실행부터 종료까지 사용하는 데이터들은 지역 변수와 구분하여 데이터 영역에 들어감

  • 힙 영역: 동적 메모리를 할당하는 변수

이렇게 구분되어진 이유는 변수들이 선언되는 위치나 종류에 따라 메모리상에 존재하는 기간이 다르기에 구분해서 저장함.


9.5 재귀 함수(Recursive Function)

  • 함수 내에서 자기 자신을 호출하는 함수, 이러한 행위를 재귀 호출(Recursive Call)이라고 함
  • 시간과 메모리 공간의 효율이 저하되는 문제 발생

Reference
강의: 박정민, 『C 프로그래밍』, KOCW 한국산업기술대학교, 9강
교재: 박정민, 『열혈강의 C 언어 본색 명강의가 일으키는 C 언어 기적』, 프리렉 (2011), p227-266.

profile
물음표를 느낌표로 바꾸는 순간을 사랑하는 개발자입니다.

0개의 댓글