이번 글에서는 변수의 종류와 변수명에 대한 규칙과 상수의 기초에 대해 다뤄보겠습니다.
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)
printf("var: Address Exit: %p\n", &var);
}
위의 코드로 지역 변수의 특징을 알아보겠습니다. 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)
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는 안붙여도 되지만, 알아보기 편하도록 붙이는걸 추천한다.)
끝
'프로그래밍 C언어' 카테고리의 다른 글
분기문(Branch)과 조건문(Condition) (0) | 2024.08.09 |
---|---|
연산자(Operators)와 형변환(Type Casting) (0) | 2024.08.09 |
고정소수점과 부동소수점의 이해 (0) | 2024.08.08 |
변수와 자료형(Data Type) (0) | 2024.08.07 |
printf "Hello World" (1) | 2024.08.06 |