
main()C++에서 명령들은 함수라는 단위로 그룹화 된다, 이때 함수란 순차적으로 실행되는 명령들의 집합이다모든 C++ 프로그램에는 특수 함수인 main()이 반드시 존재해야 한다프로그램이 실행되면 main()의 명령들이 순차적으로 실행되고 종료된다프로그래밍에서 이러

초기화 되지 않은 변수C++에서는 변수 초기화가 되지 않으면 쓰레기 값이 들어가게 된다, 이때 쓰레기 값이란 해당 메모리 주소에 있는 아무 의미 없는 값을 의미한다 (이 값은 매번 달라질 수 있다)C++에서 자동 초기화가 없는 이유는 아주 옛날 성능 최적화 때문이다 e

함수란함수란 순차적으로 실행되는 명령문들의 집합이다, 조금 더 자세히 설명하면 함수는 특정 작업을 수행할 수 있도록 설계된 재사용 가능한 명령문 시퀀스이다C++의 특수 함수인 main()에 모든 기능을 전부 넣기는 힘들다, 따라서 추가 함수를 구현하고 main()에는

전방선언다음 코드는 컴파일에러를 발생시킨다 왜일까?이유는 컴파일러가 코드를 순차적으로 컴파일하기 때문이다, 따라서 main()에서 add()를 호출할 때 add의 선언이 보다 밑에 있기 때문에 add 식별자를 찾지 못하여 컴파일 에러가 발생한다이러한 에러를 해결하기 위

헤더파일C++에서는 cpp와 헤더파일을 사용하여 프로그래밍 한다, 보통 헤더파일은 .h의 확장자를 갖지만 가끔 .hpp확장자나 확장자가 없는 경우도 존재한다헤더파일에 선언을 하고 해당 헤더파일을 include하여 필요한 곳에서 가져와 사용이 가능하다, 이로써 여러 파일

Syntax & Sementic Error프로그래밍을 하며 오류가 발생하는건 피할 수 없는 일이며 이를 디버깅하여 고치는것이 정말 중요하다따라서 다양한 디버깅 기술과 경험은 프로그래밍에 있어 굉장한 도움이 된다우선 Syntax Error는 구문 오류로 C++ 문법에 맞

Data Type컴퓨터의 모든 data는 결국 bit sequence이다, 우리는 data type (type)을 이용하여 컴파일러에게 메모리에 있는 데이터를 의미있는 방식으로 해석하는 방법을 알려주는 것이다이러한 객체에 값을 주면 컴파일러와 CPU는 해당 data t

부동 소수점부동 소수점은 소수점이 부동할 수 있다는 의미이다 (실수를 의미)부동 소수점은 항상 부호가 존재한다 (unsigned 타입이 존재하지 않는다)기본적으로 3개의 기본 부동 소수점 데이터 타입이 존재한다floatdoublelong doublefloat은 일반적으

