변수란 무엇인가?
컴퓨터는 많은 내용을 기억해야 한다.
정확히 말하면,컴퓨터의 ‘메모리’ 라는
부분에 전기적인 신호를 써 놓은 것이다.
컴퓨터가 무엇을 기억해야 되냐고
생각할 수 있지만···。
그렇다면 컴퓨터는 이러한
데이터들을 어떻게 기억을 할까?
바로 컴퓨터의 메모리,
즉 램(RAM)이라는 특별한 기억공간에
이를 기억공간에 이를 기록한다.
보통 우리는 흔히 램을 설명한다면
아래 처럼 표시한다.
마치, 각 방에 데이터들이 저장된다.
이 떄,
컴퓨터는 각 방에 이름을
붙이는데 단순하게 숫자로
이름 을 붙인다.
0 번, 1 번, 2 번, ··· 와 같이,
우리 대부분이
사용하는 32 비트 CPU에서는
최대 2şš개(4GB) – 총, 42억개
달하는 방을 가질 수 있게 되겠지.
참고로 32비트 숫자를 매번 쓰는게
매우 힘들다,
대개 16진법으로 주소값을 나타낸다.
예를 들어서,
컴퓨터 0x12345678
부터 0x1234567B
부분에 내가 사용한 양에
관한 정보를 저장했다고 한다.
(이 한칸에는 1 바이트, 즉 -128 부터)
(127 까지의 수 데이터를 저장할 수 있다。)
C 언어에는 변수 라는 것이 있어서,
이 모든 작업을 쉽게 할 수 있다.
예를들어, 내가 mineral 이라는
변수에 저장했다고 한다. 그렇다면
컴퓨터는 ‘알아서’
메모리의 어딘가에
mineral 의 방을
주고 그 내용을 저장한다.
예를들어, 컴퓨터가 이
mineral 이라는 변수에게
4칸의 자리를 할당
해 주었다고 한다.

