처음 C언어를 공부하면서 헷갈렸던 개념이 바로 전역변수, 지역변수, 그리고 매개변수 였어요.
특히 한국어로는 너무 헷갈렸던..
그래서 제대로 공부하고 기억할 겸, 포스팅 하기로 했습니다!

아직 많이 부족하지만, 저와 같이 이 개념들이 헷갈리시는 분들이 보고 이해할 수 있도록 최대한 자세히 설명해보도록 하겠습니다.

그래서…



전역변수 (Global Variable) 란?


전역변수는 블록, 즉 중괄호로 묶여있는 범위의 바깥 에 선언되는 변수를 말한다. 이름에서 힌트를 얻을 수 있듯이, 블록 안에서 선언하지 않아도 모든 곳에서 불러 올 수 있다.
이런 전역변수는 프로그램이 시작되는 시점부터 끝날 때 까지 메모리를 사용하며 사라지지 않는다. 그렇기 때문에 사용하려는 변수가 사라지지 않기를 원한다면 전역변수로 저장을 해야한다. 전역변수로 선언하는 방법은 다음과 같다.

#include <stdio.h>

int a;

int main(){
  printf("Hello, World!");
  printf("%d", a + b);
}

int b;


위의 코드에서 int main()이 선언되기 전 블록 바깥에 선언된 int a와 int b가 바로 전역변수이다.
주의할 점은, int b처럼 메인함수 다음에 선언을 하고 메인함수에서 사용을 하면 컴파일 오류가 뜬다. 컴파일러는 항상 위에서 아래로 순서대로 진행하기 때문에, 아직 선언되지 않은 int b를 읽고 오류를 내는 것이다. int a를 보면, 전역변수로 블록 바깥에 선언되어있기 때문에 어디서든 불러올 수 있다.

지역변수 (Local Variable) 란?


지역변수는 전역변수와는 반대로, 블록 안 에 선언되는 변수를 말한다. 블록 안에 선언되어 있는 변수는 무조건 지역변수이다. 그렇기 때문에 블록 안에서만 유효하다. 블록을 벗어나게 되면 메모리에서도 사라지고 의미가 없어지기 때문에 그 블록 안에서만 사용해야한다. 예를 들면,

#include <stdio.h>

int multiply(){
    int a = 1, b = 5;
    printf("%d\n", a * b);
}

int main(){
  int a = 10;

  for(int i = 0; i < 3; i++){
    int b = 2;
    printf("%d\n", a += b);
  }

  int c = 15;
  printf("%d", b + c);
}


이 코드 안에서 int a, b, c 는 지역변수이다. 여기서, multiply함수와 메인함수에서의 변수명은 같지만, 다른 블록에 선언되어있으므로 서로 다른 변수이다. 즉, multiply함수의 a,b 변수를 메인함수에서 쓸 수 없고, 메인함수의 a, b변수를 multiply함수에서 사용하지 못한다는 뜻이다.

메인 함수를 살펴보면, for loop 안에서 a를 쓸 수 있는 이유는, for loop이 메인 함수 안에 포함된 블록이기 때문이다. 하지만, for loop 다음 코드는 컴파일 에러가 난다. 왜냐하면 b는 이미 사용되어 사라졌기 때문. 따라서 변수의 선언은 항상 함수 가장 위에 선언해야한다.



매개변수/인자 (Parameter) 와 인수 (Argument)란?
매개변수(또는 인자)는 함수 등에서 사용되는 전달된 값을 받는 변수. 인수는 변수에 전달되는 값. 말로는 굉장히 애매하고 헷갈리기 때문에 예시를 보면,

#include <stdio.h>

int plus(int a, int b){   // 여기서 a, b는 매개변수(인자)
  printf("%d\n", a + b);
}

int main(){
  int result = plus(2, 4);  // 여기서 2와 4는 인수
  printf("%d", result);
}


좀 이해가 되셨나요? 다음엔 C언어의 메모리 구조에 대해 알아보겠습니다.


감사합니다!