변수의 종류

KIM SOO MIN·2023년 11월 27일

learning

목록 보기
9/16

💡 변수는 셀 수 없이 많이 써왔는데 그 종류나 쓰이는 방법에 대해 묻는다면 5초만에 답이 나올 것 같지는 않았다. 그래서 이번 포스트에서는 변수의 종류에 대해 블로깅 해보도록 하겠다.
컴퓨터가 변수를 처리하는 방법

코드 영역데이터 영역힙 영역스택 영역
소스코드 전역 변수, 정적 변수 동적 할당 변수 지역 변수, 매개변수
메모리의 구조는 너무 길어질 것 같아서 다른 포스팅에서 다루기로 하겠다.
전역변수

전역변수는 어디서든 접근가능한 변수이다.
해당 파일을 넘어 다른 파일에서도 접근이 가능하다.
main 함수가 실행되기 전에 프로그램에 메모리에 할당된다.
메모리 데이터 영역에 적재된다.

#include <stdio.h>

int global = 10;

int globalTest() {
	global += 5;
	printf("함수에서 전역변수 사용 : %d\\n", global);
}

int main() {
	printf("전역변수 : %d\\n", global);
	globalTest();

	return 0;
}

지역변수

특정 블록에서만 접근 가능하다.
함수가 실행될때마다 메모리에 할당되며, 함수가 종료되면 메모리에서 해제된다.
메모리 스택 영역에 기록된다.

#include <stdio.h>

int functionTest() {
	int temp = 5;
	temp += result;   // result변수를 불러올 수 없기 때문에 Error
	
	return temp;
}

int main() {
	int result = 10;
	printf("result 결과 : %d\\n", functionTest());
	
	return 0;
}

정적변수

선언된 파일 내에서만 접근이 가능하다.
프로그램이 실행될때 메모리에 할당되어 프로그램이 종료되면 해제된다.
데이터 영역에 적재된다.
전역 변수에 선언된 static 키워드의 의미 : 선언된 파일 내에서만 참조를 허용
함수 내에 선언된 static 키워드의 의미 : 한번만 초기화되고, 지역 변수와 달리 함수를 빠져나가도 소멸되지 않는다.
정적 지역변수 예시

#include <stdio.h>

void set_num(){
	static int num;
  printf("%d\\n", num);
  num++;
}

int	main(){
	set_num();
	set_num();
  set_num();

  return 0;
}

/* 결과 : 0
				 1 //값이 유지된 채로 증가된다.
         2 */
#include <stdio.h>

void set_num(){
	static int num;
  printf("%d\\n", num);
  num++;
}

int	main(){
	set_num();
	printf("%d\\n", num); // num이 지역변수이기 때문에 Error 발생
  return 0;
}

정적 전역변수 예시

#include <stdio.h>

static int num = 1;

void increase_num(){
    num++;
    printf("%d\\n", num);
}

int	main(){
	printf("%d\\n", num);
	increase_num();
	increase_num();

  return 0;
}

/* 결과 : 0
				 1 //값이 유지된 채로 증가된다.
         2 */

레지스터변수

CPU에 가까워서 속도가 빠르다.
매우 빠르기 때문에 반복문에 쓰이기 적당하다.
두개 이상 사용하면 CPU에 무리를 주므로 레지스터변수로 사용할 수 없고 auto 변수로 전환된다.
매우 한정되어 있기때문에 정확히 처리될지는 장담할 수 없다.

#include <stdio.h>

int main() {
	register int cnt;
	register long sum;

	sum = 0;
	for(cnt = 1 ; cnt < ; cnt++) {
		sum += cnt;
	}
	printf("sum is %d\\n", sum);
	
	return 0;
}

매개변수

값에 의한 전달 방식은 함수내에서 마치 지역변수처럼 변수를 새롭게 생성한다.
참조에 의한 전달방식은 주소를 전달하므로 원래의 변수 자체에 접근 가능하다.
참조 전달을 사용하기 위해서는 함수를 선언할 때 매개변수 앞에 &을 붙여주면 된다.
매개변수는 함수에 전달하는 parameter를 뜻한다.

int add(int x, int y) {   // x와 y가 매개변수
	return x + y;
}

add(2, 7);   // 2와 7이 인수(argument)
profile
3년차 풀스택 엔지니어입니다.

0개의 댓글