학습 개요
- C++ 언어는 C 언어를 바탕으로 하여 객체 지향 프로그래밍을 위한 구문을 제공함
- 그러므로 대부분의 문법이 C와 동일하지만, 조금 다른 부분이나 추가된 문법이 있음
- C++ 언어의 기본적인 구문들에 대하여 개괄적으로 정리해 봄
- C++ 언어의 단어(키워드, 식별자), 자료형, 변수와 상수, 연산자, 형 변환 등에 대해 다룸
학습 목표
- C++의 문법에 맞게 식별자를 만들 수 있음
- 기본 자료형의 값을 표현하고, 변수를 만들어 저장하는 표현을 활용할 수 있음
- C++ 언어의 연산자를 사용하여 수식을 작성할 수 있음
- 자료형 사이의 형 변환을 할 수 있음
주요 용어
- 키워드(keyword)
- C++ 언어에서 미리 용도를 정해 놓은 단어
- 변수
- 프로그램이 실행되는 동안 기억하고 있어야 하는 값들을 저장하기 위해 자료형과 이름이 지정된 메모리 영역
- 사용 영역(scope)
- 이름이 유효성을 갖는 영역
- 지역 변수
- 프로그램의 소속 블록 안에서만 사용될 수 있는 변수
- 형 변환
- 값의 자료형을 다른 자료형으로 변환하는 것으로, 자료형의 변환은 묵시적 또는 명시적으로 지정 가능
강의록
키워드와 식별자
키워드
- 키워드(keyword)
- C++ 언어에서 미리 용도를 정해 놓은 단어
- 반드시 정해진 용도로만 사용해야 함
-
키워드의 예
1 2 3 4 5 6 7 8
#include <iostream> using namespace std; int main() { cout << "나의 첫 번째 C++ 프로그램" << endl; return 0; }
using namespaceintreturn
식별자
- 식별자(identifier)
- 여러 가지 대상을 구분하기 위해 만든 이름
- 변수나 함수, 클래스 등의 이름
- 여러 가지 대상을 구분하기 위해 만든 이름
- 식별자를 만드는 규칙
- 첫 자는 비 숫자 문자를 사용함(C++11부터 다국어 문자 포함)
- 비 숫자 문자
- 영문 대,소문자와
_(MS C++에서는 $ 포함)
- 영문 대,소문자와
- 비 숫자 문자
- 이후의 문자는 비 숫자 문자와 숫자를 사용함(특수 문자 사용 불가)
- 길이 제한 없음
- 키워드는 식별자로 사용 불가
_문자로 시작하는 이름 사용하지 않는 것이 바람직함
- 첫 자는 비 숫자 문자를 사용함(C++11부터 다국어 문자 포함)
- 적절한 식별자
mynamemy_name- Snake case
myName- Camel case
MyName- Pascal case
a3VALUEIntinitial_value합계- C++11 이후
$price- MS C++
- 사용할 수 없는 식별자의 예
4daysmy namemy#nameintinitial-valuemin:value
기본 자료형 및 상수와 변수
C++의 자료형
- 기본 자료형
- C++ 에서 기본적으로 제공하는 하나의 값을 지정하는 자료형
- 정수 자료형
charintshortlongbool
- 실수 자료형
floatdoublelong double
- 복합 자료형
- 여러 개의 데이터를 모아서 사용할 수 있는 자료형
- 배열, 구조체(struct), 클래스(class), 열거형(enum), 공용체(union)
- 포인터, 참조
C++의 기본 자료형
- 정수형 자료형(integral types)
- 고정 소수점(fixed-point) 방식의 숫자 표현
- 오버플로(overflow)가 발생하지 않도록 주의해야 함
- 문자를 표현하는 자료형
- signed/unsigned
char
- 정수를 표현하는 자료형
signed/unsignedsigned- 부호 있음
- 양수, 음수 둘 다 표현 가능
unsigned- 부호 없음
- 양수만 표현 가능
int,short,long,long longint≤short≤long≤long longint32bitshort16bitlong32bit
- 참/거짓을 표현하는 자료형
booltrue(참)false(거짓)
- 다국어 표현을 위한 자료형
wchar_tchar16_tchar32_t
- 고정 소수점(fixed-point) 방식의 숫자 표현
- 실수 자료형
- 부동 소수 점(floating-point) 방식의 숫자 표현
- 부동 소수점
- 소수점의 위치가 움직일 수 있음
- 부동 소수점 방식의 숫자 표현
- 123 = 12.310^1 = 1.2310^2
- 부동 소수점
- float (4byte)
- 부호 1비트, 지수 부 8비트, 가수 부 23 비트로 구성
- 1.17549×10^-38 ~ 3.40282×10^38 범위의 값을 표현
numeric_limits<float>::min()numeric_limits<float>::max()<climits>헤더 파일 include 시 float에 대해 가장 작은 값, 큰 값 확인 가능
- double (8byte)
- 부호 1비트, 지수 부 11비트, 가수 부 52비트로 구성
- 2.22507 * 10⁻ ³⁰⁸ ~ 1.79769 * 10³⁰⁸ 범위의 값을 표현함
numeric_limits<double>::min()numeric_limits<double>::max()
- 부동 소수 점(floating-point) 방식의 숫자 표현
상수의 표현 - 리터럴(iteral)
- 정수형 리터럴의 표현
- 숫자를 표현하는 문자와 부호 만으로 표현됨
- 숫자를 표현하는 문자
- 0 ~ 9 까지의 숫자
- 10 ~ 15에 해당되는 16진수를 표현하기 위한 문자 a ~ f와 A ~ F
- 숫자를 표현하는 문자
-
접두사를 이용한 진법의 표현
표현 의미 159 10진수 int형 상수 0b10011111 2진수 int형 상수 0237 8진수 int형 상수 0x9f 16진수 int형 상수 -
접미사를 이용한 정수 리터럴의 자료형 지정
표현 자료형 123 int형 123u unsigned int형 123L long 형 123ul unsigned long 형 123ll long long 형
- 숫자를 표현하는 문자와 부호 만으로 표현됨
-
문자 리터럴의 표현
표현 자료형 ‘A’ 문자 ‘A’ (ASCII 코드에 해당되는 정수 65와 동일) ‘\101’ ‘A’와 동일함(65의 8진수 표현) ‘\x41’ ‘A’와 동일함(65의 16진수 표현) - 작은 따옴표(‘ ‘) 안에 문자를 표기하는 방법
- 8진수나 16진수 문자 코드로 표기하는 방법
-
실수 형 리터럴의 표현
표현 자료형 1200., 1200.0, 12e2, 1.2e+3 double형 값 1200 1200.0f, 12e2f float형 값 1200 - 소수점이 있거나 10의 거듭 제곱을 표현하기 위한 지수 기호인
e가 있으면 실수형 리터럴임
- 소수점이 있거나 10의 거듭 제곱을 표현하기 위한 지수 기호인
변수
- 변수
- 프로그램이 실행되는 동안 기억하고 있어야 하는 값들을 저장하는 메모리 영역
- 변수에는 자료형과 이름이 지정되어야 함
- 모든 변수는 사용하기 전에 미리 선언해야 함
1 2 3
int korScore, mathScore; cin >> korScore >> mathScore; float avrScore = (korScore + mathScore) / 2.0f;
int- 자료형
korScore, mathScore;- 변수의 이름
float avrScore- 사용하기 전에 선언하면 됨
-
변수의 초기화
1
int total = 0;
1
int total(0);
1
int x(131070.5); // x ← 131070 : 오차 발생
1
short y(x); // x ← -2 : 오버플로 발생

