컴퓨터는 수많은 내용을 기억을 해야한다.
게임에서 돈을 벌어서 좋은 장비를 사야하는데 만약 컴퓨터가 내가 돈을 얼마나 가지고 있는지 기억을 못해
가지고 있는 돈이 0원이였다가 100만원 이였다가 6만원이였다가 계속 바뀌면 게임을 진행하기 힘들 것이다.
그렇기 때문에 컴퓨터는 이러한 내용들을 어딘가에 저장해 놓아서 기억해야 한다.
이 때 컴퓨터는 램(RAN) 이라는 특별한 기억장치에 기록한다.
램은 앞서 호텔방이라는 예시를 들었듯이 방으로 이루어져 있다고 생각하면 된다. 그리고 각 방의 번호가 있듯이
16진수로 된 주소값이 있다. 그리고 그 방에 데이터가 들어 있는 것이다.
0x12345678 부터 0x1234567B 부분에 내 캐릭터가 가지고 있는 돈의 정보가 저장되어 있다고 보자
그런데 만약 내가 돈을 얼마나 가지고 있는지 확인하려고 할 때마다 이러한 복잡한 16진수의 주소값을
작성해야 한다면 상당히 힘들어질 것이다.
하지만 다행히 C언어에서는 변수라는 것이 있다.
예를 들어서 내 캐릭터가 가지고 있는 돈을 money
라는 변수에 저장하였다고 하자.
그렇다면 컴퓨터는 알아서 메모리 어디에 money 의 방을 내어주고 저장을 한다.
예를 들어서 컴퓨터가 위 그림 처럼 0x12345678 부터 0x1234567B 부분에 4칸의 방에 money라는 변수를 저장했다고 하자.
이때 내 캐릭터가 몬스터를 잡아서 1000원을 얻어서 가지고 있는 골드에 1000원을 추가한다고 해보자
만약 이전에 이러한 일들을 해야한다면 0x12345678 부터 0x1234567B 까지의 정보를 불러와서 1000원을 추가한 다음에 다시 0x12345678 부터 0x1234567B 에 넣는 작업업을 일일이 해야한다.
하지만 이제 단순히 money = money + 1000 을 해주기만 하면 money에 1000원이 더해진다.
이와 같이 C언어에서는 변할 수 있는 어떠한 값을 저장한 곳을 변수라고 한다.
영어로는 Variable 말 그대로 변할 수 있는 값이다.
#include <stdio.h>
int main() {
int a;
a = 10;
printf("a 의 값은 : %d \n", a);
return 0;
}
>>> a 의 값은 : 10
하나씩 살펴 보겠다.
int a;
이 부분은 정수 a 를 변수로 설정하겠다고 컴파일러에게 알리는 것이다.
int
를 사용함으로서 a
가 정수라는 것을 말해주고 a
에 2147483648 에서 부터 2147483647 까지의 정수를 보관 할 수 있게 된다.(대략 20억)
여기서 의문점이 생긴다. 그렇다면 저 범위를 넘어가는 숫자는 어떻게 변수를 지정하지?? 정답은
int
말고 다른 여러가지 타입이 있다. 아래의 표를 참고하자
사실 char
float
double
말고는 타입의 크기가 정해져 있지 않다.
int
의 경우 C언어 표준에서는 최소 2바이트 인 타입이라고 써 있는데 대부분의 시스템에서 4바이트로 구연되어 있다.
그리고 signed int
와 unsigned int
가 있는데 보통 int
라고 하면 signed int
를 말한다.
이는 양수와 음수로 표현할 수 있는 대신 양수로 표현할 수 있는 범위가 반으로 줄어든 것이다.
printf("a 의 값은 : %d \n", a);
여기서 확인할 것은 %d
이다.
분명히 따음표 안에 %d
가 있지만 %d
출력되지 않고 그 자리에 변수 a 가 들어갔다.
%d
는 변수 a의 값, 정확히 말하면 처음 "" 다음에 오는 첫번째 변수를 출력하라는 의미이다.
또 다른 예제를 하나 더 보자.
#include <stdio.h>
int main() {
int a;
a = 127;
printf("a 의 값은 %d 진수로 %o 입니다. \n", 8, a);
printf("a 의 값은 %d 진수로 %d 입니다. \n", 10, a);
printf("a 의 값은 %d 진수로 %x 입니다. \n", 16, a);
return 0;
}
>>>a 의 값은 8 진수로 177 입니다.
>>>a 의 값은 10 진수로 127 입니다.
>>>a 의 값은 16 진수로 7f 입니다.
이번에는 또 새로운 것들이 보인다. %d
말고도 %o
%x
가 생겼다.
이것들을 살펴보기 전에 먼저 printf문을 보자.
위 그림과 같이 "" 뒤에 오는 8과 a가 순서대로 %d
%o
에 들어간다는 규칙을 볼 수 있다.
그렇다면 %d
%o
%x
는 무엇을 의미할까??
이것들은 인자(a
) 를 출력하는 형식이다.
#include <stdio.h>
int main() {
float a = 3.141592f;
double b = 3.141592;
printf("a : %f \n", a);
printf("b : %f \n", b);
return 0;
}
a : 3.141592
b : 3.141592
float
변수 뒤에 f
를 붙인 이유는 만약 f
를 안붙이면 double
형으로 인식하기 때문이다. 그래서 뒤에
f
를 붙임으로서 float
형 이라고 확실히 표현주는 것이다.
#include <stdio.h>
int main() {
float a = 3.141592f;
double b = 3.141592;
int c = 123;
printf("a : %.2f \n", a);
printf("c : %5d \n", c);
printf("b : %6.3f \n", b);
return 0;
}
a : 3.14
c : 123
b : 3.142
이번에도 새로운 것들이 조금 보인다.
하나하나 살펴보겠다.
printf("a : %.2f \n", a);
.2f
가 무슨 의미인지는 위에 결과를 보면 짐작할 수 있듯 무조건 소수점 아래 2째 자리까지 나타내라는 의미이다.
무조건의 의미는 .100f
는 3.141592000000....00
을 표시해서 무조건 100자리까지 나타내라는 뜻이다.
printf("c : %5d \n", c);
%5d
는 되도록 5자리를 표시하라는 의미이고 123 앞에 공백을 남기고 5자리를 나타냈다. 123
그렇다면 만약 123456 에 %5d
을 하면 어떻게 될까? 이때는 그냥 123456 다 표시한다.
앞서 .2f
와 다르게 %5d
는 반드시 지켜야 하는 것이 아니다.
printf("b : %6.3f \n", b);
%6.3f
는 전체자리수를 6자리로 맞추는데 소수점은 3자리까지 표시하라는 의미이다.
C언어에서 변수의 이름을 정할 때 몇가지 규칙이 있다.
_
만 가능하다그리고 또한 C언어는 영어의 대소문자를 구분합니다.
따라서 Variable
과 vAriable
는 서로 다른 변수 명입니다.
변수를 작성하다보면 귀찮아서 그냥 a, b ,c 와 같은 간단한 문자로 변수를 지정하는 경우도 있다.
하지만 이런 경우 변수가 무엇을 뜻하는지 정확히 알 수 없어 혼란이 올 수 있다.
그렇기 때문에 변수 명은 최대한 무슨 데이터가 보관 되어 있는지 알 수 있는 변수명으로 하는 것이 좋다.
예를 들어서 student_num
, total_score
등 변수의 이름을 가지고 어떤 데이터가 보관 되어 있는지
알 수 있는 변수명이 좋다.
또한 변수명을 설정할 때 두가지 스타일이 있는데 하나는 띄어쓰기를 _
로 하는 방식, 다른 하나는
띄어쓰기를 대문자로 구분하는 방식이다.
this_is_some_variable
과 ThisIsSomeVariable
이 그 예시이다.
후자는 마치 낙타 등 같다고 하여 Camel case 라고 한다.
두가지 방식 모두 많이 사용하고 있다. 하지만 두가지중 어떠한 것을 사용할지 결정했다면
그 방식을 유지하는게 좋다. 어떨때는 Camle case 를 사용하고 어떨때는 _
를 사용하면 코드를
읽는 사람의 입장에서 혼란이 온다. 따라서 한가지의 방식을 고수하는게 좋은 방식이다.