암시적 형변환 (implicit type conversion)다음과 같은 코드는 어떤 결과를 출력할까?double 타입인 매개변수에 정수인 10을 넘긴 상태이지만 문제 없이 컴파일되고 실행된다이는 컴파일러가 타입 불일치를 알아차리고 암시적으로 형변환을 했기 때문이다 (

Numeral System (숫자 체계)C++에서 사용할 수 있는 Numeral System에는 2진법, 8진법, 10진법, 16진법이 존재한다일반적으로 사람이 사용하는 진법은 10진법이다, 이는 사용할 수 있는 숫자가 10개이기 때문에 10진법이다(0~9)기본적으로

상수 표현식에는 일반 함수가 들어갈 수 없다 (compile error)constexpr 변수의 값에는 항상 상수표현식만 올 수 있기 때문에 일반 함수는 올 수 없다따라서 constexpr 함수를 사용해야 한다constexpr functionconstexpr 함수는 상

std::stringC-Style의 literal 문자열은 사용하기 좋다, 하지만 C-Style의 문자열 타입은 이상하게 동작하고 작업하기 어렵다 (C-Style 문자열 변수에는 새 문자열 값을 할당할 수 없다, 특정 C-Style의 문자열을 더 짧은 크기의 C-Sty

예를 들어 다음과 같은 표현식이 있다고 가정해보자수학적으로는 가 +보다 우선순위가 높아 2 3이 연산되고 1이 더해진다그렇다면 컴파일러는 이를 어떤 방식으로 알 수 있을까?연산자 우선순위이러한 연산자들끼리의 우선순위는 미리 정해져있다, 우선순위가 높은 연산자와 피연산

복합 명령문복합 명령문이란 하나의 단일 명령문인 것처럼 처리되는 명령문의 그룹이다{ }으로 구성되어 있으며 안에 명령문들이 배치된다, 또한 { }의 뒤에는 ;이 붙지 않는다ex) 함수에서의 { }, if문에서의 { }함수는 다른 함수 안에서 중첩될 수 없지만 { }자체

1. External Linkage (외부 연결) > External Linkage External Linkage는 Internal Linakge와 반대로 링크단계에서 다른 파일에서 식별자들을 링크할 수 있는 개념이다 External Linkage 속성의 식별자들

전역 상수 공유프로그래밍을 하다보면 pi나 gravity와 같은 특정 상수값을 코드 전체에서 사용해야 할 경우가 생긴다가장 기본적인 방법은 .h에 전역 상수를 namespace안에 만들어 해당 .h를 사용하는 소스파일에서 include 한 후 사용하는 방법이다이런 방식

Flow Control이런 코드들은 main에서 시작해서 명령들을 순차적으로 실행하는 직선 프로그램이다 (실행할 때마다 항상 동일한 flow)이때 만약 입력된 값이 10 이하이면 출력하지 않고 10 초과일때만 출력하는 프로그램을 만든다고 한다면 이는 Flow Contr

gotoC++에서의 unconditional jump는 goto를 사용하여 구현한다이때 unconditional jump는 if나 switch처럼 조건을 검사하지 않고 무조건 jump한다는 의미이다switch의 case와 마찬가지로 goto의 label은 보통 들여쓰기

Random number algorithm프로그래밍을 하며 난수는 언제 필요할까? 생각보다 굉장히 다양한 방면에서 필요할 수 있다 (게임, 암호화 복호화 등)컴퓨터는 일반적으로 진짜 난수를 생성할 수 없다, 따라서 특정 알고리즘을 적용하여 난수를 생성해야 한다PRNGP

Code Test프로그램을 제작했다면 작성한 코드가 의도대로 잘 동작하는지 검증이 필요하며 테스트가 필요하다 (하나의 케이스 뿐 아니라 범용적인 케이스에서도 잘 동작하는지?)이를 Software Testing이라고 하며 소프트웨어가 실제 예상대로 잘 동작하는지 검증하는

객체의 값은 비트시퀀스로 저장되고 타입은 컴파일러에게 해당 비트를 의미 있는 값으로 해석하는 방법을 알려준다컴파일러는 정수3을 그대로 변수f에 할당된 메모리에 저장하지 않고 float이기 때문에 3.0으로 형변환 후 저장한다형변환은 원래의 값이나 타입을 변환하지 않는다

Narrowing Conversion축소 변환은 대상 타입이 원본 타입의 모든 값을 담을 수 없을 가능성이 있을때, (데이터 손실이 발생할 수 있는) 잠재적으로 안전하지 않은 변환이다실수에서 정수로 변환더 큰 범위의 실수를 작은 범위의 실수로 변환 (이때 constex

autoC++에서는 모든 객체에 대해 명시적인 타입이 제공되어야 한다위 코드는 float타입의 변수 f를 float타입의 literal 값인 10.0으로 초기화 한 코드이다결국 float이라는 동일한 타입 정보를 두 번 제공하는 셈이다C++에서 타입 추론(Type De

함수 오버로딩함수 오버로딩이란 다른 매개변수를 가진 같은 이름의 여러 함수를 만드는것이다위와 같은 함수가 있을때 실수를 더해서 return하는 함수가 필요하다면 하나 더 만들어야 할까?만약 하나 더 만든다면 함수가 굉장히 많아질 것이다 (유지보수에 좋지 않음)이럴때 함

함수 템플릿예를들어 a,b중 큰 값을 return하는 함수가 있다고 가정해보자하지만 double, long과 같은 다른 type으로 비교를 하고 싶다면 해당 타입별로 Max()를 전부 다 만들어야 한다 (특정 타입을 예상하지 못하기 때문에 함수 overaloading으

복합 데이터 타입복합 데이터 타입이란 기본 데이터 타입을 확장하여 조금 더 복잡한 데이터 구조를 만들 수 있게 해주는 타입이다C++은 대표적으로 다음과 같은 복합 데이터 타입을 제공한다함수C 스타일 배열포인터 (객체나 함수를 가리키는 포인터)멤버 포인터 (멤버 데이터,

포인터위 코드가 실행되면 변수 i를 저장하기 위해 메모리 상에 int type의 크기만큼 공간이 할당된다이때 i를 사용할 때 마다 해당 메모리 주소에 접근하여 값을 가져오거나 수정하게 되는것이다C++에서 메모리 주소를 직접 이용하여 값에 접근하고 조작하려면 포인터, 주

참조 반환 및 주소 반환함수의 인자로 기본 타입과 같은 경우에는 복사가 일어나도 코스트가 크지 않지만 클래스나 구조체와 같은 경우에는 상황에 따라 코스트가 굉장히 크게 드는 경우가 발생할 수 있다, 따라서 인자로 넘길때는 참조나 주소 전달 방식으로 전달하는게 좋다이는

사용자 정의 타입int나 double과 같은 C++에서 정의된 타입들은 기본 타입이라고 하며 즉시 사용이 가능하다물론 함수, 포인터, 참조, 배열과 같은 기본타입의 확장인 복합 타입도 동일하다(이미 C++에서 타입 이름과 기호가 의미하는 바를 알고 있기 때문에 즉시 사

enum class일반 enum data를 비교할 때 서로 다른 타입으로 간주되지만 타입 안전성이 부족하여 의도하지 않은 동작을 할 수 있다Animal과 Color는 명백히 다른 타입으로 구분된다, 하지만 컴파일러는 두 값을 비교 시 정수로 변환하고 비교하기 때문에 이

C++에서는 struct와 class의 멤버로 다른 사용자 정의 타입을 사용할 수 있다또한 구조체 내부에서 다른 구조체를 정의하여 다른 사용자 정의 타입을 사용할 수도 있다struct나 class에서는 데이터를 직접 소유하거나 참조할 수 있다구조체나 클래스가 데이터를

procedural programming (절차적 프로그래밍)절차적 프로그래밍은 순차적인 명령 목록으로 구성되어 있고 이 명령에는 데이터와 해당 데이터를 이용하여 수행되는 연산으로 이루어져 있다절차적 프로그래밍의 가장 핵심은 프로그램의 logic을 구현하는 절차 (함수

Access functionclass에서 private: 접근 지정자에 있는 멤버 데이터는 클래스 밖에서 직접 접근이 불가능하다이렇게 private:에 있는 멤버 데이터의 값을 가져오거나 수정하는 함수를 Access function이라고 한다대표적으로 getter/se

생성자클래스 타입이 집합체(aggregate)라면 집합 초기화를 사용하여 클래스 타입 객체의 멤버 데이터를 초기화 할 수 있다집합 초기화는 멤버별 초기화를 수행하며 정의된 순서대로 초기화 된다하지만 aggregate data type의 조건을 보면 멤버 데이터가 pri

생성자 위임DRY(Don't Repeat Yourself) 원칙을 지키기 위해 최대한 코드의 중복은 피하는 것이 좋다반복되는 코드를 함수로 대체하여 코드 유지보수성을 향상시키고 중복 코드를 줄이는 것 처럼 생성자도 마찬가지다생성자의 코드가 매우 유사하거나 동일한 경우는

복사 생성자다음과 같은 코드는 잘 동작한다Knight K1{ 100, 200 };은 Knight(int, int) 생성자를 호출하여 초기화가 되는데 Knight K2{ K1 };은 어떤 생성자를 호출할까?복사 생성자가 호출되면서 해당 코드가 문제 없이 동작한다복사 생성

변환 생성자암시적 타입 변환이란 컴파일러가 한 타입의 값을 다른 타입의 값으로 암묵적으로 변환하는걸 의미한다, 이때 가능한 변환이 있어야 가능하다예를들면 다음과 같다그렇다면 다음 코드는 어떨까?Foo()의 매개변수는 Knight 클래스 타입인데 Foo(10);이 그대로

this 포인터멤버 함수가 호출될 때 C++은 어떤 객체에서 호출되었는지 어떻게 알 수 있을까?결과는 당연히 200이 콘솔창에 출력된다여기서 컴파일러는 SetHp(), PringHp()가 호출될 때 Knight 클래스 타입 객체 K1에 대해 동작해야 한다는것을 알아야

멤버 타입 (중첩 타입)다음과 같은 코드가 있다고 가정해보자만약 enum class인 PlayerStat이 Archer class와 함께 사용되도록 의도되었다면 위 예시는 class와 enum class가 독립적이기 때문에 둘이 어떻게 연결되는지 추론해야 한다따라서 멤

static 멤버 변수global variable과 static local variable은 둘 다 static duration 생명주기를 가진다, 즉 프로그램이 시작할때 생성되고 종료할때 소멸되며 그리고 이러한 변수들은 { }스코프를 벗어나도 그 값을 유지한다일반 l

Container and Array만약 한 회사의 전 직원의 나이를 기록하고 평균 나이를 계산한다고 생각해보자컨테이너나 배열이 없다면 전 직원이 100명이라고 가정할 때 100개의 변수를 정의하고 계산해야 한다매우 반복적이며 휴먼에러가 발생하기 너무 좋은 상황이다, 또

컨테이너 길이의 부호 문제우선 배열의 에 사용되는 데이터 타입은 배열의 길이를 저장하는데 사용되는 데이터 타입과 일치해야 한다즉 안에 사용하는 숫자의 타입은 일반적으로 배열의 길이를 나타내는 데이터 타입인 std::size_t여야 가장 안전하고 이상적이라는 의미이다

Array and loop배열의 모든 element를 순회(iterating)하려면 어떻게 해야할까?배열의 index는 반드시 상수 표현식일 필요가 없고 런타임 표현식이 될 수 있다 (변수의 값을 index로 사용할 수 있음)반복문을 이용하면 배열의 모든 element

std::vector의 resizing과 capacity배열 타입은 크게 고정 크기 배열(fixed-size array)와 동적 배열(dynamic array)로 나눌 수 있다고정 크기 배열은 배열의 length가 인스턴스화 시점에 알려져야 하며 그 이후에는 lengt

std::array컨테이너란 이름 없는 객체(element)들을 저장하는 공간을 제공한다배열은 element들을 메모리 상에 연속적으로 할당, 를 통해 특정 element에 빠르고 직접적으로 접근할 수 있다C++ 에서는 대표적으로 std::vector, std::ar

std::reference_wrapper배열은 어떤 객체 타입의 element든 가질 수 있다 (기본 타입, 복합 타입)이때 참조는 객체가 아니기 때문에 참조로 이루어진 배열을 만들 수 없다, 또한 배열의 element는 값 변경(할당)이 가능해야 한데 참조는 한번 초

C-style array말 그대로 C언어에서 상속받은 배열을 의미하며 다른 STL 컨테이너 클래스와 달리 C++ 언어에 내장되어 있다 (따로 헤더를 include할 필요가 없음)유일하게 언어 자체에서 지원하는 배열 타입이다, 다른 STL 컨테이너 클래스도 일반적으로 내

C-style stringC-style의 문자열은 const charN으로 구성되어 있다, 결국 const char타입의 배열이라는 뜻이다C-style 문자열 literal은 사용해도 좋지만 C-style 문자열 객체는 사용하기 어렵고 위험하기에 현대 C++에서는 권장

선택 정렬을 이용한 배열 정렬배열을 정렬한다는건 배열의 모든 element를 특정 조건에 맞는 순서로 정렬하는걸 의미한다ex) 연락처 이름순, 이메일 최신순배열을 정렬하게 되면 사람뿐 아니라 컴퓨터에서도 배열 검색을 효율적으로 만들 수 있다ex) 이름 검색 시 가나다

코드 실행 시간 측정개발을 하다보면 더욱 성능이 좋은 방식을 선택해야 하고 이때 더 성능이 좋은지 확신할 수 없는 경우가 종종 있다, 성능을 확인하기에 가장 쉬운 방법은 코드가 실행되는데 얼마나 시간이 걸리는지를 측정하는 것이다C++11부터는 chrono library

동적 배열 할당, 해제단일 값을 동적할당 하는 것 뿐 아니라 배열도 동적할당이 가능하다 (C-style 배열)배열의 길이가 컴파일타임에 정해져야 하는 고정 배열과 다르게 배열을 동적으로 할당하면 런타임에 배열의 길이를 선택할 수 있다 (배열의 길이가 constexpr일

void pointervoid 포인터는 generic pointer (일반 포인터)라고도 불리고 어떤 데이터 타입의 객체라도 가리킬 수 있는 특수한 포인터이다일반 포인터와 같은 방식으로 선언되고 타입으로 void 키워드가 사용된다void 포인터는 어떤 데이터 타입의 객

Stack, Heap 메모리프로그램이 사용하는 메모리는 여러 segments들로 나뉜다Code SegmentText segment라고도 하며 컴파일 된 프로그램 코드가 저장되는 메모리다, 일반적으로 read-only임BSS Segment명시적으로 초기화되지 않은 전역변

가변 인자 리스트이제까지 함수는 전달받을 매개변수의 수가 미리 알려져야 했다, 하지만 C++의 가변 인자 리스트(Ellipsis)지정자를 사용하면 가변적인 수의 매개변수를 함수로 전달할 수 있다이러한 가변 인자 리스트는 잠재적으로 위험하기 때문에 권장하지 않는다기본적인

람다 캡처다음 코드를 확인해보자위 코드는 컴파일 되지 않는다일반적인 { }블록은 블록 외부의 모든 데이터에 접근이 가능하지만 lambda는 외부에서 정의된 특정한 데이터에만 접근이 가능하다여기서 특정 데이터는 static한 수명을 가진 객체 (전역 변수, static

연산자 오버로딩C++에서 연산자는 함수로 구현된다, 이전에 정리했던 함수 오버로딩을 연산자 함수에 적용함으로써 다양한 데이터 타입에 작동하는 연산자 버전을 정의할 수 있다이렇게 함수 오버로딩을 사용해서 연산자를 오버로딩 하는걸 연산자 오버로딩이라고 한다위 코드에서 a

멤버 함수 오버로딩연산자 오버로딩은 friend함수, 일반 함수(비멤버), 멤버 함수로 오버로딩이 가능하다멤버 함수로 연산자 오버로딩에서 왼쪽 피연산자는 암시적으로 \*this객체가 되고 다른 피연산자는 매개변수가 된다f1 + f1는 f1.operator+(f2);로

첨자 연산자 오버로딩만약 클래스의 멤버변수로 배열이 있다고 가정해보고 element에 접근하여 값을 수정한다고 해보자만약 위와 같은 상태라면 배열이 private:에 있기 때문에 접근할 방법이 존재하지 않는다가장 일반적인 방법은 Getter/Setter를 만들어 사용하

얕은 복사, 깊은 복사C++ 컴파일러가 제공하는 암시적 복사 생성자와 암시적 복사 대입 연산자는 멤버별 복사 방식을 사용한다, 이러한 복사를 얕은 복사 (shallow copy)라고 한다얕은 복사란 클래스의 각 멤버 변수를 그대로 복사하는 방식이다, 클래스가 동적 할당

스마트 포인터의 기본 개념위와 같은 함수가 있을 때 메모리 동적할당 후 delete를 하지 않는 경우가 종종 발생하여 메모리 누수가 발생할 수 있다반드시 기억해서 delete를 한다고 해도 함수가 early return이나 예외처리가 되어버리면서 delete가 되지 않

std::move위와 같이 이동을 사용하지 않는 Swap은 복사가 많이 발생하기 때문에 성능상 좋지 않다따라서 이러한 swap을 복사가 아닌 이동을 통해 구현해야 하는데 매개변수 a,b가 r-value 참조가 아닌 l-value 참조이기 때문에 이동 생성자/이동 대입

std::initializer_list이러한 배열을 초기화 하고 싶다면 초기화 리스트 구문을 사용하여 초기화가 가능하다물론 동적 할당 배열에도 동일하게 동작한다하지만 사용자 정의 클래스에서는 어떨까?IntArray는 element가 index인 배열을 간단하게 구현해본

접근 지정자접근 지정자에는 public, private, protected가 있고 public의 멤버는 누구나 접근이 가능하고 private의 멤버는 같은 클래스의 멤버 함수나 friend에 의해서만 접근이 가능하다, protected는 상속관계인 자식에서는 접근이 가

다중 상속이제까지 단 한개의 부모 클래스만을 상속받는 단일 상속을 정리했지만 C++은 하나 이상의 부모 클래스를 상속 받을 수 있는 다중 상속을 지원한다,로 단일 상속들을 구분해서 여러개 상속받을 수 있다MixinMixin은 특정 클래스에 속성을 추가하기 위해 상속될

overrideoverride와 final은 상속과 관련된 몇가지 문제를 해결하기 위해 C++에서 도입된 지정자이다 (키워드 아님)자식 클래스에서 부모 클래스의 가상 함수를 override 하려면 부모 클래스의 함수 시그니처와 반환 타입이 정확히 일치해야 한다 (con

virtual table위 코드의 결과는 Base,Derived가 나오게 된다, 이유는 getName()은 가상함수가 아닌 일반 멤버 함수이기 때문에 정적 타입인 Base클래스 타입의 함수가 호출되는 것이고 getNameVirtual()은 가상함수이기 때문에 런타임에

dynamic_cast부모 클래스 포인터만 가지고 있는 상태에서 자식 클래스에만 존재한 데이터에 접근하고 싶을 때 어떻게 해야할까?이때 여기서 Base\*타입인 b를 이용하여 Derived::getName()을 어떻게 호출할 수 있을까?우선 첫번째 방법은 이전에 정리했

Template class이제까지 function template으로 여러 다른 데이터 타입과 함께 동작하는 함수를 만들어 사용했다class template도 마찬가지로 여러 타입에 대응할 수 있는 클래스를 만들어준다예를 들어 array를 만들어주는 class를 한번

부분 템플릿 특수화다음과 같은 코드가 있다고 가정해보자이 StaticArr클래스는 두개의 템플릿 매개변수를 가진다, 하나는 타입 매개변수인 T이고 나머지는 비타입 매개변수인 size이다따라서 StaticArr<int, 4>, StaticArr<double,

예외프로그래밍을 하다보면 오류처리는 필수이다가장 기본적인 오류처리로 함수를 구현할때 return값으로 처리하는 방법이 있다이렇게 원하는 결과값을 찾을 수 없는 상태라면 -1을 return하여 오류 처리를 했다하지만 이러한 방법은 여러 단점들을 가지고 있다반환값이 모호하

Rethrowing exception예외를 catch했지만 해당 catch에서 예외를 완전히 처리하고 싶지 않거나 처리할 수 없을경우에 예외를 다시 던질 수 있다예를 들면 다음과 같다이렇게 반환형이 있는 함수라면 호출자에게 해당 작업이 실패했음을 알리기 쉽다그렇다면 반

I/O streamC++에서 입출력 기능은 STL을 통해 제공된다 (std namespace에 포함되어 있음), < iostream >헤더를 include하여 cin과 cout을 사용할 수 있다iostream 헤더에는 입출력 기능을 제공하는 클래스가 존재한다, i

String StreamI/O stream과 비슷하게 string 전용 stream 클래스도 존재한다string stream은 istream, ostream과 같이 데이터를 담아두는 buffer를 제공한다, string stream의 주된 용도는 바로 나중에 표시할 문

File I/OC++에서의 파일 입출력 클래스는 대표적으로 3가지가 존재한다ifstream (istream에서 파생)ofstream (ostream에서 파생)fstream (iostream에서 파생)이러한 파일 입출력 클래스를 사용하려면 < fstream > 헤더