03. 자료형과 변수
자료형이란?
컴퓨터는 0과 1로만 자료를 저장합니다.
0과 1을 각각 비트라고 하고, 8개의 0과 1을 묶어 바이트라고 합니다.
1바이트로 표현할 수 있는 경우의 수는 입니다.
그런데 우리가 저장하고 싶은 수가 어느정도 큰지, 어떤 형태의 자료인지에 따라 필요한 공간이 다르겠지요.
정수와 실수
컴퓨터는 기본적으로 자료가 어떤 형태이든 간에 숫자로 저장합니다.
이때 수를 크게 정수와 실수로 구분하는데 그 이유는 나타내는 방법이 다르기 때문입니다.
정수는 그냥 이진법으로 표현하면 됩니다. 하지만 실수는 소숫점 이하를 어떻게 표현해야 할 지 난감하기만 합니다.
고등학교 과정에서 지표와 가수를 배우면서 유효슛자와 E표기법에 대해서 간단히 배울텐데 컴퓨터는 이러한 방식으로 수를 저장합니다.
즉 형태에서 와 을 저장하면 되는 것이지요.
자료형의 종류
정수를 나타내는 char, int, long 등이 있고 실수를 나타내는 float, double등이 있습니다.
이때 char은 한 문자를 나타내는 자료형으로도 사용되는데 아스키코드를 사용합니다.
변수
수학에서 사용하는 변수와 같은 개념이지만 자료형이 정해져있고 같은 자료형끼리 연산한다는 것만 다릅니다.
1) 정수
정수의 표현 방법
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|
MSB |
1바이트로 정수를 저장하는 경우를 생각해봅시다.
먼저 맨 앞에 MSB는 Most Significant Bit의 약자로 부호를 나타냅니다.
부호가 바뀌면 수가 완전히 바뀌기 때문에 가장 중요한 비트라고 부르는데 맨 뒷자리의 경우 바뀐다고 해도 1밖에 차이가 나지 않기 때문에 LSB(Least Significant Bit)라고 합니다.
MSB 뒤에 있는 7자리는 양수인 경우 일반적인 이진법과 같습니다.
정수의 계산 방법
8자리를 계속해서 적기엔 보는 사람도 쓰는 사람도 불편하니 4비트 크기의 자료형을 가정해봅시다.
0110은 6을 나타내고 1110은 -6을 나타내니까 더하면 0이 되어야겠지요.
두 이진수를 더해보면 10100이 되는데 4자리를 넘어가면 앞부분을 버림하므로 0100이 됩니다.
6과 -6을 더하면 4가 될리가 없으니 우리의 계산법에 무언가 문제가 있음을 알 수 있습니다.
게다가 이런 표기 방식은 0을 0000과 1000의 두가지로 표현할 수 있으니 혼란이 올 수도 있습니다.
이러한 문제를 해결하기 위해 정수를 계산할 때 수학적 기교를 사용하는데 그것이 바로 보수 개념입니다.
1의 보수와 2의 보수
어떤 정수의 음수를 표현하는 방법을 알아봅시다.
0110의 음수 표현을 예로 들어 보겠습니다. 0110의 각 자리의 0과 1을 반대로 바꾸어 줍니다.
0은 1로, 1은 0으로 바꿉니다. 이것을 1의 보수라 합니다.
그럼 1001이 됩니다. 그 다음 1을 더해줍니다. 이것을 2의 보수라 합니다.
그럼 1010이 됩니다. 실제로 0110과 1010을 더하면 10000이고 앞자리를 버리면 0000이 되는 것을 볼 수 있습니다.
1의 보수는 0과 1을 바꾸었기 때문에 원래 수와 더하면 항상 1111이 될 것입니다.
여기에 1을 더해서 10000을 만드는 수학적 기교를 사용하는 것입니다.
정수 자료형
자료형 | 크기 | 범위 |
---|---|---|
char | 1byte | -128 ~ 127 |
short | 2byte | -32768 ~ 32767 |
int | 4byte | -2147483648 ~ 2147483647 |
long | 4byte | -2147483648 ~ 2147483647 |
1바이트는 가지의 수를, 2바이트는 가지의 수를 나타내는 것을 볼 수 있고 0을 표현하기 위해 양수 자리가 하나 적다는 것을 알 수 있습니다.
2) 논리형
bool
자료형은
int
와 같이 정수를 저장하는 자료형과 float
과 같이 실수를 저장하는 자료형도 있지만
논리를 저장하는 자료형도 있는데 그것이
bool
입니다.bool
에는 true(참) 또는 false(거짓)만 저장할 수 있으며 참은 1, 거짓은 0으로 저장합니다.사용하는 경우
주로 ~하는 중인지, ~했었는지, ~를 사용중인지 처럼 참 또는 거짓으로 표현되는 상태를 저장하기 위해 사용하는 경우가 많습니다.
때문에 변수 이름을
isAlive
, isMeet
, isVisible
처럼 앞에 is를 붙이기도 합니다.예외
기본적으로 1과 0으로 참과 거짓을 나타내는데 만약 다른 값을 입력하면 어떻게 될까요?
우선, 당연히 0을 대입하면 false가 저장되며 1을 대입하면 true가 저장됩니다.
신기한점은, 0이 아닌 어떤 값을 대입하더라도 true가 된다는 것입니다.
만약
bool isOk = 3;
이라고 저장하면 isOk
의 값은 true가 됩니다.3) 변수와 연산
변수 선언
int number;
는 number이라는 int형 변수를 만듭니다.
이렇게 변수를 처음 만드는 것을 선언이라고 합니다.
모든 변수는 선언되어야 사용할 수 있고 이렇게 선언하면 number은 반드시 int형으로만 사용됩니다.
선언하는 방법은
자료형 변수이름;
형태이며 이때 변수 이름에 몇 가지 규칙이 있습니다.변수 이름 규칙
1. 변수의 이름은 알파벳, 숫자, 언더바(_)로만 구성해야 합니다.
2. 대소문자를 구분합니다. (number과 Number은 다른 변수입니다.)
3. 변수 이름의 첫글자는 숫자로 시작할 수 없습니다.
4. 변수 이름에 공백을 포함할 수 없습니다.
5. 예약어(키워드)를 사용할 수 없습니다. (int, main 등)
따라서 다음과 같은 변수 이름은 모두 잘못된 것입니다.
no-game
1number
int
student name
person`s age
하지만 다음과 같은 변수 이름은 가능합니다.
no_game
_number
integer
student_name
persons_age
변수 초기화
int number;
와 같이 변수를 선언만 하면 변수에 어떤 값이 들어있는지 알 수 없는데, 이때 들어있는 아무 값을 쓰레기값이라고 부릅니다.
이런 경우 종종 문제가 되기 때문에 선언과 함께 초기화를 해줍니다.
int number = 0;
이는 사실 변수를 선언하고 값을 대입하는 다음의 두 과정을 합쳐놓은 것과 같습니다.
int number;
number = 0;
연산
변수끼리 더하거나 빼는 등 다양한 연산을 하게 되는데 주로 다음과 같은 연산자들을 사용합니다.
연산자 | 기능 |
---|---|
= | 오른쪽의 값을 왼쪽에 대입 |
+ | 왼쪽과 오른쪽의 합 |
- | 왼쪽에서 오른쪽을 뺌 |
* | 왼쪽과 오른쪽의 곱 |
/ | 왼쪽을 오른쪽으로 나눈 몫 |
% | 왼쪽을 오른쪽으로 나눈 나머지 |
눈여겨 볼 점은 '=' 또한 연산자라는 점과 '/'가 몫을 나타낸다는 것입니다.
따라서 3/2는 1.5가 아니라 1로 출력됩니다.
소숫점 이하를 버림하는 연산으로 주의해야 하는 부분입니다.
%는 나머지를 구하는데 만약 변수 A가 짝수인지 홀수인지 알아보고 싶다면 A%2가 0인지 1인지를 살펴보면 됩니다.
수학시간에 배우는 모듈러 연산을 생각하면 쉽게 이해할 수 있습니다.
이때 '/'와 '%'은 정수의 연산을 말하는 것인데 실수의 경우 '/'는 일반적인 나눗셈을 수행합니다.
즉 1.2/2는 0.6이 됩니다.
다른 자료형간의 연산
서로 다른 자료형을 연산하는 것은 원칙적으로 불가능합니다.
하지만 3 + 1.2와 같은 연산은 3을 실수로 보면 충분히 연산이 가능하기 때문에 C언어는 이러한 경우들을 연산하는 과정에서 형을 바꾸어 처리합니다.
그러나 이는 종종 원치않는 결과를 내기 때문에 가급적 자료형을 밝혀서 적어야 하는데 그 방법은 다음과 같습니다.
1 (int형)
1.0 (double형)
1.0f (float형)
또는 캐스트 연산자라고해서 괄호안에 자료형을 적어서 자료형을 명시적으로 밝힐 수도 있습니다.
(int) 1.0
(float) 2
(double) 3
기본적으로 크기가 작은 자료형과 큰 자료형을 연산하면 큰 자료형으로 바뀌게 됩니다.
연산 | 결과 |
---|---|
int + float | float |
int / float | float |
int * float | float |
댓글 없음:
댓글 쓰기