따라하며 배우는 C++
2. 변수와 기본적인 자료형
2.1 기본 자료형 소개
8 bit = 1 byte
데이터 타입마다 메모리 사용량이 다르다. 데이터 형마다 저장되는 방식도 다르다.
wchar는 윈도우즈 API로 코딩할 때 사용하기도 한다.
char은 문자 하나로, 문자 여러 개는 string을 사용한다(string은 정규 변수형은 아니지만 많이 사용하기에 변수형처럼 작동한다)
(signed) int는 음의 정수, 0, 양의정수를, unsigned int는 양의 정수와 0을 포함한다.
signed와 unsigned는 저장 방식이 다르다. 특정 연산에 따라 속도 차이가 있을 수 있다.
숫자를 저장할 때 메모리 사이즈에 따라 범위가 다르다.
가급적 작은 메모리 사이즈의 변수를 쓰다가, 큰 사이즈의 변수가 필요하면 경우에 따라 long 등을 임시로 넣어도 좋다.
float과 double은 둘 다 실수형이지만, 메모리의 차이가 난다.
float은 int와 똑같은 사이즈를 사용, double은 float의 두 배.
정밀도 측면에서 float를 single precision, double을 double precision이라고 부르기도 한다.
Boolean은 true or false 값을 가진다.
void는 storage가 없다. (뒤에 포인터가 나올 때 중요)
Null pointer
어떤 형의 변수이건 내부적으로는 숫자로 바꾸어 저장한다.
float에 대입 시 f를 뒤에 넣지 않으면 double 형 숫자로 인식한다.
그래서 정밀도가 더 높은 double 형 숫자를 float에 대입하면 truncate가 될 수 있음을 알려주는 워닝이 뜸
auto aValue = 3.141592;
라고 한다면 빌드 후에 변수에 담긴 리터럴에 따라 변수형이 결정된다.
변수의 사이즈를 출력할 수 있다.
cout<<sizeof(aValue) <<endl;
int a = 1; //copy initialization
int a(123); //direct initialization
int b{123}; //uniform initialization --> 객체 지향 프로그래밍을 할 때 중요하게 작용한다.
최근엔 후자를 권장하는 추세라고 한다. 후자는 함부로 형변환을 하지 않는다.
가급적 변수는 초기화를 초기에 해 주는 것이 좋다.
최근에는 사용할 변수는 사용하기 직전에 선언하는 것을 권장한다.
2.2 정수형(Integers)
integer는 32개의 숫자 = 4byte를 사용한다. 한 비트는 부호에 사용한다.
signed short의 32767(pow(2, sizeof(short) * 8 - 1 ) - 1)의 최댓값을 가질 수 있다.
메모리에서 표현할 수 있는 최댓값을 벗어나면 도리어 가장 작은 숫자로 돌아가 버린다.
컴파일러가 이러한 오류를 인지 못할 수 있다.
ex. unsigned에서 음수를 저장하면 자동으로 양수로 바꿔버린다
정수와 정수 연산은 기본적으로 정수형만이 나온다(22/4가 실수형으로 나오지는 않았다)
2.3 C++ 11 고정 너비 정수(Fixed-width Integers)
int16_t i(5); //16bits형 자료형 i에 5를 대입. 2bytes = short형. 즉 나는 2바이트를 사용해 i를 만들겠다라고 몇 바이트를 사용할지 고정함
int8_t j 65; //8bit형 자료형 j에 65 대입 1bytes = char 형 = A 즉 나는 1바이트를 사용해 j를 만들겠다 고정
int_fast8_t f(5); //8bits 중 가장 빠른 데이터 타입 사용(char)
int_least64_t l(5); //적어도 64bits를 사용하겠다. 8bytes인 long long이 사용됨
운영체제마다 같은 변수형이라 할지라도 차지하는 메모리 용량이 달라질 수 있다.
멀티 플랫폼에서 코딩을 많이 할 경우 유용한 방법이 될 수 있을 것이다
2.4 무치형(보이드, Void)
void는 함수 return형으로는 선언 가능해도, 변수형으로는 사용 불가능.
변수형이 달라도 그 변수형의 주소를 표현하는 방식은 똑같다.
그래서 동일하게 void로 캐스팅했다가, 사용할 때 다시 주소를 형 변환시키기도 함
즉 보이드도 포인터 다룰 때 많이 사용될 수 있다.
2.5 부동소수점수 floating point numbers
100 = 1.0*10^2 처럼 point가 떠 다닐 수 있다는 의미 = 부동소수점
전형적인 크기는 컴파일러, OS마다 다를 수 있다.
최근 언어들은 double을 많이 사용하지만, 아직까지는 숫자를 많이 사용하는 경우 float를 많이 사용.(메모리에 부담이 가므로)
부호부분은 2bit, 지수부분은 8bit, 나머지는 가수.
std::setprecision으로 표시 숫자 개수를 조절할 수 있다.
정밀도가 떨어질 수도 있다.
이렇게 무한대(inf)나 결정되지 않은 수 (nan(ind))가 나올 수도 있다.
이를 검사할 수 있는 boolean 내장 함수도 있음.
2.6 불리언 자료형과 조건문 if
boolalpha를 통해 true, false 형식으로 출력되도록 할 수 있다.
true는 1, false는 0으로 출력되는데, noboolalpha를 불러오면 숫자형(0, 1)으로 다시 바꿀 수 있다.
&&는 and 연산자, ||는 or 연산자로 불림.
&&는 모두 true여야 true, ||는 하나만 true여도 true.
2.7 문자형 char type
아스키 테이블로 char형으로 저장한 문자가 숫자로 어떻게 저장되는지를 정해 놓았다.
전자는 강제로 casting하는 방식이고
static_cast는 컴파일러에게 형 변환이 가능한지를 먼저 물어보는 기능이 추가된다는 차이점이 있다.
c1은 한 글자만 받으므로 두 글자를 입력하면 buffer 남아 있던 문자를 적용시켜 한번에 두 줄을 출력할 수 있다.
wchar_t c; //윈도우스에서 사용하는 변수형
char16_t c3; char32_t c4; //유니코드에 들어 있는 문자들을 사용할 때
\a --> 컴퓨터에서 소리를 낼 수 있는 문자.
2.8 리터럴 상수 literal constatns
비트를 사용할 때 16진수로 표현하면 표현할 길이가 짧아진다. 그래서 16진수를 쓰는 경우가 꽤 많다.
int x = 0b1011'1011
처럼 중간중간 '를 넣어도 컴파일러가 무시한다. 돈 계산할 때 중간중간 ,을 찍는 것과 비슷한 효과라고 보면 된다.
2.9 심볼릭 상수 symbolic constants
변수 선언할 때 double const와 const double가 차이가 없지만
포인터에선 둘의 위치가 바꼈을 때 의미가 약간 달라질 수도 있다.
보통 const를 먼저 씀.
const는 불변하는 상수이므로, 선언 즉시 초기화를 해 주어야 한다.
함수 parameter에 const를 붙이는 경우가 많다.
parameter로 들어온 변수를 함수 내부에서 변경하면 입출력을 명확하게 보여줄 수 없기 때문이다.
다른 사람이 그렇게 코드를 변형하는 것을 막기 위해 함수 input에 const를 많이 붙인다.
C언어를 하던 사람들이 위처럼 상수를 매크로로 쓰는 경우가 있는데, C++에선 지양하는 편.
첫번째로 디버깅이 힘들고, define은 C++파일 전체에 영향을 줄 수 있다.
대신 const int price_per_item= 30; 을 하는 것이 더 바람직하다.
상수는 헤더파일에서도 namespace 안에 상수 영역을 만들어놓고 몰아서 선언하는 것이 좋은 습관이다.
'개발 공부 > C++' 카테고리의 다른 글
따라하며 배우는 C++ 5. 흐름제어 (0) | 2020.06.30 |
---|---|
따라하며 배우는 C++ 4. 변수 범위와 더 다양한 변수형 (0) | 2020.06.29 |
따라하며 배우는 C++ 3. 연산자들 (1) | 2020.06.29 |
따라하며 배우는 C++ 1. C++의 기초적인 사용법 (1) | 2020.06.27 |
(new) 따라하며 배우는 C++ 0. 시작해봅시다 (0) | 2020.06.27 |