
키워드, Keyword
미리 용도를 정해 놓은 단어정해진 용도로만 사용해야 함예약어 reserved word라고도 한다.#include <iostream>
/*
아래 코드에서
using, namespace, int, return 이 키워드에 해당됨
*/
using namespace std;
int main() {
cout << "first step" << endl;
return 0;
}식별자, Identifier
여러가지 대상을 구분하기 위해 만든 이름
식별자를 만드는 규칙
첫자는 비 숫자 문자를 사용 (c++11부터 다국어 문자 포함)비 숫자 문자: 영문 대/소문자와 _ (※ MS C++에서는 $ 포함)_ 또는 __ 문자로 시작하는 식별자는 C++의 구현 환경에 따라 특수한 용도로 활용하기 위해 이미 예약되어 있을 가능성이 있다. 따라서 사용 지양비 숫자 문자와 숫자를 사용 (특수문자 사용 불가)적절한 식별자의 예
myname
my_name // snake_case
myName // camelCase
MyName // PascalCase
a3
VALUE
Int
initial_value
합계 (c++11 이후) $price (MS C++)
*실무에서는 코딩 컨벤션을 만들어 상황에 따라 선택해서 사용하지만 주로 camelCase를 사용함
사용할 수 없는 식별자의 예
4days my name my#name int
intial-value min:value
C++의 자료형
기본 자료형
데이터를 표현하기 위한 기본적인 표현 형식char, int, short, long, bool 등float, double, long double복합 자료형
C++의 기본 자료형
정수 자료형, Integral type고정소수점(fixed-point) 방식의 숫자 표현소수점 왼쪽의 숫자만 표현, 말 그대로 정수만 표현실수 자료형 부동소수점(floating-point) 방식의 숫자 표현float (4byte)1.17549 x 10⁻³⁸ ~ 3.40282 x 10³⁸ 범위의 값을 표현함double (4byte)2.22507 x 10⁻³⁰⁸ ~ 1.79769 x 10³⁰⁸ 범위의 값을 표현함상수의 표현 - 리터럴(literal)
기본 자료형의 값을 직접 표현하는 방식프로그램에서 변경할 수 없으므로 상수에 해당정수형 리터럴의 표현
숫자를 표현하는 문자와 부호만으로 표현됨
0~9까지의 숫자a~f와 A~F접두사를 이용한 진법의 표현
| 표현 | 의미 |
|---|---|
| 159 | 10진수 int형 상수 |
0b110011111 | 2진수 int형 상수 |
0237 | 8진수 int형 상수 |
0x9f | 16진수 int형 상수 |
접미사를 이용한 리터럴의 자료형 지정
| 표현 | 의미 |
|---|---|
| 123 | int형 |
123u | unsigned int형 |
123L | long형 |
123ul | unsigned long형 |
123ll | long long형 |
문자 리터럴의 표현
작은 따옴표('')안에 문자를 표기하는 방법
8진수나 16진수 문자 코드로 표기하는 방법
| 표현 | 의미 |
|---|---|
| 'A' | 문자 'A' (ASCII 코드에 해당되는 정수 65와 동일) |
'\101' | 'A'와 동일함 (65의 8진수 표현) |
'\x41' | 'A'와 동일함 (65의 16진수 표현) |
실수형 리터럴의 표현
소수점이 있거나 10의 거듭제곱을 표현하기 위한 지수 기호인 e가 있으면 실수형 리터럴임
| 표현 | 의미 |
|---|---|
1200., 1200.0, 12e2, 1.2e+3, | double형 값 1200 |
1200.0f, 12e2f | float형 값 1200 |
변수
변수란?
값들을 저장하는 메모리 영역자료형과 이름이 지정되어야 함사용하기 전에 미리 선언해야 함// 자료형 변수명
int korScore, mathScore;
cin >> korScore >> mathScore;
// 자료형 변수명
float avrScore = (korScore + mathScore) / 2.0f;
변수의 초기화
불필요한 값이 들어있지 않게 변수를 만들 때 지정된 값을 할당하는 것
int total = 0; // 형식 1
int total(0) // 형식 2
// 초기화 오류
int x(131070.5) // 오류 1
short y(x); // 오류 2
int total{0}; // 형식 3
*초기화 오류
- 오류 1
x 변수를 초기화하기 위해131070.5란 값을 할당했는데x는int자료형이고131070.05는double자료형이므로 실제x에 할당되는 값은131070으로 축소가 된다. 따라서 .05라는 오차가 생겨 오류 발생- 오류 2
초기화된x의 값을y변수에 할당하여 초기화하였는데x의 자료형은int이고y는short다.int자료형은 32비트의 저장 공간을 가지고 있고short자료형은 16비트의 저장 공간을 가지고 있다. 따라서y변수에 32비트의x값을 다 할당하지 못하고 초과(오버플로)하여 발생하는 오류
자료형 추론
초기화하는 값의 자료형으로 변수의 자료형을 추론함auto i(10); // int i(10); 과 동일변수의 사용 영역(scope)
// s1.cpp
// 비 지역변수(non-local variable)
int a; // 선언된 이후 프로그램의 전역에서 사용 가능
static int b{10};
int f() {
int c{20}, d{30}; // 선언된 이후 소속 블록의 전체 영역에서 사용 가능
{
int d{40}; // 선언된 이후 소속 블록의 내부 영역에서 사용 가능, 지역 변수(local variable)
int e{50};
.
.
}
}
// s2.cpp
extern int a; // extern이란 키워드를 사용하면 s1.cpp파일 내부에 있는 int a 변수를 가지고 온다.
static int b{50};
int g() {
...
}
static 키워드를 사용하여 선언된 변수는 해당 파일 내부에서만 사용 가능f함수의 내부에 d변수가 선언되어있지만 새로운 {}, block을 생성하고 해당 블록 내부에 d변수를 새로 선언하였을 경우 해당 블록 내부에선 새로 선언한 d변수는 사용 가능하지만 f함수의 d변수를 사용하지 못한다. 이를 이름가리기라고 한다.extern 키워드를 사용하여 가져와 사용할 수 있다.const 한정어
값을 재할당할 수 없다.const double PI {3.14159};
constexpr 한정어
컴파일할 때 평가한다는 의미int a;
std::cin >> a;
const int b = 20;
const int C1 = a; // cin을 통해 입력된 a의 값으로 초기화
constexpr int C2 = a + 10; // 오류1: 컴파일 시 평가하기로 요청했지만 a는 사용자의 입력을 받아 할당하는 값이므로 컴파일 과정에서 오류가 난다.
constexpr int C3 = b + 100; // b + 100을 컴파일 시에 계산할 수 있음
constexpr int C4 = C1 * 2 // 오류: 오류1과 비슷한 상황으로 에러
constexpr 함수
constexpr int fac(int n) {
return n > 1 ? n * fac(n-1) : 1;
}
void f(int x) {
constexpr int a = fac(4); // 컴파일할 때 계산
int b = fac(x); // 실행 중 계산
}
변수의 유효기간
lifetime)이란?int x; // 전역 변수 - 정적 유효기간
int f() {
int y{10}; // 지역 변수 - 자동 유효기간
static int z{0} // 정적 지역변수 - 정적 유효기간
}정적 지역변수
기존 유효기간에선f함수가 종료되는 시점에y와z변수는 소멸되어야하는데z변수는static키워드를 사용하여 선언을 함으로써 할당되어있는 값을 보존하고f함수가 다시 실행되었을 때 보존한z변수의 값을 다시 재사용한다.
변수와 상수 사용 예제
// CircleArea.cpp
#include <iostream>
using namespace std;
int main() {
const double PI { 3.14159 }
double radius;
cout << "원의 반경을 입력하시오 : ";
cin >> radius;
double area = radius * radius * PI;
cout << "원의 면적 = " << area << endl;
return 0;
}
연산자
2항 연산자
2개의 피연산자를 사용하는 연산자
사칙 연산자: +, -, *, /
| 수식 | 수식의 값 |
|---|---|
5 + 3 | 8 |
3 / 2 | 1 |
3.0 / 2.0 | 1.5 |
나머지 연산자: %
| 수식 | 수식의 값 |
|---|---|
5 % 3 | 2 |
-5 % 3 | -2 |
5 % -3 | 2 |
-5 % -3 | -2 |
단항 연산자
증, 감 연산자: ++, --
전위표기: 변화된 값이 수식의 값후위표기: 원래의 값이 수식이 값부호 연산자: +, -
대입 연산자(=)
수식의 값: 저장된 결과
연산자의 결합 방향: 우 -> 좌
| 수식 | 수식의 값 |
|---|---|
| a = 0; | a = 0 |
| a = b = 0; | b = 0, a = 0 |
| a = b = 1.5 | b = 1, a = 1 |
*a는 double형, b는 int형일 떄
복합 대입 연산자
이항 연산자와 대입 연산자를 결합
+=, -=, *=, %=, <<=, >>=
| 수식 | 수식의 값 |
|---|---|
a += b; | a = a + b 와 동일 |
관계 연산자
>, <, >=, <=, ==, !=
| 수식 | 수식의 값 |
|---|---|
a > b | true |
a == 5 | false |
*a = 10, b = -5일때
논리 연산자
||, 논리 곱 &&, 부정 !논리 곱의 경우 앞의 연산이 거짓일 경우 뒤의 연산으로 넘어가지 않는다.논리 합의 경우 앞의 연산이 참일 경우 뒤의 연산으로 넘어가지 않는다.비트 단위 논리 연산자
|, 논리 곱 &, 배타적 논리 합 ^, 부정 ~둘 중 하나라도 참일 경우 참으로 연산둘 중 하나라도 거짓일 경우 거짓으로 연산피연산자가 서로 값이 같지 않을 경우 참으로 연산피연산자의 값을 반전시킨다. 비트 이동 연산자
좌측 이동 (<<): 우측 피연산자에 지정된 비트 수만큼 좌측 피연산자를 좌측으로 이동unsigned char x = 0b00011101; // 29
unsigned char y = x << 2;
// y = 01110100
우측 이동 (>>): 우측 피연산자에 지정된 비트 수만큼 좌측 피연자를 우측으로 이동signed 자료형에 대해서 부호를 유지할 수 있도록 부호 비트가 좌측의 비는 비트에 채움(구현에 따라 다름)char x = 0b10010100; // -108
char y = x >> 2;
// y = 11100101, -27유일한 3항 연산자
조건 ? 값 1 : 값 2조건이 참이면 수식의 값은 값, 거짓이면 값2자료형의 변환
두 값 사이의 연산에서는 우선순위가 낮은 자료형의 값이 순위가 높은 자료형의 값과 같은 형으로 변환됨여러 개의 연산으로 구성된 수식에서 묵시적 형 변환은 연산자 단위로 이루어짐대입 연산자(=)는 값을 저장할 변수의 자료형으로 묵시적 형 변환을 함정수 자료형의 변환 순위
bool<char<short int<int<long int<long long int
signed와unsigned자료형은 동일 함
intVar = doubleVar + intVar * floatVar;intVar * floatVar 연산에서 float이 우선 순위가 더 높으므로 intVar 변수는 float으로 형 변환 발생doubleVar와의 연산에선 double이 우선 순위가 더 높으므로 float으로 형 변환된 변수는 다시 double 자료형으로 형 변환 발생double로 형 변환이 발생한 값이 할당되는 변수는 int 자료형의 변수로 double 형으로 변환된 값은 최종적으로 int 자료형으로 변환되어 할당 된다.static_cast: 연관된 자료형 간의 형 변환 처리, 변환 처리는 컴파일 단계에서 정해진다.dynamic_cast: 기초 클래스와 파생 클래스 간의 포인터 또는 참조 형 변환이 프로그램 실행 중에 일어나도록 지시한다.reinterpret_cast: 관련이 없는 자료형 사이의 변환을 처리하는 연산자로, 포인터를 다른 자료형의 포인터나 정수 자료형으로, 또는 그 역으로 변환한다.const_cast: const 지정을 일시 해제한다.