1
int total{0};
1
short a{total}; // 오류: 축소 변환
1
float b{total}; // 오류: 축소 변환
- 자료형 추론
-
변수를 초기화할 때 초기화하는 값의 자료형으로 변수의 자료형을 추론
1
auto i(10); // int i(10); 과 동일함
-
- 변수의 사용 영역(scope)
- 변수가 유효성을 갖는 영역
-
s1.cpp
1 2 3 4 5 6 7 8 9 10
int a; // 선언된 이후 프로그램의 전체 영역에서 사용 가능 - 비 지역 변수(non-local variable) static int b{10}; // 선언된 이후 소속 파일의 전체 영역에서 사용 가능 - 비 지역 변수(non-local variable) int f() { int c{20}, d{30}; // 선언된 이후 소속 블록의 전체 영역에서 사용 가능 - 지역 변수(local variable) { int d{40}; // 선언된 이후 소속 블록의 전체 영역에서 사용 가능 - 지역 변수(local variable), 이름 가리기 int e{50}; // 선언된 이후 소속 블록의 전체 영역에서 사용 가능 - 지역 변수(local variable) } }
-
s2.cpp
1 2 3 4 5
extern int a; // 다른 소스 파일에서 존재하는 변수 사용 = s1.cpp 의 a 변수 static int b{50}; // 해당 소스 파일에서만 사용 가능 s1.cpp b 변수 != s2.cpp b 변수 int g() { }
-
- 변수가 유효성을 갖는 영역
const와 constexpr
const한정어- 변수의 값을 수정할 수 없게 함
-
초기화를 통해서만 값을 정할 수 있음
1
const double PI {3.14159}; // 원주율 정의
1 2
#define PI 3.14159 // 매크로 상수 정의 - 단순 치환
constexpr한정어- 그 값을 컴파일할 때 평가한다는 의미
-
실행 중 값을 평가하는 것에 비해 효율적으로 동작할 수 있게 함
1 2 3 4 5 6 7
int a; std::cin >> a; const int b = 20; const int C1 = a; // cin을 통해 입력된 a의 값으로 초기화 constexpr int C2 = a + 10; // 오류: 컴파일 시에 a의 값을 알 수 없음 constexpr int C3 = b + 100; // b + 100을 컴파일 시에 계산할 수 있음 constexpr int C4 = C1 * 2; // 오류: 컴파일 시에 C1의 값을 알 수 없음
-
모든 인수가
constexpr인 경우 컴파일할 때 값을 구할 수 있게 함1 2 3 4 5 6 7 8
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)
- 변수가 언제 만들어져서 언제 없어지는가를 나타냄
- 자동 변수
- 생성 시점
- 함수(블록)가 시작될 때
- 소멸 시점
- 함수(블록)가 종료될 때
- 생성 시점
- 정적 변수
- 생성 시점
- 프로그램이 시작될 때
- 소멸 시점
- 프로그램이 종료될 때
- 생성 시점
1 2 3 4 5 6
int x; // 전역 변수 - 정적 유효 기간 int f() { int y{10}; // 지역 변수 - 자동 유효 기간 static int z{0}; // 정적 지역 변수 - 정적 유효 기간 }
- 자동 변수
- 변수가 언제 만들어져서 언제 없어지는가를 나타냄
변수와 상수 사용
-
CircleArea.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#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항 연산자
- 사칙 연산자
+,-,*,/
수식 수식의 값 5 + 38 3 / 21 3.0 / 2.01.5 - 나머지 연산자
%
수식 수식의 값 5 % 32 -5 % 3-2 5 % -32 -5 % -3-2
- 사칙 연산자
- 단항 연산자
- 증, 감 연산자
++,--
수식(a = 10일 때) a의 값 b의 값 b = ++a;11 11 b = a++;11 10 b = --a;9 9 b = a--;9 10 - 부호 연산자
+,-
- 증, 감 연산자
대입 연산자
- 대입 연산자(
=)- 수식의 값
- 저장 된 결과
- 연산자의 결합 방향
- 우 → 좌
수식(a는 double형, b는 int형) 실행 결과 a = 0;a ← 0 a = b = 0;b ← 0, a ← 0 a = b = 1.5;b ← 1, a ← 1 - 수식의 값
- 복합 대입 연산자
- 이항 연산자와 대입 연산자를 결합
+=,-=,*=,/=,%=,<<=,>>=등
수식 실행 결과 a += b;a = a + b;와 동일
관계 연산자
- 관계 연산자
>,<,>=,<=,==,≠
수식(a = 10, b = -5) 수식의 값 a > btrue a == 5false
논리 연산자
-
논리 합
||, 논리 곱&&, 부정!수식(a = 10, b = -5) 수식의 값 a > 0 && b > 0false a > 0 || b > 0true a < 0 && --b < 0false, b는 -5 !(a > 0)false
비트 단위 연산자
- 비트 단위 논리 연산자
- 논리 합
|, 논리 곱&, 배타적 논리 합^, 부정~
수식(x = 0x35(0011 0101), y = 0xf0(1111 0000)) 수식의 값 x | y0xf5 (1111 0101) x & y0x30 (0011 0000) x ^ y0xc5 (1100 0101) ~x0xca (1100 1010) - 논리 합
- 비트 이동 연산자
-
좌측 이동 (
<<)1 2
unsigned char x = 0b00011101; // 29 unsigned char y = x << 2;

