컴퓨터가 변수를 처리하는 방법

FastCampus All-In-One 패키지 중 C/C++ 수업을 듣고 정리한 자료입니다.

실행환경: Windows 10

학습목표

  • C언어에서 다양한 변수를 처리하는 방법을 공부
  • 지역 변수, 전역 변수, 레지스터 변수 등을 학습
  • 특정한 함수에 값을 전달하거나 주소를 전달하는 방법을 이해

프로그램 메모리 주소


  • 컴퓨터에서 프로그램이 실행되려면 프로그램이 메모리에 적재(Load)되야 함
  • 따라서, 프로그램 크기를 충당할 수 있을 정도의 메모리 공간이 필요
  • 일반적인 컴퓨터 운영체제에서 메모리 공간은 4가지로 구분하여 관리

메모리공간

전역변수(Global Variable)


  • 프로그램의 어디서든 접근 가능한 변수
  • main 함수가 실행되기 전에 프로그램의 시작과 동시에 메모리에 할당
  • 프로그램 크기가 커질 수록 전역 변수로 인해 프로그램이 복잡해질수 있다
  • 메모리의 데이터(Data) 영역에 적재됨

전역변수 예시

#include <stdio.h>

int a = 5;

int changeValue() {
    a = 10;
}

int main(void) {
    printf("%d\n", a);
    changeValue();
    printf("%d\n", a);
    system("pause");
    return 0;
}
  • int a = 5; 가 전역변수
  • changeValue()main() 어디로든 접근이 가능하다

결과

5
10
계속하려면 아무 키나 누르십시오 . . .

지역변수(Local Variable)


  • 특정한 블록(Block)에서만 접근할 수 있는 변수
  • 함수가 실행될 때마다 메모리에 할당되어 함수가 종료되면 메모리에서 해제
  • 메모리의 스택(Stack)영역에 기록

지역변수 예시

#include <stdio.h>

int main(void) {
    int a = 7;
    if(1) {
        int a = 5;
    }
    printf("%d\n", a);
    system("pause");
    return 0;
}
  • 블록은 총 2개
    • main함수와 if문
  • 프린트하는 a와 같은 블록에 있는건 int a = 7; 이기 때문에 7이 출력

결과

7
계속하려면 아무 키나 누르십시오 . . .

정적변수(Static Variable)


  • 특정한 블록(Block)에서만 접근할 수 있는 변수
  • 프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제
  • 메모리의 데이터(Data)영역에 적재

정적변수 예시

#include <stdio.h>

void process() {
    static int a = 5;
    a = a + 1;
    printf("%d\n", a);
}

int main(void) {
    process();
    process();
    process();
    system("pause");
    return 0;
}
  • 프로그램 최초 실행시 static int a = 5;가 적재가 되고
  • 이후 아래에 a = a + 1;이 실행되어서 최초값은 6
  • 그 이후에는 process()를 호출할 때 마다
  • static int a = 5;는 무시하고 a = a + 1만 수행

결과

6
7
8
계속하려면 아무 키나 누르십시오 . . .

레지스터 변수(Register Variable)


  • 메인 메모리 대신 CPU의 레지스터를 사용하는 변수
  • 매우 한정되어 있으므로 실제로 레지스터에서 처리될 지는 장담할수 없음

레지스터 변수 예시

#include <stdio.h>

int main(void) {
    register int a = 10, i;
    for (i = 0; i < a; i++) {
        printf("%d", i);
    }
    system("pause");
    return 0;
}
  • register int a = 10이 레지스터 변수 선언 부분
  • 일반 변수보다 더 빠르게 처리될거라는 기대감을 가질수 있다

결과

0 1 2 3 4 5 6 7 8 9 계속하려면 아무 키나 누르십시오 . . .

함수의 매개변수가 처리될 때


  • 함수를 호출할 때 함수에 필요한 데이터를 매개변수로 전달한다
  • 전달방식은 값에 의한 전달참조에 의한 전달 방식이 있다
  • 값에 의한 전달 - 단지 값을 전달하므로 함수 내에서 변수가 새롭게 생성됨
  • 참조에 의한 전달 - 주소를 전달하므로 원래의 변수 자체에 접근할 수 있음

값에 의한 전달 방식(ADD 함수)


  • ADD 함수로 2개의 값을 넣으면 새롭게 두 변수가 메모리 내에 할당되어 처리
  • 따라서, 원래 변수의 값에는 영향을 미치지 못한다.

예시

#include <stdio.h>

void add(int a, int b) {
    a = a + b;
}

int main(void) {
    int a = 7;
    add(a, 10);
    printf("%d\n", a);
    system("pause");
    return 0;
}
  • main()함수에서는 a에 7이라는 값이 담겨져 있고
  • add()함수의 결과 값은 포함이 되지 않기 때문에 결과가 7이 됨.
  • add(a, 10)의 결과 값을 보려면 add 함수안에 printf를 해야함

결과

7 
계속하려면 아무 키나 누르십시오 . . .

참조에 의한 전달 방식(ADD 함수)


  • 함수의 매개변수로 변수의 주소를 전달한다
  • 따라서, 원래 변수의 값에 접근하여 값을 변경할수 있다.
  • 매개변수로 “포인터(Pointer)”변수를 보낼뿐 특별한것은 없다

예시

#include <stdio.h>

void add(int *a) {
    *a = (*a) + 10;
}

int main(void) {
    int a = 7;
    add(&a);
    printf("%d\n", a);
    system("pause");
    return 0;
}

결과

17 
계속하려면 아무 키나 누르십시오 . . .

요약


  • C언어에서는 전역 변수, 지역 변수 등 다양한 종류의 변수가 사용된다.
  • 함수에 데이터를 전달하는 방법은 두 가지가 있다
    • 값을 전달하는 방식
    • 주소를 전달하는 방식

Reference


패스트캠퍼스 컴퓨터공학 올인원 패키지

Comments