728x90
변수
C++에서 변수는 코드 안 어디에서나 선언과 초기화가 가능하다.
변수를 선언할 때 꼭 초기화를 할 필요는 없지만 이로 인해 버그가 발생할 가능성이 높다.
다음은 정수 값을 표현하는 int 타입 변수를 선언하는 방식이다.
int uninitializedInt;
int initializedInt = 7;
cout << uninitializedInt << " is a random value" << endl;
cout << initializedInt << " was assigned an intial value" << endl;
다음은 C++에서 자주 사용하는 타입이다.
(signed) int signed |
부호가 있는 정수를 표현하며, 값의 범위는 컴파일러마다 다르다 (대부분 4바이트) |
int i = -7; signed int i = -6; signed i = -5; |
(signed) short (int) | 작은 범위의 정수 (대부분 2바이트로 표현) |
short s = 13; short int s = 14; signed short s = 15; signed short int s = 16; |
(signed) long (int) | 큰 범위의 정수 (대부분 4바이트로 표현) |
long l = -7L; |
(signed) long long (int) | 아주 큰 범위의 정수를 표현한다. 구체적인 범위는 컴파일러마다 다르나 최소한 long 타입보다는 크다 (주로 8바이트를 사용한다) |
long long ll = 14LL; |
char | 단일 문자 | char ch = 'm'; |
char16_t | 16비트 단일 문자 | char16_t c16 = u'm'; |
char32_t | 32비트 단일 문자 | char32_t c32 = U'm'; |
wchar_t | 단일 확장(single wide) 문자. 구체적인 크기는 컴파일러마다 다르다. |
wchar_t w = L'm'; |
bool | 부울 타입. true나 false 중 하나의 값을 가진다. |
bool b = true; |
std::byte | 한 바이트를 표현한다. C++17 이전에는 한 바이트를 char나 unsigned char로 표현했다. 메모리의 한 바이트라는 의미를 명확하게 드러낼 수 있다. |
std::byte b{42}; |
캐스팅
캐스팅(동적 형변환, 타입캐스팅)이란 변수 타입을 실행 중에 바꿔주는 것을 의미한다.
예를 들어 float로 지정된 변수의 타입을 int로 캐스팅할 수 있다.
C++에서 변수의 타입을 명시적으로 변환하는 방법은 세 가지다.
float myFloat = 3.14f;
int i1 = (int)myFloat; // 방법 1
int i2 = int(myFloat); // 방법 2
int i3 = static_cast<int>(myFloat); // 방법 3
1번 방법은 C언어에서 사용했던 것으로 C++에서는 피해야 할 방식이지만 많이 사용되고 있다.
2번 방법은 거의 사용하지 않는다.
3번 방법은 좀 길지만 가장 명확해서 이렇게 표현하는 것이 바람직하다.
이렇게 캐스팅하면 부동소수점수에서 소수점 아랫부분을 잘라낸 나머지 정수 부분만 남게 된다.
문맥에 따라 변수의 타입이 강제로 캐스팅(강제 형변환)될 때도 있다.
long 타입 변수에 short 타입 변숫값을 대입하면 short 타입이 long 타입으로 자동 변환된다.
long 타입 정밀도(표현 범위)가 short 타입보다 넓기 때문이다.
short someShort;
long someLong = someShort; // 명시적으로 캐스팅할 필요가 있다.
변수를 자동으로 캐스팅할 때 데이터가 손실될 수 있다는 점을 주의해야 한다.
'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글
[C++ 1.1.6] 상수와 타입(enum), 엄격한 타입(enum class(스트롱 타입)), 구조체(struct) (0) | 2022.08.15 |
---|---|
[C++ 1.1.5] 연산자(단항, 이항, 비트 연산자) (0) | 2022.08.15 |
[C++ 1.1.3] 리터럴 (0) | 2022.08.15 |
[C++ 1.1.2] 네임스페이스(namespace, nested, alias) (0) | 2022.08.15 |
[C++ 1.1.1] 주석, 전처리 지시자, main() 함수, I/O 스트림 (0) | 2022.08.14 |