본문 바로가기
Program Language/c++

c++ 기초(리터럴 & 변수)

by 토담이아빠 2022. 12. 26.

리터럴 & 변수

 

이글은 "전문가를 위한 c++(개정4)" 학습한 내용을 직접 실습해보며 정리한 Review 글입니다.


리터럴(literal)

 

리터럴은 숫자나 스트링같은 값을 의미합니다. c++은 다양한 표준 리터럴을 제공합니다.

 

  • 십진수 리터럴 : 예) 123
  • 이진수 리터럴 : 예) 0b1111011 (십진수 : 123)
  • 8진수 리터럴 : 예) 0173 (십진수:123)
  • 16진수 리터럴 : 예) 0x7B (십진수 :123)
  • 부동소수점 리터럴: 예) 3.14f
  • 배정도 부동소수점 리터럴 : 예) 3.14
  • 16진수 부동소수점 리터럴(c++17이상) : 예) 0x3.ABCp-10, 0xb.cp121
  • 단일 문자 : 예) 'a'
  • '0'으로 끝나는 문자 배열 : 예) "character array"

 

숫자 리터럴에서는 자릿수 구분자(작은 따옴표)를 사용하여 다음과 같이 표현할 수 있습니다.

 

  • 23'456'789
  • 0.123'456f

 

변수

 

변수는 값을 저장하는 메모리 공간입니다. 선언 위치는 코드 안 어디에서나 가능하나 접근은 동일 블록내일 경우 반드시 그 다음부터 가능합니다. 변수 선언 시 초기화 하지 않고도 사용할 수도 있으나 초기화하지 않으면 무작위 값이 대입되어 사용 시 오류가 발생할 확률이 높으니 반드시 초기화하고 사용하는게 좋습니다.(최근 대다수 컴파일러는 초기화하지 않은 변수를 발견하면 경고 또는 에러 메세지를 발생시킵니다.)

 

다음 예는 변수를 선언하는 두가지 방식을 보여줍니다.


#include <iostream>
 
using namespace std;
 
int main()
{
	
	int unini_value;        //변수 선언
	int ini_value = 10;     //변수 선언과 동시에 초기화
 
	cout << unini_value << "은 초기화 되지 않은 변수 값" << endl;
	cout << ini_value << "은 할당된 초기값" << endl;
 
 
	return 0;
}

위 코드를 빌드하면 필자의 경우(Visual Studio 2019 사용) 다음과 같은 에러가 발생합니다.



초기화 되지 않은 변수의 값을 보려고 했지만 컴파일러가 오류를 띄우면서 다음 단계로 진행하지 못하도록 차단합니다. 초기화는 위 예제 처럼 선언과 동시에 초기화 할 수도있지만 나중에 초기화 해도 됩니다. 다만 초기화는 그 변수를 사용하기 반드시 진행되어야 한다는 것입니다. 그렇지 않으면 위 예제와 같은 오류를 만나게 될 것입니다.

다음은 변수를 선언하고 나중에(사용하기 전) 초기화하는 예제입니다.


using namespace std;
 
int main()
{
	
	int later_value;        //변수 선언
	int ini_value = 10;     //변수 선언과 동시에 초기화
 
	later_value = 12;       //나중에 초기화
	cout << later_value << "은 나중에 초기화된 변수 값" << endl;
	cout << ini_value << "은 할당된 초기값" << endl;
 
	return 0;
}

결과


선언과 동시에 초기화 하지 않아도 사용전에만 초기화를 진행하면 오류없이 정상적으로 결과가 출력되는 것을 확인할 수 있습니다.

 

자료형

변수는 반드시 자료형(type)을 선언해야합니다. c++에서 자주 사용하는 자료형은 다음과 같습니다.


자료형 설명 사용 예
(signed) int
signed
부호가 있는 정수(양수와 음수)를 표현하며, 값의 범위는 컴파일러마다 다르다(대부분 4바이트) int i = -7;
signed int i = -6;
singed i = -5; (signed int와 같음)
(signed) short (int) 작은 범위 정수(대부분 2바이트로 표현) short s = 13; 
short int s = 14; (short와 같음)
signed short s = 15;
singed short int s = 16; (signed short와 같음)
(signed) long (int) 큰 범위의 정수(대부분 4바이트로 표현) long l = -7L;
long int l = 9L; (long과 같음)
singed long l = -15L;
singed long int = -20L; (signed long과 같음)

