C++ 기초
C++
- AT&T 벨 연구소의 비야네 스트롭스트룹이 C 언어를 확장하여 만든 프로그래밍 언어
- C의 모든 기능을 포함하고 있으며 몇 가지 새로운 내용이 추가됨
- C는 클래스 개념이 없는 절차적 프로그래밍 언어지만 C++은 클래스를 활용하는 객체지향 프로그래밍 언어
C++ 프로그램의 작성 및 빌드
소스 파일
- 소스 프로그램 파일 : 작업을 수행하는 C++ 프로그램 명령어들을 담고 있는 파일 (.cpp, .cxx, .C)
- 헤더 파일 : 클래스, 함수의 원형, 매크로, 전역변수, 상수 등 여러 소스 파일에 공통적으로 선언되는 내용을 담고 있는 파일 (.h, .hpp)
- 단독으로 컴파일되지 않고, #include라는 선행처리기 지시어에 의해 소스 프로그램 파일에 삽입되어 함께 컴파일됨
빌드
- 컴파일러가 소스 파일을 목적 파일로 컴파일한다.
- 목적 파일은 번역 단위별로 하나씩 만들어진다.
- Sample.cpp, Sub.cpp에 각각 ‘iostream’과 ‘sub.h’ 헤더 파일이 삽입되어 Sample.obj, Sub.obj라는 두 개의 목적 파일이 생성된다.
- 목적 파일과 라이브러리를 연결하여 실행 파일을 만드는 링크가 이루어진다.
- 이와 같이 컴파일과 링크를 통해 실행 파일을 만드는 과정을 빌드라고 한다.
C++ 기본 코드
선행처리
- 선행처리기 지시어는 ‘#’로 시작함
- 헤더파일 삽입: #include
- 매크로 선언 및 해제: #define, #undef
- 조건부 컴파일: #if, #ifdef, #ifndef
입출력 스트림
std:cout
- 데이터를 문자열로 변환하여 출력
- 출력 연산자 : «
std::endl
을 붙이면 한 줄이 끝남
1
2
3
4
int a = 10;
std::cout << "a의 값은 ";
std::cout << a << "입니다." << std::endl;
// a의 값은 10입니다.
std::cin
- 입력값을 변수에 저장
- 입력 연산자 : »
- 공백 문자(빈칸, 탭, 새줄 문자)는 구분 문자로 취급
1
2
3
4
5
int a;
char str[100];
std::cin >> a >> str;
// 사용자 입력 : 10, Computer
// 입력 결과 : a=10, str="Computer"
namespace(명칭공간)
- 특정한 명칭들이 인식되는 프로그램의 부분
- 다른 영역의 명칭 선언과 무관하게 명칭공간 내에서 자유롭게 명칭을 선언하여 사용할 수 있음
- 여러 곳에서 명칭공간 재정의 가능
- 명칭공간 이름 뒤에
::
를 붙여서 사용 - 명칭공간 없이
::
를 사용하면 전역 변수 사용 - ‘using’을 이용하면 명칭공간 지정을 간소화 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using namespace std;
namespace NameSpace1 {int a = 10;}
namespace NameSpace2 {int a = 20;}
int a = 30;
namespace NameSpace1 {int b = 50;}
int main(){
int a = 40;
cout << NameSpace1::a << endl; //10
cout << NameSpace2::a << endl; //20
cout << ::a << endl; //30
cout << a << endl; //40
cout << NameSpace1::b << endl; //50
}
키워드와 식별자
키워드
- C++ 언어에서 미리 용도를 정해 놓은 단어
- 반드시 정해진 용도로만 사용해야 함
- ex) void, if, using , namespace, return
식별자
- 변수나 함수, 클래스 등의 이름
- 식별자를 만드는 규칙
- 첫 글자는 비 숫자 문자(영문 대·소문자와 ‘_‘)를 사용
- 특수문자, 띄어쓰기 사용 불가
- 키워드는 식별자로 사용할 수 없음
- 첫 글자로 ‘_’ 문자를 사용하는 것은 지양
- Snake case : ex) my_name
- Camel case : ex) myName
- Pascal case : ex) MyName
- 사용할 수 없는 식별자의 예
- 4days
- my name
- int
- initial-value
- my#name
자료형
기본 자료형
유형 | 자료형 | byte | 최솟값 | 최대값 |
---|---|---|---|---|
정수형 | char | 1 | -128 | 127 |
unsigned char | 1 | 0 | 255 | |
short | 2 | -32,768 | 32,767 | |
unsigned short | 2 | 0 | 65,535 | |
int | 4 | -2,147,483,648 | 2,147,483,647 | |
unsigned int | 4 | 0 | 4,294,967,295 | |
long | 4 | -2,147,483,648 | 2,147,483,647 | |
unsigned long | 4 | 0 | 4,294,967,295 | |
long long | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | |
unsigned long long | 8 | 0 | 18,446,744,073,709,551,615 | |
wchar_t | 2~4 (플랫폼마다 다름) | 0 | 4,294,967,295 (플랫폼마다 다름) | |
bool | 1 | true/false | ||
실수형 | float | 4 | ±3.4x10^-37 | ±3.4x10^+38 |
double | 8 | ±1.7x10^-307 | ±1.7x10^+308 | |
long double | 8 | ±1.7x10^-307 (double 이상의 표현범위) | ±1.7x10^+308 (double 이상의 표현범위) |
- 문자를 표현하는 자료형 : char
- 정수를 표현하는 자료형 : short, int, long, long long
- 참/거짓을 표현하는 자료형 : bool
- 다국어 표현을 위한 자료형 : wchar_t, char16_t, char32_t
- 정수형 자료형 이름 앞에 unsigned 키워드를 사용하면 음수를 제외한 정수를 표현
- 값의 범위는 2^(8 x byte 크기) - 1
리터럴
정수형 리터럴
표현 | 의미 | 예시 |
---|---|---|
10진수 숫자 | 10진수 int형 | 29 |
0b~ | 2진수 int형 | 0b11101 |
0~ | 8진수 int형 | 035 |
0x~ | 16진수 int형 | 0x1d |
~u | unsigned int형 | 123u |
~L | long형 | 123L |
~ul | unsigned long형 | 123ul |
~ll / ~LL | long long형 | 123ll / 123LL |
문자 리터럴
표현 | 의미 |
---|---|
‘A’ | ASCII 코드에 해당되는 정수 65와 동일 |
‘\101’ | ‘A’와 동일 (65의 8진수 표현) |
‘\x41’ | ‘A’와 동일 (65의 16진수 표현) |
실수형 리터럴
표현 | 의미 | 예시 |
---|---|---|
일반 실수형 표현 | double 자료형 | 1200. 1200.0 12e2 1.2e+3 12000e-1 |
~f | float 자료형 | 1200.0f 12e2f |
~l / ~L | long double 자료형 | 1200.0l / 12e2L |
‘e’ 뒤의 숫자 n은 10의 n승을 의미한다.
ex) 12e2 = 10^2, 1.2e+3 = 1.2 x 10^3, 12000e-1 = 12000 x 10^-1
변수
- 프로그램이 실행되는 동안 기억하고 있어야 하는 값들을 저장하는 메모리 영역
- 변수에는 자료형과 이름이 지정되어야 함
- 사용하기 전에 미리 선언해야 함
변수 초기화
변수는 아래 형식으로 초기화 할 수 있다.
1
2
int a = 10;
int b(10);
변수에 선언한 자료형과 일치하지 않는 값을 초기화하면 묵시적 형 변환이 이루어진다.
1
int d = 1.5; //묵시적 형 변환 : d의 값이 1로 초기화됨
위처럼 변수의 자료형에 맞지 않는 값을 넣는 경우 오차가 발생할 수 있다.
또한 자료형에 초과되는 크기의 값을 넣으면 오버플로가 발생한다.
이러한 오차 발생을 방지하기 위해 C++11 부터는 변수를 초기화하는 형식이 추가되었다.
1
2
int c{10};
int d = {10};
이 형식을 사용하면 변수에 선언한 자료형과 일치하지 않거나 축소 변환이 필요한 값으로 초기화 했을 때 오류가 발생한다.
1
2
3
4
5
int e{1.5}; //오류
int total{0}
short a{total}; //오류-축소 변환
float b{total}; //오류-축소 변환
const와 constexpr
const
- 초기화를 통해서만 값을 정할 수 있음
- 초기화 한 후에는 값을 수정할 수 없음
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의 값을 알 수 없음
scope
- 변수가 유효성을 갖는 영역
- 전역 변수: 프로그램의 전체 영역에서 사용 가능 (다른 파일에서 extern 선언하여 사용)
- ex)
extern int a;
- ex)
- static 변수: 소속 파일의 전체 영역에서 사용 가능
- 지역 변수: 소속 블록의 전체 영역에서 사용 가능
변수의 유효기간
- 자동 변수
- 생성 시점 : 함수(블록)가 시작될 때
- 소멸 시점 : 함수(블록)가 종료될 때
- 정적 변수
- 생성 시점 : 프로그램이 시작될 때
- 소멸 시점 : 프로그램이 종료될 때
1
2
3
4
5
int x; //전역변수: 정적 유효기간
int f() {
int y{10}; //지역변수: 자동 유효기간
static int z{10}; //정적 지역변수: 정적 유효기간
}
함수 안에서 호출된 static 변수는 함수가 종료되어도 소멸되지 않고 있다가 다음 번에 함수가 호출되면 가지고 있던 값으로 호출한다.
참고사이트
This post is licensed under CC BY 4.0 by the author.