- 우측 피 연산자에 지정된 비트 수만큼 좌측 피 연산자를 좌측으로 이동
- 우측의 비는 비트에는 0이 채워짐
- 왼쪽으로 두 비트 이동 시 2의 제곱을 곱한 값과 같은 결과를 가짐
-
우측 이동 (
>>)1 2
char x = 0b10010100; // -108 char y = x >> 2;

- 우측 피 연산자에 지정된 비트 수만큼 좌측 피 연산자를 우측으로 이동
- signed 형에 대해서는 부호를 유지할 수 있도록 부호 비트가 좌측의 비는 비트에 채움(구현에 따라 다름)
- 오른쪽으로 두 비트 이동 시 2의 제곱을 나눈 값과 같은 결과를 가짐
-
조건 연산자
-
유일한 3항 연산자
수식 ( a = 10, b = 20, c = 30) 수식의 값 a > 0 ? b : c20 조건 ? 값1 : 값2- 조건이 true이면 수식의 값은 값1, false이면 값2
자료형의 변환
묵시적 형 변환
- 묵시적 형 변환 개요
- 두 값 사이의 연산에서는 우선 순위가 낮은 자료형의 값이 순위가 높은 자료형의 값과 같은 형으로 변환됨
- 여러 개의 연산으로 구성된 수식에서 묵시적 형 변환은 연산자 단위로 이루어짐
- 대입 연산자(=)는 값을 저장할 변수의 자료형으로 묵시적 형 변환을 함
- 오차나 오버플로가 발생할 수 있으므로 주의해야 함
-
묵시적 형 변환의 예

