Post

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최솟값최대값
정수형char1-128127
 unsigned char10255
 short2-32,76832,767
 unsigned short2065,535
 int4-2,147,483,6482,147,483,647
 unsigned int404,294,967,295
 long4-2,147,483,6482,147,483,647
 unsigned long404,294,967,295
 long long8-9,223,372,036,854,775,8089,223,372,036,854,775,807
 unsigned long long8018,446,744,073,709,551,615
 wchar_t2~4
(플랫폼마다 다름)
04,294,967,295
(플랫폼마다 다름)
 bool1true/false 
실수형float4±3.4x10^-37±3.4x10^+38
 double8±1.7x10^-307±1.7x10^+308
 long double8±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
~uunsigned int형123u
~Llong형123L
~ulunsigned long형123ul
~ll / ~LLlong long형123ll / 123LL

문자 리터럴

표현의미
‘A’ASCII 코드에 해당되는 정수 65와 동일
‘\101’‘A’와 동일 (65의 8진수 표현)
‘\x41’‘A’와 동일 (65의 16진수 표현)

실수형 리터럴

표현의미예시
일반 실수형 표현double 자료형1200.
1200.0
12e2
1.2e+3
12000e-1
~ffloat 자료형1200.0f
12e2f
~l / ~Llong 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;
  • static 변수: 소속 파일의 전체 영역에서 사용 가능
  • 지역 변수: 소속 블록의 전체 영역에서 사용 가능

변수의 유효기간

  • 자동 변수
    • 생성 시점 : 함수(블록)가 시작될 때
    • 소멸 시점 : 함수(블록)가 종료될 때
  • 정적 변수
    • 생성 시점 : 프로그램이 시작될 때
    • 소멸 시점 : 프로그램이 종료될 때
1
2
3
4
5
int x; //전역변수: 정적 유효기간
int f() {
    int y{10}; //지역변수: 자동 유효기간
    static int z{10}; //정적 지역변수: 정적 유효기간
}

함수 안에서 호출된 static 변수는 함수가 종료되어도 소멸되지 않고 있다가 다음 번에 함수가 호출되면 가지고 있던 값으로 호출한다.

참고사이트

5. C 기본 자료형 이해하기 (C정수형, C실수형, 자료형크기, sizeof, 문자형, 아스키코드)

This post is licensed under CC BY 4.0 by the author.