이 때 나는 8을 더 추가해야한다고 본다.
만약 이전에 8을 추가한다면
2×12345678 부터 0x1234567B 까지
모든 내용을 불러와서 8을 더한 후,
다시 집어넣는 작업을 일일이
손으로 써 야 할 수 있었을 것이다.
하지만 이제는 단순히
mineral = mineral + 8
과 같이 써 주기만 한다면
mineral 에 8이 더해지는 것.
(만약 mineral = mineral +)
(8이라는 식이 이해가)
(안되지만 그양 넘어가도록 하자)
(이 처럼 간단해 진다는 것을 말하고 싶었을 뿐)
이와 같이 C 언어에서,
바뀔 수 있는 어떤 값을 보관하는 곳을
변수 라고 한다.
영어로는 Variable이라 하는데,
말 그대로 바뀔 수 있는 것들 이라는 뜻
/* 변수 알아보기 */
#include <stdio.h>
int main() {
int a;
a = 10;
printf("a 의 값은 : %d \n", a);
return 0;
}
프로젝트를 만들어 위의 내용을 적은 후,
컴파일 해보자 까먹었으며 1 장으로
되돌아 가보자. 만약 성곡적으로 하였다면
[실행 결과]
[Running] cd "d:\■■■■■_fFF■\■■■gr■■mi■■\■\" && gcc test.c -o test && "d:\■■■■■_fFF■\■■■gr■■mi■■\■\"test
a 의 값은 : 10
[Done] exited with code=0 in 0.545 seconds
와 같이 나올 것이다.
일단, 이번에도 역시
생소한 것들이 나왔기 때문에
한 문장씩 차근차근 살펴 보도독 하자.
int a;
이것은 무엇일까? 이전에 intmain
()
에서 보았던 int
가 다시 나타났다.
사실 이 문장에 뜻은 a 라는 변수를
우리가 쓰겠다고 컴파일러에게 알리는 것.
만약 이러한 문장이 없다면
우리가 x가 뭐고 y가
뭔지 알려주지도 않은 채,
친구에게 x + y가 얼마냐?
하고 물어보는 것과 똑같은 격이 되는것.
이 때, a 앞에 붙은 int
라는
것은 int
형의 데이터를
보관한다는 뜻으로,
a 에 -2147483648 에서부터
2147483647 까지의
정수를 보관 할 수 있게 된다.
따라서, 만약 중간의 문장을
와 같이 한다면 아마 a 의 값을
출력하였을 떄,
이상한 결과가 나오게 됩다.
왜냐하면 보관할 수 있는
범위를 초과하는 수를 보관했기 때문.
그럼 이제, 걱정이 생긴다.
a에 고작 10 밖에 안 넣을 거 면서, 굳이
2147483647 까지 표현할 수 있는
int 형의 변수를 왜
사용했냐고 물을 수 있습니다.
물론, int 형 보다 작은 범위의
숫자 데이터 만을 가지는
형식이 있기는 하지만 (char 등등),
일반적인 경우 정수 데이터를
보관할 때 int 형 변수를 사용한다.
또한, 2147483647 보다 큰 수를
사용하려면 어떻게 해야되냐는 의문점도
생긴다. 물론 이 보다도 훨씬 큰 숫자를
처리가능한 데이터 형식이 존재한다.
Name | Size* | Range* |
char | 1byte | signed:-128 to 127 unsigned:0 to 255 |
short int (short) |
2byte |
signed:-32768 to 32767 unsigned:0 to 65535 |
int | 4byte | signed:-2147483648 to 2147483647 unsigned:0 to 4294967295 |
long int (long) | 4byte | signed:-2147483648 to 2147483647 unsigned:0 to 4294967295 |
bool | 1byte | true or false |
float | 4byte | +/- 3.4e +/- 38 (~7 digits) |
doble | 8byte | +/- 1.7e +/- 308(~15digits) |
long doble | 8byte | +/- 1.7e +/- 308(~15digits) |
세번째 열인 Range 를 보면,
unsigned 와 signed 라고
나뉜 것이 있는데, 보통
int 라 하면 signed int 를 뜻합니다.
이는 음수와 양수
모두 표시할 수 있는 대신에
양수로 표현할 수 있는
범위가 줄어든다.
반면에 unsigned int 는 양수만을
표현할 수 있는 대신에,
양수로 표현할
수 있는 범위가
두배로 늘어난다.
또 마지막에 보면
float, double, long double
이 있는데 이들은 실수형 자료형으로
소수(0.1, 1.4123 등)을 표현 할 수 있습니다.
뿐만 아니라 double의 경우,
±2.3 ×10−308~ ±1.7 ×10308 의
수들을 표현 할 수 있습니다.
(이에 대한 정확한 설명은 후에)
a = 10;
위 문장은 무엇을 의미할까?
언뜻 보기에도 감이 오시겠지만,
변수 a 에 10을 집어넣는 다는 것.
따라서 나중에 a의 값을
출력한다면 10이 나올 것이다.
이와 같은 형태의 문장은 뒤에서
printf("a의 값은 : %d \n", a);
마지막으로,
지난번에도 보았던 printf
이다.
약간 다른것이 있다. %d가 출력
되는 부분에 써져 있다. 그런데,
프로그램을 실행시켜 보았을 때
%d 는 컴퓨터에서
출력되지 않았습니다.
그 대신, %d가 출력될 자리에 무언가
다른 것이 출력되었는데,
바로 a 의 값 입니다.
따라서, %d는 a의 값(정확히는 처음 “”
다음에 오는 첫 번째 변수)을 10진수 로
출력하라 라는 뜻이 된다.
#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;
}
프로그램을 제대로 작성했다면 아래와
같은 결과를 볼 수 있을 것이다.
[실행 결과]
[Running] cd "d:\■■■■■_fFF■\■■■gr■■mi■■\■\" && gcc test.c -o test && "d:\■■■■■_fFF■\■■■gr■■mi■■\■\"test
a 의 값은 8 진수로 177 입니다.
a 의 값은 10 진수로 127 입니다.
a 의 값은 16 진수로 7f 입니다.
[Done] exited with code=0 in 0.331 seconds
일단, 위 코드를 보고 생기는 의문점은 2가지.
% 달린게 2 개나 있는데, 이를 어떻게 해야되나와,
%d 말고도 %o 와 %x 는 무엇인가 이다.
먼저. printf의 작동원리에 대해 보도록 하자.