명시적 형 변환
- 형 변환 연산자
static_cast- 연관 된 자료형 간의 형 변환을 처리하며, 변환 처리는 컴파일 단계에서 정해짐
dynamic_cast- 기초 클래스와 파생 클래스 간의 포인터 또는 참조 형 변환이 프로그램 실행 중에 일어나도록 지시함
reinterpret_cast- 관련이 없는 자료형 사이의 변환을 처리하는 연산자로, 포인터를 다른 자료형의 포인터나 정수 자료형으로, 또는 그 역으로 변환
const_castconst지정을 일시 해제함
-
형 변환 연산자 사용 형식

연습 문제
-
다음 중 부동 소수 점 표현 방식의 수는?
a. 123e4
- e는 부동 소수 점 수의 지수 부 값을 나타내기 위한 기호로 사용되므로 123.0×10^4을 나타내는 부동 소수 점 수
- 123
- 10진수
- 0x24
- 16진수
- 0123
- 8진수 정수(고정 소수 점)
-
위 지문에서 문장의 결과 a에 저장 되는 값은?
1 2 3
int x = 5, y = 2; double a, z=10.0; a = z + x / y;
a. 12.0
- x와 y는 int형이므로 x / y는 정수 연산이 이루어지며, 그 결과는 2이고 이 값을 z의 10.0과 더하므로 결과는 12.0임
-
위 지문의 프로그램에서 (가)와 (나)의 의미에 대한 설명으로 옳은 것은?
1 2 3 4 5 6
constexpr int f(int x) { return x * x; } void g(int a) { constexpr int b = f(10); // (가) const int c = f(a); // (나) // (다) }
a. (가)는 f(10)의 값을 컴파일할 때 계산한다.
constexpr함수는 모든 인수가constexpr인 경우 컴파일할 때 값을 구할 수 있게 함
-
위 지문에서 변수 x, y가 모두 unsigned char 형이다. x의 하위 4비트는 변하지 않고 상위 4비트만 모두 0으로 만들려고 한다. y에는 어떠한 값을 가지고 있어야 하는가?
1
x &= y;
a. 0x0f
- y의 어떤 비트가 0이면, AND 결과에서 그 자리(x의 해당 비트)는 무조건 0이 됨
- y의 어떤 비트가 1이면, 원래 x 값이 전달됨
- 위 수식은
x = x & y;와 같음- &는 비트 단위 논리 곱 연산자임
- 어느 비트의 값이 a일 때 a & 0은 a의 값에 관계없이 0임
- 반면 a & 1은 a가 0이면 0, 1이면 1임
- 즉, a & 1은 a와 같음
- 그러므로 x의 값에서 0으로 지우고 싶은 비트는 0, 그대로 두고 싶은 비트는 1이 y에 들어 있다면 x의 원하는 비트를 0으로 지울 수 있음
- 하위 4비트는 변하지 않고 상위 4비트만 0으로 만들려고 하므로 y는 2진수 00001111, 즉 16진수 0x0f를 저장하고 있으면 됨
-
다음의 변수 선언문 중 오류가 있는 것은?
a.
int d{1.5};- 1.5가 double이므로 int형 변수를 초기화하려면 축소 형 변환이 필요하여 오류임
- 변수 선언문 중 옳은 것은?
int a = 100;- 필요하다면 묵시적 형 변환을 통해 변수가 초기화 됨
float b(20.0);- 필요하다면 묵시적 형 변환을 통해 변수가 초기화
int c = {200};- 초깃 값으로 사용된 수식에 대해 축소 형 변환이 일어나면 안 됨
-
위 지문 중 소스 파일에서 변수의 값을 수정하지 않았을 경우 (가) 영역에서 사용할 수 있는 변수와 그 값을 모두 올바르게 나열한 것은?
1 2 3 4 5 6 7 8 9 10 11
int a; static int b{10}; int f() { int c{20}, d{30}; { int d{40}; int e{50}; } // ······ // (가) }
a. a:0, b:10, c:20, d:30
- (가)를 포함하는 블록에 선언된 c와 d, 함수 f()의 앞에 선언된 a와 정적 변수 b를 모두 사용할 수 있으며, 함수 f()에 내포된 블록에 선언된 d와 e는 그 블록 안에서만 존재하며, (가)에서는 사용할 수 없음
정리 하기
- C++에서 사용하는 단어는 반드시 정해진 용도로 사용하도록 지정된 키워드와 프로그램 내에서 여러 가지 대상을 구분하기 위해 만드는 식별자가 있음
- 문자, 정수, 참/거짓, 실수를 표현하는 기본 자료형과 복합 자료형을 사용할 수 있음
- 값을 저장하기 위해 사용하는 변수는 사용하기 전에 자료형과 이름을 미리 선언해야 함
- 블록 안에 선언된 변수는 소속된 블록에서만 사용할 수 있는 지역 변수임
const한정어는 변수의 값을 변경할 수 없게 하며,constexpr한정어는 변수나 함수의 값을 컴파일할 때 평가할 수 있게 할 수 있게 함- 지역 변수는 자동 유효 기간, 전역 변수 및 정적 지역 변수는 정적 유효 기간을 갖음
- 연산자는 산술, 논리, 관계, 비트 단위 논리, 대입 등의 처리를 하는 데 사용 됨
- 서로 다른 자료형이 연산에 사용될 경우 우선순위가 높은 자료형으로, 대입 연산의 경우 값을 저장할 변수의 자료형으로 묵시적 형 변환이 일어남
- 형 변환 연산자를 이용하여 명시적으로 자료형을 변환할 수 있음