-
3장. 타입에 대하여C++ 기본 문법 알아보기 2019. 1. 3. 12:30
타입(자료형)이란?
변수에는 모두 타입(자료형)이 있다.
그렇다면 과연 타입이 무엇일까?
저번 글에서도 말했듯이 변수란 자료를 담는 그릇이다.
그렇다면 자료가 숫자인지 문자인지와 같이 자료의 종류에 따라서 그릇의 종류도 달라져야 할 것이다.
아래의 코드를 보자
int a;
a라는 변수를 선언하고 있는 문장이다.
그렇다면 a 앞에 있는 int가 무엇일까?
여기서 int가 바로 변수 a의 자료형이 되는 것이다.
int는 integer의 준말로 정수를 담을 수 있음을 의미하는 자료형이다.
숫자를 담는 자료형에도 아주 많은 종류가 있는데 아래의 코드를 보자.
int main()
{
// 변수 선언
short int si;
unsigned short int usi;
int i;
unsigned int ui;
long int li;
unsigned long ul;
// 작은 값 대입
si = 40000; // Error : 2바이트인 short int에게는 너무 큰 값
usi = 40000; // unsigned 타입이기 때문에 들어감
i = 40000;
ui = 40000;
li = 40000;
ul = 40000;
// 조금 더 큰 값 대입
si = 70000; // Error : 너무 큰 값
usi = 70000; // Error : unsigned short int 에게도 너무 큰 값
i = 70000;
ui = 70000;
li = 70000;
ul = 70000;
// 더 큰 값 대입
si = 2200000000; // Error : 너무 큰 값
usi = 2200000000; // Error : 너무 큰 값
i = 2200000000; // Error : int의 양수 범위는 2^31 - 1까지이기 때문에 너무 큰 값
li = 2200000000; // Error : int와 동일
ui = 2200000000;
ul = 2200000000;
// 어디까지 가능할까?
ui = 4300000000; // Error : unsigned int 의 범위는 양수로 2^32 - 1까지이기 때문에 너무 큰 값
ul = 4300000000; // Error : unsigned int와 동일
// 음수 대입
si = -100;
usi = -100; // Error : unsigned는 음수 보관 불가능
i = -100;
ui = -100; // Error : unsigned는 음수 보관 불가능
li = -100;
ul = -100; // Error : unsigned는 음수 보관 불가능
return 0;
}
주석에 Error가 있는 부분은 실행 시 모두 경고가 뜨거나 오버플로우 혹은 언더플로우의 값이 나올 것이다.
컴퓨터는 메모리 상에서 자료형에 따라 변수의 크기만큼 공간을 확보해 놓는다.
하지만 담을 수 있는 값보다 더 작거나 더 큰 값을 넣게되면 더 큰 값일 경우에는 가장 작은 값부터, 더 작은 값일 경우에는 가장 큰 값부터 다시 시작되게 된다.
이것이 언더플로우와 오버플로우다.
각 자료형의 크기는 컴퓨터의 시스템에 따라 다를 수 있다.
그렇다면 변수의 크기를 출력해보자!
다음 코드를 따라 쳐보자.
#include <iostream>
using namespace std;
int main()
{
cout << "short int : " << sizeof(short int) << " bytes\n";
cout << "unsigned short int : " << sizeof(unsigned short int) << " bytes\n";
cout << "int : " << sizeof(int) << " bytes\n";
cout << "unsigned int : " << sizeof(unsigned int) << " bytes\n";
cout << "long int : " << sizeof(long int) << " bytes\n";
cout << "unsigned long int : " << sizeof(unsigned long int) << " bytes\n";return 0;}몇 바이트인지 잘 나오는 것을 볼 수 있다.
signed? unsigned?
자 이제 signed와 unsigned에 대해 조금 더 자세히 알아보자.
비교적 크기가 작은 unsigned short int와 short int로 비교를 해보자.
unsigned short int는 2바이트의 크기이므로 2^16, 즉 65536개의 상태를 가질 수 있다.
그렇다면 과연 unsigned short int는 65536까지 표현할 수 있을까?
아니다. 첫번째 상태는 모든 비트가 0일 때, 즉 0부터 시작이기 때문에 0~2^16 - 1이 되는 것이다.
자 그렇다면 short int는 어떨까?
정확히 말하면 signed short int인데 똑같이 2바이트이므로 65536개의 상태를 가질 수 있다.
하지만 short int는 음수의 값도 표현해야 하기 때문에 음수와 양수가 각각 32768만큼의 상태를 나눠 갖는다.
음수는 -32768~-1까지, 양수는 0부터 시작이므로 0~32767까지 표현 가능하다.
꼭 short int가 아니더라도 unsigned - int의 경우는 같은 원리로 동작한다.
실수 자료형
정수 자료형을 알아봤으니 실수 자료형도 알아보자.
실수의 자료형을 보통 부동 소수점 타입이라고 말한다.
여기서 부동은 "움직이지 않는다"가 아니라 소수점이 이리저리 옮겨다닐 수 있다는 뜻이다.
백문이 불여일견이다. 바로 코드를 보자!
int main()
{
// 실수 자료형의 변수 선언
float f;
double d;
long double ld;
// 실수 대입 1
f = 0.00123f;
d = 1.23;
ld = 123.0;
// 실수 대입 2
f = 1.23E-3f;
d = 1.23E0;
ld = 1.23E2;
return 0;
}
여기서 의문점이 하나 생길 것이다.
왜 float의 경우에만 값 뒤에 f를 붙여줄까?
그 이유는 실수 뒤에 f가 붙어 있지 않으면 double 타입의 실수라고 생각하기 때문에 정확하게 해주기 위해 f를 붙이는 것이다.
자 이제 1.23E-3과 같은 실수의 표기법을 알아보자.
E와 뒤에 나오는 수는 10의 몇 제곱인지를 나타낸다.
1.23E0 = 1.23 * 10^0 = 1.23, 1.23E2 = 1.23 * 10 ^ 2 = 123.0
이런 식으로 식을 줄여 표현할 수 있다.
문자 자료형
숫자는 대충 이해가 끝났으니 이제 문자 표현 방법에 대해 알아보자.
char과 wchar_t는 문자를 보관하는데 사용하는 자료형이다.
wchar_t는 char과 다르게 세계 각국의 문자와 기호들을 표현할 수 있다.
실제 프로그래밍 시에는 char을 주로 사용하고 wchar_t는 특별한 상황에서만 사용할 것이다.
char 자료형의 예제를 보자.
#include <iostream>
using namespace std;
int main()
{
char a;
char b;
char c;
a = 'G';
b = 'O';
c = 'D';
cout << a << b << c << "\n";
return 0;
}
잘 출력이 되는 것을 확인할 수 있다.
ASCII 코드를 통한 표현
변수의 자료형에 따라서 문자가 들어가거나 숫자가 들어가는 것을 볼 수 있었다.
하지만 컴퓨터의 내부에서는 결국 다 2진수의 숫자로 저장이 된다.
ASCII라는 문자와 숫자를 대응시켜 놓은 약속이 있다.
문자로 숫자를, 숫자로 문자를 표현해보자.
#include <iostream>
using namespace std;
int main()
{
int a = 'A';
cout << a << "\n";
char b = 97;
cout << b << "\n";
return 0;
}
대문자 A의 아스키 코드는 65, 소문자 a의 아스키 코드는 97이란 것을 알 수 있다.
진수 표현법
이제 문자 표현법도 알아보았으니 진수 표현법을 알아보자.
지금까지 프로그램을 작성하면서 10진수만 사용했었다.
하지만 필요에 따라 8진수와 16진수도 사용할 수 있다.
예제를 보자!
#include <iostream>
using namespace std;
int main()
{
int decimal = 41;
int octal = 041;
int hexadecimal = 0x41;
cout << "41 = " << decimal << "\n";
cout << "041 = " << octal << "\n";
cout << "0x41 = " << hexadecimal << "\n";
return 0;
}
8진수는 앞에 0, 16진수는 앞에 0x를 붙여주면 된다. (영문자 O가 아니다!)
이스케이프 문자열이란?
코드를 보면 "\n" 이 문자열이 계속 등장한다.
개행을 해주는 문자열이란 것은 알고 있지만 그 이상은 알지 못할 것이다.
역슬래쉬로 시작하는 이 문자열들을 "이스케이프 문자열"이라고 한다.
다양한 종류가 있다.
특수문자
아스키 코드 상에서의 표현
C++에서의 표현
개행문자
NL(LF)
\n
수평탭
HT
\t
수직탭
VT
\v
백스페이스
BS
\b
캐리지 리턴
CR
\r
폼 필드
FF
\f
벨소리
BEL
\a
역슬래쉬
\
\\
물음표
?
\?
작은 따옴표
'
\'
큰 따옴표
"
\"
8진수
ooo
\ooo
16진수
hhh
\xhhh
예제를 보고 활용하는 법을 보자!
#include <iostream>
using namespace std;
int main()
{
// Hi, Bori!를 치려다 잘못 작성
cout << "Hi, Boah!";
// 백스페이스로 뒤에 두 글자를 지운다.
cout << "\b\b\b";
// 정정
cout << "ri!\n";
return 0;
}
정정되어 나오는 것을 볼 수있다.
True? False?
마지막으로 Bool 타입에 대해 알아보자.
Bool 자료형은 true 혹은 false의 값만 가질 수 있다.
true는 1의 값, false는 0의 값을 나타낸다.
아직은 쓸 일이 없지만 나중에 나오는 제어문과 반복문에서 유용하게 쓸 것이다!
우선 bool 타입의 변수 출력만 해보자.
#include <iostream>
using namespace std;
int main()
{
bool b1;
bool b2;
b1 = true;
b2 = false;
cout << "b1 = " << b1 << "\n";
cout << "b2 = " << b2 << "\n";
return 0;
}
true가 1, false가 0이라는 값을 출력한다!
다음 시간에는 형변환에 대해 알아보자.
'C++ 기본 문법 알아보기' 카테고리의 다른 글
5-2장. 비트 단위 연산자와 연산자 마무리 (0) 2019.01.08 5-1장. 기본적인 연산자 (0) 2019.01.07 4장. 형변환이란? (0) 2019.01.06 2장. 변수 - 정보를 담는 그릇 (0) 2019.01.02 1장. c++ 프로그램의 간단한 구조 알아보기 (0) 2019.01.02