프로그래밍 C언어

변수(Variable)와 상수(Constant)

게임첫걸음 2024. 8. 8. 17:00

이번 글에서는 변수의 종류와 변수명에 대한 규칙과 상수의 기초에 대해 다뤄보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
 
//전역변수(Global Variable)
//전역변수는 어떤 곳이든 사용하는 변수다. 어떤 중괄호 안에서도 사용 가능하다.
int g_iVar = 100//변수명에 global의 g를 붙여 표현하기도한다. 웬만하면 이렇게 하자. 
 
int main(void
{
    //변수(Variables)
    //변수 선언(Variable Declaration)
    //자료형 변수명 = 초기값;
    int var = 10
    var = 20;            // 값 대입
    printf("var: %d\n", var); 
    //반환값: var: 20
    
    //변수명에 대한 규칙 설명
    //int var;              동일한 변수명은 사용 안됨
    //int -var;             몇몇 특수문자 사용 안됨
    int _var;               //사용 가능한 특수문자도 있음
    //int v a r;            띄어쓰기도 안됨. 여기선 v가 변수명으로 설정되었는데 a와 r의 기능이 없음.
    //int 1var;             숫자가먼저 나오면 안됨.
    int var1;               //이건 가능
    int Var;                //대소문자 구분
    int first, second;      //연속 선언 가능    
    //int sizeof;           키워드, 기능이 있는 함수명은 사용할 수 없음. 
    int 한글;               //한글 가능은 한데 하지마라 그냥...
 
    int iVar;               //변수는 소문자로 함수는 대문자로 분류하여 구분하기 쉽도록하자.
    float fVar;             //변수는 소문자로 함수는 대문자로 분류하여 구분하기 쉽도록하자.
    int camelRules = 0;     //단어가 바뀔 때마다 대문자를 쓰는 걸 카멜룰즈(낙타)법이라고 한다.
    int snake_rules = 0;    //_를 사용하여 변수와 함수를 구분하는 것을 스네이크법이라고 한다.
   //float var; //위에 var 변수명이 이미 있기 때문에 사용 안됨.
   //double var; //위에 var 변수명이 이미 있기 때문에 사용 안됨.
 
    //지역(Local)
    {
        //지역변수(Local Variable) {} 안의 변수를 뜻함.
        //변수의 지역성(Variable Local Scope)
        int var;                                            //컴퓨터는 코드를 아래방향으로 읽는데 이미 지나간 변수의 값은 사라진다.
        printf("var: Address Local: %p\n"&var);            //때문에 //지역(Local) 위의 같은 변수명인 var이 있는데도 사용이 가능한거다.
        {
            int var;                                        //위와 같은 이유로 같은 변수명이라도 다른 지역이면 사용 가능함.
            printf("var: Address Inner: %p\n"&var);
        }
    }
    printf("var: Address Exit: %p\n"&var);
 
    g_iVar = 123;
    
    //상수(Constant)
    //리터럴 상수(Literal Constant): 리터럴 상수 바꿀 수 없는 값)
    const int constVar = 10;                                //(자료형 앞에 const를 붙이면 상수화시켜준다. 값을 바꿀 수 없는 변수가 된다는 뜻이다.)
    
    //Error Code
    return 0;
}
cs

 이번엔 "꼭 이렇게 해야한다"는 것보단 작업할 때 코드를 해석하기 편하도록 프로그래머들 사이에서 자주 쓰이는 방법이라고 합니다. 저도 배우는 입장이라 아닐 수도 있습니다.

 

오늘 배운 변수의 종류는 2가지였지만, 개인적으로 따로 공부하여 3가지 설명하겠습니다.

 

  • 지역변수 (Local Variable): { } 중괄호 내부에서 선언된 변수입니다. 함수 지역 밖으로 나가면 사라져 변수의 메모리 공간이 소멸됩니다. 초기값 설정(초기화)를 하지 않으면 오류가 발생하거나 쓰레기 값으로 설정됩니다.
  • 전역변수 (Global Variable) : { } 외부에 선언된 변수로 어느 지역, 외부 파일에서도 사용할 수 있는 변수이며 프로그램 종료 전엔 초기값(초기화)가 계속 진행되며 사라지지 않는 변수입니다. 잘못 사용하거나 남용했다간 관리가 어려워질 수 있다는 단점이 있습니다.
  • 정적변수 (Static Variable): 전역 변수의 문제점을 보완한 변수이며 서로 다른 함수 간의 호출에 사용합니다. 똑같이 프로그램 종료 전엔 사라지지 않고 유지됩니다. 그러나, 초기값(초기화)이 딱 한 번만 적용되는 성질을 가지고 있으며 쓰임새에 따라 정적 전역변수, 정적 지역변수로 나뉩니다.
  • 지역 변수 선언 방법: { } 중괄호 안에 표현된 변수들을 모두 지역 변수라고 표현합니다.
  • 전역 변수 선언 방법: 변수 앞에 global의 g와_를 붙혀 int g_iVar 이런식으로 표현합니다. 초기값을 설정하지않으면 0으로 자동 설정됩니다.
  • 정적 변수 선언 방법: 지역, 전역 상관없이 자료형 앞에 static을 붙여 표현합니다. static int val, static int g_Val

<지역변수> (Local Variable)

int main(void)
{
int var = 10
    var = 20;          
    printf("var: %d\n", var); 
{
        //변수의 지역성(Variable Local Scope)
        int var;                                         
        printf("var: Address Local: %p\n"&var);           
        {
            int var;                                        
            printf("var: Address Inner: %p\n"&var);
}
   }

     printf("var: Address Exit: %p\n"&var);

return 0;

 }

 위의 코드로 지역 변수의 특징을 알아보겠습니다. var는 지역 변수로 선언되었고 초기값은 10. 그러나, var = 20; (값 대입) 을 통해 지역변수 var는 20이 할당됩니다. 변수는 값을 바꿀 수 있기 때문에 값 대입이 가능합니다. 지역 내 같은 이름의 변수는 선언할 수 없지만, { }를 추가하여 새로운 지역을 생성하면 변수의 지역성(Variable Local Scope)을 가지게되어 같은 변수명을 선언해도 문제가 없습니다.

출력값

var: 20

var: Address Local: 주소

var: Address Inner: 주소

var: Address Exit: 주소 (Exit의 주소는 20값의 var의 주소)

 

<전역변수> (Global Variable)

#include <stdio.h>
int g_iVar = 100;
int main(void
{
    int var = 10
    var = 20;

  printf("var: %d\n", var);  //출력값: var: 20

printf("g_iVar: %d\n", g_iVar);  //출력값: g_ivar: 100

}

전역변수는 위의 코드에서 살짝 변경해서 특징을 알아보겠습니다. g_iVar 변수는 지역 내에 없지만 { } 중괄호 밖에서 전역 변수로 선언이 되었기 때문에 지역 안에서도 출력값이 등장합니다. 추가로 같은 프로젝트 다른 문서에서도 g_iVar 변수는 사용할 수 있습니다.

 

<정적 지역변수> (Static Local Variable)

 정적 변수는 두 가지의 종류로 { } 지역 안에서 선언하면 지역 정적변수 (Static Local Variable) 밖에서 선언하면 전역 정적변수 (Static Global Variable)가 됩니다. 지역 정적변수부터 알아보겠습니다. 함수를 벗어나도 프로그램이 종료되지 않는한 계속 유지되는 변수입니다. 예시로 설명합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
void increaseNumber(){
    static int num1;      // 정적 변수 선언 및 값 초기화 (디폴트값 0)
    printf("%d \n", num1);    // 정적 변수 num1의 값을 출력
    num1++;     // 정적 변수 num1의 값을 1 증가시킴
}
 
int main(){
    increaseNumber();    // 0
    increaseNumber();    // 1
    increaseNumber();    // 2
    increaseNumber();    // 3: 정적 변수가 사라지지 않고 유지되므로 값이 계속 증가함
    
    return 0;
}
cs

void increaseNumber에서 increaseNumber는 num1이라는 정적 지역변수 초기값에 1을 증가시키라는 함수입니다.

 int main() 함수에서 increaseNumber() 함수를 호출하여 실행합니다.

출력값

0

1

2

3 (만약 int main()함수에 더 많은 increaseNumber()함수를 호출한다면 그만큼 출력값에 추가됩니다.)

 

만약 여기서 static이 붙지않았다면 어떻게 될까요? int num1은 일반 지역변수이기 때문에 초기화를 하지 않으면 바로 오류가 발생합니다. 초기값으로 = 0;으로 하더라도 void increaseNumber()에서 벗어나면 변수 자체가 사라져버리기 때문에 int main()함수가 암만 호출한다해도 밑의 값이 출력됩니다.

0

0

0

0

 

<정적 전역변수> (Static Global Variable)

 { } 밖에서 자료형 앞에 static을 붙여 선언하면  전역 정적변수입니다. 전역변수는 다른 파일에서도 호출하거나 불러올 수 있는 장점이 있지만 오히려 단점이 되어 남용하다간 유지 보수할 때 헷갈리는 상황이 발생할 수 있습니다. 이를 방지하기 위해 사용되며 정적 전역변수가 선언된 그 파일에서만 불러올 수 있습니다. 이 변수는 나중에 여러 파일을 다루며 연계해야할 상황이 왔을 때 따로 다루겠습니다. 차이점은 다른 외부 파일에서 접근할 수 없다는 것입니다.

 

변수의 종류와 설명은 여기서 마치고 다음은 변수명에 대한 규칙 설명입니다. 맨 위의 코드를 기준입니다.

  • int var;  //사용 가능
  • int -var; //몇몇 특수문자 사용 불가
  • int _var; //언더바처럼 사용 가능한 특수문자 존재
  • int v a r; //띄어쓰기 사용 불가 (컴퓨터는 v가 변수명으로 판단하는데 a 와 r의 용도를 몰라 오류 발생)
  • int 1var; //수는 머릿말 사용 불가
  • int var1; //꼬리말에는 사용 가능
  • int Var;   //대소문자 구분하여 사용 가능
  • int sizeof; //이미 기능이 존재하는 키워드는 사용 불가
  • int first, second; //연속 선언 가능i
  • int 한글; //가능은 한데 컴파일러와 프로그램에 따라 오류발생하고 그냥 쓰지마...
  • int iVar;  //변수는 소문자로 함수는 대문자로 분류하여 구분하기 쉽도록 작성
  • float fVar; //위와 같음
  • int camelRules = 0;   //변수명에서 단어가 바뀔 때마다 대문자로 표시하여 구분하는걸 카멜룰즈(낙타)법이라고 한다.
  • int snake_rules = 0;   //변수명에서 단어가 바뀔 때마다 _언더바로 표시하여 구분하는걸 스네이크법이라고한다.
  • 만약 지역 내에 int var가 있는 상황에서 자료형만 바꿔 float var;로 표기해도 오류가 난다. 같은 이름의 변수명은 사용할 수 없기 때문이다.

<상수> (Constant)

상수는 수업에서 정말 조금 배워서 정의만 다룹니다. 상수란 바꿀 수 없는 값을 뜻합니다. 선언 방법은 자료형 앞에 const를 붙이면 됩니다. (ex) const int constVar = 10; (변수명 Var 앞에 const는 안붙여도 되지만, 알아보기 편하도록 붙이는걸 추천한다.)