값이 변할 수 있다.
데이터를 저장할 수 있는 메모리 공간에 붙여진 이름으로, 이 이름을 통해 해당 메모리 공간에 접근할 수 있다.
- 변수 이름 생성 규칙
- 영문 대소문자, 숫자, 언더스코어(_)로만 구성됨
- 숫자로 시작될 수 없음
- 공백 포함 불가능
- C++에서 미리 정의된 키워드 사용 불가능
- 변수명 길이 제한 없음
특성
signed : 부호를 가질 수 있다.
unsigned : 부호를 가질 수 없다.
자료형은 기본적으로 signed
예시
char
문자, 1byte(8bit, 2^8), -128 ~ 127 (unsigned char : 0~255)
short (요즘은 잘 안씀)
정수, 2byte(16bit, 2^16), -32768 ~ 32767
int
정수, 4byte, -2147483648 ~ 2147483647
__int64
정수, 8byte, 넓은 범위
float
실수, 4byte
double
실수, 8byte
bool
참/거짓, 1byte, false(0) ~ true(1)
0은 false, 0이 아닌 모든 수는 true이다.
- bit(비트) : 용량의 최소 단위
1bit는 0 or 1 중 하나만 저장할 수 있다.
- 1byte = 8bit
n비트가 증가하면 메모리 저장 공간이 2^n씩 증가한다.
1kbyte : 1024byte
1mbyte : 1024kbyte
1gbyte : 1024mbyte
1tbyte : 1024gbyte
변수는 메모리 주소를 기억하는 역할을 한다.
메모리 주소 : 메모리 공간에서 자신(변수)의 정확한 위치를 알기 위한 고유 주소
맨 앞 비트
메모리에 할당된 정수형 변수의 제일 첫 번째 비트는 변수의 부호를 나타낸다.
부호 비트는 singed 자료형일 때만 의미있다.
unsigned 자료형일 때는 맨 앞 비트도 데이터값으로 채운다.
구분이 헷갈린다 ....
선언 declaration
: 변수를 사용하기 위해 컴파일러에게 이름과 타입을 알려주는 것
정의 definition
할당 assignment
: = (대입 연산자)를 사용하여 (선언)정의된 변수에 실제로 값을 입력하는 것
초기화 initialization
: 변수를 선언하는 동시에 값을 할당해주는 것
-> 할당하지 않은 변수에는 쓰레기값이 들어있기 때문에 처음에 초기화해주는 것이 좋다.
// 선언이자 정의
int num;
// 할당
num = 20;
// 초기화
double num2 = 1.23;
변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간이지만,
프로그램이 실행되는 동안 메모리에 저장된 데이터를 변경할 수 없다는 차이가 있다.
리터럴 상수 / 심볼릭 상수로 나뉜다.
차이점) 리터럴 : 데이터 그대로 사용 / 심볼릭 : 데이터에 이름을 지어 그 이름으로 상수를 사용
코드에 직접 삽입된 값으로, 상수값 자체를 변경할 수 없다.
int age=23; 에서 변수 'age'는 메모리 공간을 가리키지만 '23'은 그렇지 않음,
또한 'age'에 23 말고 새로운 값을 초기화할(넣을) 수는 있지만 '23'을 변경할 수는 없음
변수와는 달리 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않다.
정수형 리터럴 상수 / 실수형 리터럴 상수 / 문자형 리터럴 상수로 나뉜다. +부울 리터럴
정수형 리터럴 상수 : 123, -456과 같이 아라비아 숫자와 부호로 표현된다.
실수형 리터럴 상수는 3.14, -45.6과 같이 소수 부분을 가지는 아라비아 숫자로 표현된다.
문자형 리터럴 상수는 'a', 'Z'와 같이 따옴표로 감싸진 문자로 표현된다.
bool Check = true; // 부울 변수 'Check'은 부울 리터럴 true가 할당됨
int x = 5; //정수 변수 'x'는 정수 리터럴 5가 할당됨
std::cout<< 2*3; // 여기서 2와 3은 정수 리터럴임
C++에서는 정수형 상수를 10진수뿐만 아니라 8진수나 16진수로도 표현할 수 있다.
여러 진법으로 표현된 상수의 출력을 위해 cout 객체는
dec(10진수), hex(16진수), oct(8진수) 조정자를 제공한다.
세 가지 조정자를 cout 객체에 전달하면 사용자가 다시 변경하기 전까지
출력되는 진법의 형태를 계속 유지할 수 있다.
int a = 10;
//10진수가 디폴트라 따로 변환 안 함
cout << "숫자 10을 10진수로 표현 : " << a << endl;
cout << oct;
cout << "숫자 10을 8진수로 표현 : " << a << endl;
cout << hex;
cout << "숫자 10을 16진수로 표현 : " << a;
데이터의 값이 너무 커서 int형으로 저장할 수 없는 경우
정수형 상수에 접미사를 사용해서 해당 상수의 타입을 직접 명시하는 경우
데이터의 값이 너무 커서 int형으로 저장할 수 없는 경우
정수형 상수에 접미사를 사용해서 해당 상수의 타입을 직접 명시하는 경우
| 접미사 | 타입 |
|---|---|
| 기본 설정 | (singed) int형 |
| u 또는 U | unsinged int형 |
| l 또는 L | (singed) long형 |
| ll 또는 LL | long long형 |
| ul 또는 uL 또는 Ul 또는 UL | unsinged long형 |
| long long 또는 ull 또는 Ull 또는 uLL 또는 ULL | unsinged long형 (C++ 11부터 제공) |
C++에서 실수형 리터럴 상수는 모두 부동소수점 방식으로 저장된다.
모두 double형으로 저장되며, 접미사를 추가해서 저장되는 타입을 직접 명시할 수 있다.
부동소수점 숫자 리터럴을 사용할 때는 정수값과 구분할 수 있도록
소수점 이하 자리를 포함하는 것이 일반적이다.
| 접미사 | 타입 |
|---|---|
| 기본 설정 | float형 |
| f 또는 F | double형 |
| l 또는 L | long double형 |
//부동 소수점 리터럴 선언 방법 두 가지
double pi = 3.14159; //3.14159는 double 리터럴
double avogadro = 6.02e213; // avogadro의 수는 6.02x10^23
//이 때 두 번째 형식에서 지수 뒤의 숫자가 음수일 수도 있다.
double electron = 1.6e-19; // 1.6 x 10^-19
unsigned int nValue = 5u // unsigned int
long nValue2 = 5L; //long
float fValue = 5.0f; // float
double d = 6.02e23 // double
char c = 'A'; // 'A' : 문자 리터럴
std::cout << "Hello, world!" // "Hello, world" : 문자열 리터럴
널 포인터 : 아무것도 가리키고 있지 않은 포인트
C++ 11부터는 널 포인터를 표현하기 위해 포인터를 0으로 초기화할 필요 없이
nullptr 키워드를 통해 더 제대로 널 포인터를 표현할 수 있게 되었다.
nullptr 키워드를 사용한 리터럴 상수의 타입은 포인터 타입이며,
정수형으로 변환할 수 없다.
변수와 마찬가지로 이름을 가지고 있는 상수
직관적으로 이해할 수 없는 상수에 이름을 붙여 코드 이해도를 높인다.
(주석을 달 수도 있지만 그 수가 많아지면 지저분해질 수 있다.)
선언과 동시에 반드시 초기화해야 한다.
const 키워드를 사용해 선언하면 이후 코드에서 해당 변수를 다른 상수로 바꿀 수 없게 한다.
//바로 이해 안 되는 코드
int candle = 23; //왜 23이지?
//const 키워드 사용
const int AGE = 23;
int candle = AGE; //초 갯수는 나이만큼 ~
참고)
http://www.tcpschool.com/cpp/cpp_datatype_constant
https://boycoding.tistory.com/152?category=1007180
https://needs-searcher.tistory.com/140
새싹수업