대부분의 프로그램은 정보를 저장한다. 컴퓨터에 정보를 저장하려면, 다음과 같은 세 가지를 알아야한다.
- 어디에 저장되는가?
- 어떤 값이 저장되는가?
- 어떤 종류의 정보인가?
프로그래밍에선 다음과 같은 구문을 사용했다.
int braincount;
braincount = 5;
위 코드는 braincount라는 이름의 변수가 정수형이며, 5의 값을 갖고 있다. 라는 의미이다. 하지만 이 구문갖고 braincount라는 변수가 메모리의 어디에 저장되는지 알 수 없다. 이때 & 연산자를 사용하면 braincount의 메모리 주소를 알아낼 수 있다.
변수 이름
C++에서 변수 이름을 지을 때에는 다음과 같은 규칙을 따라야한다.
- 변수 이름에는 영문자, 숫자, 밑줄(_) 문자만을 사용할 수 있다.
- 숫자를 변수 이름의 첫 문자로 사용할 수 없다.
- 변수 이름에서 대문자와 소문자는 구별된다.
- C++의 키워드는 변수 이름으로 사용할 수 없다.
- 두 개의 밑줄 문자로 시작하는 이름이나, 밑줄 문자와 대문자로 시작하는 이름은, 컴파일러와 리소스가 사용하기로 예약되어 있다. 하나의 밑줄 문자로 시작하는 이름은, 컴파일러와 리소스가 전역 식별자(global identifier)로 사용하기로 예약되어 있다.
- 변수 이름의 길이는 제한이 없으며, 변수 이름에 쓰인 모든 문자들이 유효하다. 그러나, 어떤 플랫폼의 고유의 길이 제한이 있다.
정수형
정수는 2, 98,-5286, 0과 같이 소수부가 없는 수를 말한다. 그런데 컴퓨터의 메모리 용량에는 한계가 있으므로 무한하게 많은 정수를 나타낼 수는 없다. C++의 정수형은 여러 가지 정수형을 제공한다. 각 정수형은 크기와 범위가 다르다. char, short, int, long, long long 순으로 크기가 크다.
short, int, long ,long long 정수형
컴퓨터의 메모리는 비트(bit)라는 단위로 이루어진다. 각 정수형은 사용하는 비트수가 다르고, 서로 다른 정수 범위를 나타낼 수 있다. 모든 C++에서 동일한 데이터형이 동일한 폭을 갖는다면 매우 편리할 것이다. 그러나 동일하지 않다는 문제점을 갖고 있다. 그래서 C++는 이 데이터형들의 최소 크기만을 정하여 융통성 있는 표준을 제공한다.
- short형은 최소한 16bit 폭을 가진다.
- int형은 최소한 short만큼은 크다.
- long형은 최소한 32bit 폭을 가지며, 최소한 int만큼은 크다.
- long long형은 최소한 64bit 폭을 가지며, 최소한 long만큼은 크다.
자료형 앞에 unsinged를 붙이면 양의 정수만 사용이 가능하고, 범위가 늘어난다. 일반 정수형의 음수 부분의 크기를 양수 부분으로 옮긴 것이다. 좀 더 넓은 정수가 필요할 때 사용한다. 다음 표는 Windows 10의 64비트 환경에서 데이터형의 크기와 범위이다.
자료형 | 크기 | 범위 |
(signed) short (int) | 2 byte (16bit) | -32,768 ~ 32,767 (약 3만 2천) |
unsigned short (int) | 2 byte (16bit) | 0 ~ 65,535 (약 6만 5천) |
(signed) int | 4 byte (32bit) | -2,147,483,648 ~ 2,147,483,647 (약 21억) |
unsigned int | 4 byte (32bit) | 0 ~ 4,294,967,295 (약 43억) |
(signed) long (int) | 4 byte (32bit) | -2,147,483,648 ~ 2,147,483,647 (약 21억) |
unsigned long (int) | 4 byte (32bit) | 0 ~ 4,294,967,295 (약 43억) |
(signed) long long (int) | 8 byte (64bit) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (약 922경) |
unsigned long long (int) | 8 byte (64bit) | 0 ~ 18,446,744,073,709,551,615 (약 1844경) |
위 표를 보면 int를 제외한 자료형에서 (int)가 있다는 것을 알 수 있다. 지금까지 short, long을 생략해서 사용한 것이지 실제로는 int가 앞에 존재한다.
초기화는 선언과 대입을 하나로 조합하는 것을 의미한다.
int num = 55;
num이라는 이름의 변수를 int형 자료형으로 선언하고, 그 변수에 55를 대입한다. 위 방법과 다른 방식으로 초기화 할 수 있다. 사실상 큰 의미를 갖진 않고 c++을 보다 쉽게 사용하기 위함이라고 한다.
int num(55);
int num = { 55 };
int num{ 55 };
주의 해야 할것은 초기화와 대입은 다르다는 것이다. 클래스 구현시 생성자에서 초기화를 하는데, 초기화 리스트가 아닌 생성자 몸체 구현에서 하는 경우가 있다.
class ClassA
{
public:
ClassA(int b, int b);
private:
int numA;
int numB;
int numC = 5; //초기화
};
ClassA::ClassA(int a, int b)
: numA(a) //초기화
{
int numB = b; //대입
}
생성자에서의 초기화는 초기화 리스트에서 하는 것이지 몸체에서는 대입이다.
정수형 리터럴(Integer Literals)
책에서는 정수형 상수라고 되어있지만, 원본을 보니 정수형 리터럴(literal)(*주 1)이 맞다고 생각한다.
정수 리터럴을 10진수, 2진수, 8진수, 16진수 형식으로 지정할 수 있다. 진수 지정은 다음과 같다.
int main()
{
using namespace std;
int decimal = 11; //10진수
int binary = 0b11; //2진수
int octal = 011; //8진수
int hexadecimal = 0x11; //16진수
cout << "10진수 : " << decimal << endl;
cout << "2진수 : " << binary << endl;
cout << "8진수 : " << octal << endl;
cout << "16진수 : " << hexadecimal << endl;
cout << endl;
system("Pause");
return 0;
}
정수가 프로그램 안에서 어떤 진법으로 표현되었느냐와 상관없이, 기본적으로 cout은 정수를 10진수로 출력한다.
어떤 값을 진수형 그대로 출력하려면 iostream 헤더 파일의 dec, oct, hex 조정자를 사용해야 한다.
int main()
{
using namespace std;
int decimal = 11; //10진수
int binary = 0b11; //2진수
int octal = 011; //8진수
int hexadecimal = 0x11; //16진수
cout << "10진수 : " << decimal << endl;
cout << oct;
cout << "8진수 : " << octal << endl;
cout << hex;
cout << "16진수 : " << hexadecimal << endl;
cout << endl;
system("Pause");
return 0;
}
2진수의 경우 따로 조정자는 없는것 같고, bitset을 사용하여 비트연산으로 해야 하는것 같다. 찾으면 추가할 예정
char형: 문자와 작은 정수
char형은 문자와 숫자를 저장하기 위한 자료형이다. 읽을 때 차라고 하지말고 캐릭터라고 하는게 있어보인다. 컴퓨터에서 수를 저장하는 것은 어려운 일이 아니지만 문자를 저장하는 것은 다른 문제이다. 대부분의 컴퓨터 시스템들은 256개보다 적은 개수의 문자들을 지원한다. 이러한 문자들은 1byte만으로 충분히 나타낼 수 있다. 그러므로 char형은 문자들을 처리하는데 사용할 수도 있고, short형보다 작은 범위의 정수를 나타내는 데 사용할 수도 있다.
프로그램은 숫자 나열의 연속된 것이다. 즉, 문자도 컴퓨터는 숫자로 받아드린다. 이때 일반적으로 사용하는 것이 ASCII이고, 아스키코드라고 읽는다. 예를 들어, 65는 문자 A에 해당하는 코드이고, 77은 문자 M에 해당하는 코드이다. A부터 1씩 증가할 때마다 다음 알파벳이다. 즉, B는 66이다.
int main()
{
using namespace std;
char ch = 'A';
int ich = ch;
cout << ch << "의 ASCII 코드는 " << ich << endl;
ch += 1;
ich = ch;
cout << ch << "의 ASCII 코드는 " << ich << endl;
cout << endl;
system("Pause");
return 0;
}
위 코드에서 캐릭터형 ch는 A로 초기화했고, 정수형인 ich는 ch의 ASCII 코드이다. A의 ASCII 코드는 65가 되고 ch에 1을 더했을땐, 각각 B와 66이 나오는 것을 알 수 있다. 반대로 정수형에 문자형을 캐스팅하면 ASCII 코드의 문자가 나온다.
프로그램이 1byte(8bit)로 표현할 수 없는 문잘르 처리해야 하는 경우가 있다. 예를 들면, 일본어, 중국어, 한국어가 있다. 이런 상황을 C++는 두 가지 방법으로 처리한다.
- 컴파일러가 char형을 처음부터 2byte(16bit) 또는 그 이상으로 만든다.
- 기본 문자 세트와 확장 문자 세트를 동시에 지원한다.
8bit인 char형으로 기본 문자 세트를 나타내고, wchar_t형(wide character type)으로 확장 문자 세트를 나타내는 것이다. wchar_t형은 시스템에서 사용되는 가장 큰 확장 문자 세트를 나타낼 수 있는 충분한 비트 폭을 가진 정수형이다. 다만, 입,출력때 cout, cin을 사용하는 것이 아닌 wcout, wcin을 사용해야 하고, 확장 문자 상수나 확장 문자열의 경우 그 앞에 L을 붙어야 한다.
wchar_t bob;
wcin >> bob << endl;
wcout << bob << endl;
wcout << L"tail" << endl;
wchar_t형도 완벽한 것은 아니다. wchar_t의 부호와 길이는 가변이기 때문에 문제가 발생할 수 있다. 그래서 usigned 16bit형인 char16_t와 unsigned 32bit형인 char32_t를 지원한다. char16_t의 경우 L 대신 접두사로 u를 사용해야 하고, char32_t의 경우 U를 사용해야 한다.
char16_t ch1 = u'q';
char32_t ch2 = U'w';
bool형
bool형 변수는 참이나 거짓 중 어느 한 가지 값만 가질 수 있다. C++는 0이 아닌 값들을 참으로, 0인 값을 거짓으로 해석한다. bool형을 사용하면 참과 거짓을 명시적으로 나타낼 수있다. 미리 정의된 true와 false로 참과 거짓을 나타낸다.
bool isready = true;
int ans = ture; //1이 대입된다.
int promise = false; //0이 대입된다.
bool start = -100; //true가 대입된다.
bool stop = 0; //false가 대입된다.
'서적 정리 > C++ 기초 플러스' 카테고리의 다른 글
12.배열(array) (0) | 2022.07.26 |
---|---|
11.C++ 산술 연산자 (0) | 2022.07.26 |
10.부동 소수점수(floating point) (0) | 2022.07.25 |
9.const 제한자 (0) | 2022.07.25 |
7.함수(function) (0) | 2022.07.20 |
6.C++의 기타 구문 (0) | 2022.07.20 |
5.C++ 구문 (0) | 2022.07.20 |
4.C++의 시작 (0) | 2022.07.20 |
댓글