printf 출력시에,
큰 따옴표로 묶인 부분 뒤에 나열된 인자들(8, a)
가 순서대로 큰 따옴표 안의
% 부분으로 들어감을 알 수 있다.
따라서, 예를들면
printf(“%d %d %d %d”, a,b,c,d);와 같은
이제, %o 와 %x 는 무엇일까?
이는 인자(a)의 값을 출력하는
형식 이다, 즉 %o은
a의 값을 8진수로 출력하라는 뜻이고,
%x는 16진수로 출력하는 뜻 이다.
실수형 변수
실수형은 float 와 double이 있다.
double의 경우 int 형에 비해
덩치가 2 배나 크지만 그 만큼
엄청난 크기의 숫자를 다룰 수 있다.
그 대신, 처음 15개의 숫자들만
정확하고 나머지는 10의 지수 형태로
표현이 된다.
또한 float과 double의 장점은
소수를 표시할 수 있다는 점인데,
정수형 변수에소 소수를 넣는다면
(예를들어 int a; a = 1.234;),
소수 부분은 다 절단 된채,
나중에 a의 값을 표시해 보면 1이 나온다.
#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;
}
실행해 본다면 아래와 같이 나오게 된다.
[Running] cd "d:\■■■■■_fFF■\■■■gr■■mi■■\■\" && gcc test.c -o test && "d:\■■■■■_fFF■\■■■gr■■mi■■\■\"test
a : 3.141592
b : 3.141592
[Done] exited with code=0 in 0.434 seconds
일단, 위 코드를 보면서 의문점이 생겼다.
float a = 3.141592f;
double b = 3.141592;
왜, float 형 변수 a를 선언할
때 에는 숫자 뒤에 f를 붙였는데
double 형 에서는 f를 안 붙였다.
왜냐하면, 그양 f를 안 붙이고
float a = 3.141592로
하면 이를 double 형으로
인식하여 문제가 생길 수있다.
따라서, float 형이라는 것을
확실히 표시해 주기 위해 f를 끝에
붙이는 것입니다.
printf("a : %f \n", a);
printf("b : %f \n", b);
이게, 마지막으로 %d, %o, %x도
아닌 %f가 등장하였습니다.
만약, 여기서 a 를 %d형식
으로 출력하면 어떻게 될까?
한 번 시도를 해보자.
아마 이상한 숫자가 나오게 될 것이다.
왜냐하면, a 는 지금 정수형
변수가 아니기 때문이다. 설령,
우리가 a = 3f; b = 3; 라고 해도,
이미 a 와 b를 실수형 변수로 선언
했기 때문에 컴퓨터는
a, b를 절대 정수로 보지 않는다고한다.
따라서, 우리는 실수형 변수를
출력하는 형식인 %f를 사용해야 한다.
참로로 주의할 사항은 printf에서 %f를
이용해 수를 출력 할 때 다음
과 같이 언제나 소수점을 뒤에
붙여 주어야 한다는 점이다. 예를 들어서
printf("%f", 1);
을 하면 화면에 이상한 값
(아마도 0이 출력될 것 입니다.)
이 나오지만
printf("%f", 1.0);
을 하면 화면에 제대로 1.0 이 출력이 된다.
printf의 또 다른 형식
#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;
}
만약 위 소스를 성공적으로 작성했다면 아래와 같이 나오게 된다.
[Running] cd "d:\■■■■■_fFF■\■■■gr■■mi■■\■\" && gcc test.c -o test && "d:\■■■■■_fFF■\■■■gr■■mi■■\■\"test
a : 3.14
c : 123
b : 3.142
[Done] exited with code=0 in 0.345 seconds
printf("a : %.2f \n", a);
이번에는 %f가 아니라 %.2f 롤 약간 다르다.
그렇다면 .2 가 뜻 하는 것은
무엇일까? 대충 짐작했듯이,
무조건 소수점 이하 둘째 자리 까지만 표시하라 란
뜻이다, 위의 경우 3.141592 중 3.14
까지만 출력되고 나머지는 절단되게 된다.
여기서 ‘무조건’ 이라는 것은 %.100f 로 할 경우에도,
3.141592000000····00을 표시해서 무조건 100개를 출력하게 된다.
printf("c : %5d \n", c);
이번에는 %d가 아닌 %5d 입니다.
여기서 .5가 아님을 주의하자. 이 말은,
숫자의 자리수를 되도록 5 자리로 맞추라는 것이다.
따라서, 123을 표시할 때,
5 자리로 맞추라는 것이다.
따라서, 123을 표시할 떄, 5 자리를 맞추어야 하므로
앞에 공백을 남기고 그 뒤에 123을 표시하였다.
그런데, 123456 을 표시할 떄, %5d
조건을 준다면 어떻게 될까?
이 떄는 그양 123456 을 다시 표시한다.
앞서 .?f는 ?의 수 만큼 무조건
소수점 자리수를 맞추어야 하지만
이 경우에는 반드시 지켜야 되는 것은 아니다.
printf("b : %6.3f \n", b);
마지막으로, 위에서 썻던 두 가지
형식을 모두 한꺼번에 적용한 모습이다.
전체 자리수는 6자리로 맞추되
반드시 소수점 이하 3 째 자리 까지만 표시
한다는 뜻이다.
변수 작성하기
앞서, 보았듯이 변수를 선언하는 것은 그다지 어려운 일이 아니다.
단지, 아래의 형태로 맞추어 주기면 하면 된다.
이 때, 변수 선언시 주의해야 할 점이 있다.
만약에 여러분이 오래된
C 언어 (C89)를 사용한다면,
변수 선언시 반드시 최상단에 위치해야 한다.
하지만, 여러분이 지금 사용하고 있는
최신 버전의 C의 변수 사용하기 전
아무데나 변수를 선언해도 상관 없다.
/* 변수 선언시 주의해야 할 점 */
#include <stdio.h>
int main(){
int a;
a = 1;
printf("a는 : %d", a);
int b; // 괜찮음
return 0;
}
두 번째로, 사람의 이름을 지을 때, 여러가지를 고려하듯이 변수의
이름에서도 여러가지 조건들이 있다. 아래 예를 보도록 하자.
• 숫자가 앞에 위치하면 안된다. 그러나 중간이나 뒤는 괜찮다.
• 변수명은 오직 영어, 숫자,_로 만 구성되어 있어야 한다.
• 변수의 이름에 띄어쓰기가 있으면 안된다.
• 변수의 이름이 C 언어 예약어 이면 안된다. 보통 예약어를
쓰면 에디터에서 다른 색깔로 표시되어 예약어을 썼는지 안썼는지 알 수 있다.
자, 이제 우리는 C언어에서 중요한
부분인 변수에 대해서 알아보았다.
현재 우리는 수를 다루는 변수들만 다루었지만,
다음 은 변수에 대한 산술과
연산과, 문자를다루는 변수에 대해
공부한것을 기록 해볼려고 한다.
정 리 |
||
• 변수는 데이터를 임시로 저장하는 곳이며 자유롭게 쓰고 지울 수 있습니다. • 각 변수에는 형(type)이 있어서 해당 형에 맞는 데이터를 보관할 수 있습니다. • 변수의 형으로는 정수값을 보관하는 char, int 등이 있고, 실수값을 보관하는 float과 double이 있습니다. 각각의 형들은 지정하는 데이터의 크기가 다릅니다. • int a = 10;의 문장의 의미는 a 라는 정수형 변수를 정의한 뒤에, 해당 변수에 10 의 값을 대입한다 라는 뜻입니다. • 변수의 이름을 정하기 위해서는 여러가지 규칙이 있습니다. 이 규칙에 알맞게 변수의 이름을 정해야 되며 그렇지 않을 경우 컴파일 오류가 발생합니다. |