변수 선언 방법
변수 선언법은 데이터 종류에 맞는 자료형과 변수명과 변수명을 나란히 쓰면 됩니다.
ex)
int a;
/* int : 데이터의 종류에 맞는 자료형
a : 변수명 */
정수를 넣을 공간으로 int(integer)를 사용합니다. 정수형 변수 a를 만든 것이죠. 메모리에 정수를 저장할 공간(a)을 4바이트 할당하겠다고 컴파일러에게 알려 주는 것과 같습니다.
변수를 선언하면 메모리에 저장 공간이 생기는데 처음엔 그 안에 정체 모를 값이 들어있습니다. 이를 쓰레기값(garbage value)라고 합니다. 컴퓨터의 메모리는 재활용이 되기 때문에 어떤 값이 들어있을지는 모릅니다. 때문에 이를 사용하기 위해서는 초기화를 해줘야 합니다.
ex)
a = 10; // 변수 a를 정수 10으로 초기화
초기화 방법은 위와 같이 하면 됩니다. =은 대입 연산자로써 = 기준으로 오른쪽에 있는 값을 왼쪽(저장 공간)에 저장(할당)하는 기능을 합니다. 다음은 변수 선언과 사용해 보는 예제입니다.
#include <stdio.h>
int main(void main){
// 변수 선언
int a;
int b,c;
double d;
char e;
// 초기화 (대입)
a = 10;
b = a;
c = a + 20;
d = 3.5;
e = 'A';
printf("변수 a의 값 : %d\n", a);
printf("변수 b의 값 : %d\n", b);
printf("변수 c의 값 : %d\n", c);
printf("변수 d의 값 : %.1lf\n", d);
printf("변수 e의 값 : %c\n", e);
return 0;
}
실행 결과
변수 a의 값 : 10
변수 b의 값 : 10
변수 c의 값 : 30
변수 d의 값 : 3.5
변수 e의 값 : A
변수 선언과 대입 규칙
- 중괄호 블록 안에 변수를 선언하며 선언한 위치부터 블록 끝까지 사용할 수 있다.
- 위 코드에서 변수 a~e는 선언한 부분 부터 main함수가 끝나는 곳( } )까지 사용할 수 있습니다. - 변수의 자료형이 같으면 동시에 둘 이상의 변수를 선언할 수 있다.
- int b, c; 처럼 선언할 수 있습니다. - 대입 연산자는 연산자 왼쪽의 변수에 오른쪽의 값을 저장한다.
- 변수는 대입 연산자 왼쪽에서는 저장 공간이 되고, 오른쪽에서는 값이 된다.
- a = b; 에서 a는 저장 공간이 되고, b는 값이 됩니다. (= a에 b의 값을 대입)
변수는 그 형태(자료형, 데이터형(data type))에 따라 크게 정수형과 실수형으로 구분됩니다.
정수 자료형
같은 정수형이라도 메모리 저장 공간의 크기에 따라 char, short, int, long, long long으로 구분됩니다.
각 자료형은 다음 공식에 따른 범위의 값을 저장할 수 있습니다.
어떤 자료형을 사용할 지 고민이 된다면 다음 방법을 따르면 됩니다.
자료형 고르는 방법
- 특별한 경우가 아니면 정수형은 int를 사용합니다.
- int형은 연산의 기본 단위로 연산 과정에서 int형으로 변환되므로 int형을 사용했을 시, 변환 과정을 생략할 수 있어 가장 빠르게 연산이 됩니다. - long형은 큰 값을 저장할 때 사용합니다.
- 간혹 int형을 2바이트로 할당하는 컴파일러가 존재합니다. 이때 큰 값을 저장하기 위해 long형을 사용합니다. int형과 long형의 크기를 동일하게 인식하면 long형을 쓸 필요가 없습니다.
unsigned 정수 자료형
정수형은 보통 양수와 음수를 모두 저장하지만 양수만 저장하면 두 배 더 넓은 범위의 값을 저장할 수 있습니다. 따라서 나이와 같이 음수가 없는 데이터를 저장할 때는 unsigned를 사용합니다. 사용법은 간단합니다. 자료형 앞에 unsigned를 붙이면 됩니다.
#include <stdio.h>
int main(void){
unsigned int a;
a = 4294967295;
printf("%u\n", a); // %u : 부호없는 10진수로 출력하는 변환 문자
printf("%d\n", a);
a = -1;
printf("%d\n", a);
printf("%u\n", a);
return 0;
}
실행 결과
4294967295
-1
-1
4294967295
unsigned 변수 선언법은 위 코드와 같습니다. 또한 변환 문자에 의해 출력이 달라지는 것도 볼 수 있으실 겁니다. 이는 메모리에 저장되는 형태는 같지만 printf 함수가 데이터를 해석해서 보여주는 방법이 다르기 때문입니다.
%u를 사용하면 부호비트는 고려하지 않기 때문에(음수 개념이 없어지므로) 모든 비트를 10진수로 바꿔 4294967295를 출력합니다.
실수 자료형
실수는 데이터를 구현하는 방법이 정수와 다르므로 이를 표현할 때는 별도의 자료형을 사용합니다.
실수 자료형의 졍우 값의 범위보다 유효 숫자의 개수에 주목해야 합니다. 예제를 통해 알아보겠습니다.
#include <stdio.h>
int main(void){
float ft = 1.234567890123456789;
double db = 1.234567890123456789;
printf("float형 변수의 값 : %.20f\n", ft);
printf("double형 변수의 값 : %.20lf\n", db);
return 0;
}
실행 결과
float형 변수의 값 : 1.23456788063049316406
double형 변수의 값 : 1.23456789012345669043
실행 결과 값이 이상하죠? 출력한 값이 초깃값과 다릅니다. float형 변수의 값은 아홉 번째부터, double형 변수는 열일곱 번째부터 달라졌습니다. 유효 숫자의 개수로 인해 생기는 현상입니다. 때문에 float형 변수는 7자리, double형 변수는 15자리 범위 내의 값을 가용하는 것이 좋습니다.
그래서 정수형을 기본으로 사용하고 꼭 필요한 경우에만 실수형을 사용하는 것이 좋고, 실수형은 유효 숫자가 많은 double형을 기본으로 사용하는 것이 좋습니다.
문자열 저장
문자열은 char형을 배열 형태로 만들어 거기에 문자열을 저장합니다.
ex)
#include <stdio.h>
int main(void){
// char 배열명[문자열길이+1] = 문자열;
char school[6] = "Seoul";
printf("Univ : %s\n", school);
printf("Univ : %s %s\n", school, "Univ");
return 0;
}
실행 결과
Univ : Seoul
Univ : Seoul school
이때 배열의 크기가 문자열 길이+1되는 것은 컴파일러가 문자열 끝에 \0(널문자 Null character)를 자동으로 추가하기 때문입니다. 그보다 커도 되는데 문자열 끝에는 항상 널 문자가 있으므로 printf 함수는 널 문자 이전까지 저장된 문자열만 출력합니다.
배열에는 대입 연산자를 사용할 수 없습니다. 배열명은 주소 상수이므로 대입 연산자 왼쪽에 쓸 수 없습니다. 또한 대입 연산은 자료형의 크기가 일정해야 수행할 수 있는데 선언에 따라 크기가 달라지는 char 배열을 사용하면 대입 연산을 할 수 없습니다.
const를 사용한 변수
앞서 변수는 저장 공간이므로 언제든지 그 값을 바꿀 수 있다고 했습니다. 그러나 const를 사용하면 초기화된 값을 바꿀 수 없습니다.
const는 unsigned 처럼 자료형 앞에 붙여서 사용합니다.
const double tax_rate = 0.12;
const를 사용하면 이후에는 값을 바꿀 수 없으므로 반드시 선언과 동시에 초기화해야 합니다.
tax_rate = 0.13; // 불가
예약어와 식별자
예약어(reserved word, key word)는 컴파일러와 사용 방법이 약속된 단어이며, 식별자(identifier)는 필요에 따라 만들어 사용하는 단어입니다.
int age;
// int : 예약어
// age : 식별자
자료형 int는 정수를 저장할 메모리 공간을 확보하도록 지시하는 약속된 단어이므로 단어를 마음대로 바꿀 수 없지만, 변수명 age는 확보한 저장 공간에 이름을 붙이는 것이므로 원하는 단어를 사용해 만들 수 있습니다.
식별자는 중복되지만 않으면 어떤 것이든 사용할 수 있습니다만 다음 규칙을 지켜야 합니다.
- 알파벳 대문자, 소문자, 숫자, _ 로 만든다.
- 숫자로 시작할 수 없다.
- 대문자와 소문자는 서로 다른 식별자로 인식한다.
- 예약어는 식별자로 사용할 수 없다.
예약어 종류