(signed) long long (int) 아주 큰 범위의 정수를 표현한다. 구체적인 범위는 컴파일러마다 다르나 최소한 long보다는 크다(주로 8바이트를 사용) long long ll = 14LL;
long long int ll = 14LL;(long long과 같다)
signed long long ll = -10LL;
signed long long int ll = -20LL; (signed long long과 같다)
unsigned (int)
unsigned short (int)
unsigned long (int)
unsigned long (int)
unsigned long long (int)
0을 포함한 양수 unsigned i = 5U;
unsigned int j = 2U;
unsigned short s = 23U;
unsigned long l = 5400UL;
unsigned long long ll = 140ULL;
float 단정도(single) 부동소수점수(float-point number) float f = 7.2f;
double 배정도(double) 부동소수점수, 정밀도가 최소한 float보다 크다. double d = 7.2;
long double 롱배정도(long double) 부동소수점수, 정밀도가 최소한 double보다 크다. long double d = 16.98L;
char 8비트 단일 문자 char ch = 'm';
char16_t 16비트 단일 문자 char16_t ch16 = u'm';
char32_t 32비트 단일 문자 char32_t c32 = U'm';
wchar_t 단일 확장(singl wide)문자, 구체적인 크기는 컴파일러마다 다르다 wchar_t w = L'm';
bool 부울 타입, true나 false 중 하나를 값으로 가진다. bool b = true;
std::byte 한 바이트를 표현한다. c++17 이전에는 한 바이트를 char나 unsigned char로 표현했다. 이러한 표현은 문자를다루는 듯한 느낌을 준다. 반면 std::byte로 표현하면 메모리의 바이트라는 의미를 명확히 드러낼 수 있다. std::byte b{42};
std::byte b = {42};

c++ 언에 자체에는 스트링에 대한 기본타입이 정의되어 있지않으며 표준 라이브러이에서 스트링에 대한 구현을 제공합니다.(예 : std::string)

 

타입 캐스팅(묵시적/명시적)

 

변수 타입은 실행중에 바꿀 수 있습니다. 이를 타입 캐스팅(type casting)이라고 부릅니다. 타입을 변환하는 방법에는

다음과 같이 묵시적 방법과 명시적 방법이 있습니다. 


float myfloat = 3.14f;
int a;
a = myfloat;                       //묵시적 형 변환
 
int b = (int)myfloat;              //명시적 방법 1
int c = int(myfloat);              //명시적 방법 2
int d = static_cast<int>(myfloat); //명시적 방법 3 (논리적으로 변경 가능한 경우만 변경을 허용합니다.)

묵시적 변환은 타입 변환을 명시하지 않아도 할당 받는 변수 타입에 맞게 할당되는 값을 컴파일러가 자동으로 변환해줍니다. 이러한 변환이 논리적으로 타당한지는 검사하지 않기 때문에 타입 변환에 안전하지 않습니다. 명시적 방법은 변환하는 형을 직접 명시해줍니다. 방법에는 3가지가 있는데 위의 첫번째 방법과 두번째 방법은 논리적으로 가능한지 여부를 따지지 않고 무조건 변경을 지시합니다. 묵시적 변환과 마찬가지로 타입변환에 안전하지 않습니다. 세번째 방법은 논리적으로 변경 가능한 경우에만 변경을 허용합니다. 따라서 타입 변환에 안전하므로 적극 추천합니다.

 

 

 

'Program Language > c++' 카테고리의 다른 글

C++ 기초(구조체)  (0) 2023.01.03
c++ 기초(enum)  (0) 2023.01.02
c++ 기초(연산자)  (0) 2022.12.29
c++ 기초(namespace)  (0) 2022.12.22
c++ 기초("Hello, World!")  (0) 2022.12.22

댓글