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

나라리야·2021년 5월 1일
0

CS_study

목록 보기
12/18
post-thumbnail

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


프로그램 메모리 주소

컴퓨터에서 프로그램이 실행되기 위해서는 프로그램이 메모리에 적재(Load)되어야 합니다.
당연히 프로그램의 크기를 충당할 수 있을 만큼의 메모리 공간이 있어야 하는데
일반적인 컴퓨터의 운영체제는 메모리 공간을 네 가지로 구분하여 관리합니다.


전역변수 (Global Variable)

전역변수(전체를 총괄하는 변수)란 프로그램의 어디서든 접근 가능한 변수를 말한다.
main 함수가 실행되기도 전에 프로그램의 시작과 동시에 메모리에 할당되는데
프로그램의 크기가 커질 수록 전역 변수로 인해 프로그램이 복잡해질 수 있으니 유의해야합니다.
메모리의 데이터(Data)영역에 적재(Load) 됩니다.

예제) 전역변수

#include <stdio.h>

int a = 5; //전역변수는 메인함수 바깥쪽에 선언되어 사용됨 

int changeValue() {
 a = 10; 
}

int main(void) { 
 printf("%d\n", a);  // 전역변수 a의 값 5
 changeValue();  // 함수실행 
 printf("%d\n", a); //함수실행 후 나오는 a의 값 10
 system("pause"); 
 return 0;

}  

지역변수 (Local Variable)

지역변수란 프로그램에서 특정한 블록(Block)에서만 접근할 수 있는 변수를 말한다.
함수가 실행될 때마다 메모리에 할당되어 함수가 종료되면 메모리에서 해제된다.
지역변수는 프로그램의 전체에서 사용되는게 아니기 때문에 메모리의 스택(Stack) 영역에 기록된다.

#include <stdio.h>

int main(void) { 
 int a = 7;
 if (1) {
 int a = 5; 
}
 printf("%d", a); 
 system("pause"); 
 return 0;
}  // 7이 출력된다. if문 블럭안에서 선언된 변수 a=5 는 if문안에서만 사용가능한 지역변수이다.

정적변수 (Static Variable)

정적변수란 특정한 블록에서만 접근할 수 있는 변수입니다.
프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제됩니다.
(지역변수와 전역변수 특징을 모두 가지고 있다. )
메모리의 데이터(Data)영역에 적재(Load)됩니다.

예제) 정적변수

#include <stdio.h>

void process() { 
  static int a = 5; // 프로그램이 실행됨과 동시에 a가 메모리에 적재됨 
  a = a + 1; //프로세스 함수를 불러올 때마다 a에 1을 더한다
  printf("%d\n", a); //a값을 출력 
}

int main(void) { 
 process(); // 프로세스 함수를 출력 6
 process(); // 7
 process(); //8
 system("pause"); 
 return 0;
}

// 차례대로 6,7,8이 출력된다. 

레지스터 변수(Register Variable)

레지스터 변수란 메인 메모리 대신 CPU의 레지스터를 사용하는 변수이다.
레지스터는 매우 한정되어 있으므로 실제로 레지스터에서 처리될 지는 장담할 수 없다. (컴파일러가 담당하는 부분이라 장담할 수 없는 것)

예제) 레지스터 변수

#include <stdio.h>

int main(void) {
 register int a = 10, i; //레지스터 변수 형태로 a와 i를 선언함
 for (i = 0; i < a; i++) { //0~9까지 출력되는데
 printf("%d ", i);  // 레지스터 변수를 사용했기 때문에 더 빠르게 처리될 수 있을거라는 기대를 할 수 있다. 
}
 system("pause");
 return 0; 
}

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

함수를 호출할 때 함수에 필요한 데이터를 매개변수로 전달합니다.
전달방식은 1) <값에 의한 전달>방식과 2)<참조에 의한 전달> 방식이 있습니다.
값에 의한 전달 방식은 단지 값을 전달하므로 함수 내에서 변수가 새롭게 생성됩니다.
참조에 의한 전달 방식은 주소를 전달하므로 원래의 변수 자체에 접근할 수 있습니다.

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

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

#include <stdio.h>

void add(int a, int b) { //지금까지 해왔던 방식 
a = a + b; 
// printf("%d\n", a) 코드가있다면 -> 17이 출력
}

int main(void) {
int a = 7;
add(a, 10); // add함수내에서만 사용되는 a변수이기 때문에 main함수에 선언된 a변수의 값이 add함수에 전혀 영향을 주지 않는다. 
printf("%d\n", a); // 그대로 7이 출력된다. 
system("pause");  
return 0;
}

그렇다면 이렇게 add 함수를 이용해서 기존의 값 자체를 바꾸고 싶다면 어떻게 해야할까?
참조에 의한 전달 방식을 사용하면 된다.

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

참조에 의한 전달 방식은 함수의 매개변수로 값을 전달하는 것이 아니라 변수의 주소를 전달한다.
이러한 방식을 이용하면 원래 변수의 값에 접근하여 값을 변경할 수 있다.

 #include <stdio.h>
 
void add(int *a) {
 *a = (*a) + 10; //간접참조 연산자를 사용
}

int main(void) {
 int a = 7; 
 add(&a); //a의 주소값을 넘김 
 printf("%d\n", a); //17이 출력됨 
 system("pause"); 
 return 0;
}

참조에 의한 전달 방식은 단지 매개변수로 '포인터(Pointer)'변수를 보낼 뿐 딱히 특별한게 아니다! 어려워하지말자!

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

profile
Code의 美를 추구하는 개발자 🪞

0개의 댓글