본문 바로가기
KNOU/요약정리

[C 프로그래밍] 함수

by bottlesun 2023. 5. 10.
728x90

함수

특정 작업(기능) 을 수행하도록 설계된 독립적인 프로그램

함수들이 정해진 순서에 따라 실행 됨으로 프로그램의 기능 수행

  • C 프로그램은 함수들로 구성 되어 있다.

전체 실행 내용을 몇개의 모듈로 분류

각각의 모듈에 해당하는 내용을 함수로 작성

함수의 특성

자유롭게 호출이 가능하며 독립적이다.

장점

프로그램 수정이 용이하다.

재사용이 가능하여 코드 중복을 최소화 해준다.

프로그램의 기능을 한 눈에 파악할 수 있게 해줌으로 유지 관리가 쉽다.


매개변수 사이의 자료전달 방법

값에 의한 자료전달(call by value)

  • 기본적인 자료전달 방법
  • 실 매개변수와 형식 매개변수 사이에 값의 전달
  • 호출한 함수의 실행이 끝난 다음 전달 받은 값을 되돌려 받지못한다.
#include <stdio.h>

void swap(int x, int y) {
// 두 변수의 값을 바꾸는 함수
    int temp = x;
    x = y;
    y = temp;
}

int main() {
    int a = 10, b = 20;

    printf("Before swapping: a = %d, b = %d\\n", a, b);

    swap(a, b); // 함수 호출

    printf("After swapping: a = %d, b = %d\\n", a, b);

    return 0;
}

Before swapping: a = 10, b = 20
After swapping: a = 10, b = 20

값의 교환이 일어나지 않은 이유

main 함수 부분에서 실 매개 변수의 값이 변화가 없기 때문이다. (기억공간에서의 a,b가 변하지 않았다.)

참조에 의한 자료전달(call by refrence)

  • 호출함수와 피 호출함수의 매개변수 값을 서로 교환할 수 있는 자료전달 방법
  • 값을 전달하는 것이 아니라 실 매개변수의 값이 들어있는 주소 값이 전달.
#include <stdio.h>

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int a = 10, b = 20;

    printf("Before swapping: a = %d, b = %d\\n", a, b);

    swap(&a, &b);

    printf("After swapping: a = %d, b = %d\\n", a, b);

    return 0;
}

Before swapping: a = 10, b = 20
After swapping: a = 20, b = 10

값이 변경 된 이유

& → 주소 연산 (변수의 주소를 참조)

  • → 포인터 (주소의 내용을 가르킴)

x,y → a,b 의 주소를 참조하여 값을 바꿔 주소 자체의 값을 바꾸기에 변경 된다.

기억 클래스

변수를 기억공간의 특정 영역에 할당하는 방법

각 변수의 유효범위와 존속 기간을 설정할 수 있다.

변수 위치에 따른 기억 방법

지역변수

특정 범위 내에서만 통용되는 변수

변수의 값은 선언된 블록스코프 내부에서만 존재한다.

전역변수

함수 밖이나 외부 파일에서 선언되어 프로그램 전체에 걸쳐 사용 될 수 있는 변수

프로그램 선두에 위치 시켜야 한다

#include <stdio.h>

int global_var = 10; // 전역변수 global_var 선언 및 초기화

void increment() {
    global_var++; // 전역변수 global_var의 값을 1 증가시킴
}

int main() {
    printf("global_var = %d\\n", global_var); // 전역변수 global_var의 값 출력

    increment(); // increment 함수 호출

    printf("global_var = %d\\n", global_var); // 전역변수 global_var의 값 출력

    return 0;
}

지역변수를 사용하는게 효율적이다.

  • 함수의 독립성 향상
  • 디버깅 효율 향상
  • 기억 공간 절약

변수 존속기간에 따른 기억 방법

자동변수 (auto)

  • 함수 실행시 만들어지고, 실행이 끝나면 기억공간이 제거
  • 통용 범위는 변수가 선언된 블럭 스코프 내로 한정 (지역변수)
  • 초기화를 해야한다.
#include <stdio.h>

int main() {
    auto int x = 10; // auto 키워드를 사용하여 자료형을 자동으로 추론하도록 함
    printf("x = %d\\n", x);

    return 0;
}

정적변수 (static)

기억영역이 프로그램 끝날 때 까지 유지 (전역변수)

초기화가 없으면 0으로 자동 초기화

#include <stdio.h>

void test() {
    int i = 0;
    static int count = 0; // 정적 변수 count 선언 및 초기화
    count++;
    i++;
    printf("static = %d, i = %d\\n", count, i);
}

int main() {
    test(); // static = 1, i = 1
    test(); // static = 2, i = 1
    test(); // static = 3, i = 1

    return 0;
}

외부변수 (extern)

함수 외부에서 선언 (전역변수에 해당)

다른 파일에서 외부변수로 선언된 변수의 값을 참조 할 수 있다.

// file1.c
int x = 10;

// file2.c
#include <stdio.h>

extern int x; // 전역 변수 x가 다른 파일에 선언되어 있음을 알림

int main() {
    printf("%d\\n", x); // x 값인 10이 출력됨
    return 0;
}

레지스터 (register)

CPU 내의 레지스터에 자료를 저장하고자 할 때 사용 (auto랑 비슷함)

프로그램의 실행속도 증가를 목적으로 사용 (주로 반복문에서 카운터 변수로 사용)

#include <stdio.h>

int main() {
    register int i;
    int sum = 0;

    for (i = 1; i <= 100000; i++) {
        sum += i;
    }

    printf("sum = %d\\n", sum);
    return 0;
}
728x90

댓글