전체 글 262

[Functional C++] 함수형 프로그래밍 (1) 불변성과 순수 함수

C++으로 함수형 프로그래밍을 작성하는 방법을 알아본다. 함수형 프로그래밍이 필요한 이유 짝수의 합, 홀수의 합, 모든 합을 구하는 예시 프로그램 struct Sums { int evenSum; int oddSum; int totalSum; }; const Sums sums(const vector& numbers) { Sums theTotals; for (auto iter = numbers.begin(); iter != numbers.end(); ++iter){ int number = *iter; if (number % 2 == 0) theTotals.evenSum += number; if (number % 2 == 1) theTotals.oddSum += number; theTotals.totalSum..

Advanced C++ 2022.10.03

정적 라이브러리, 동적 라이브러리

라이브러리 관련 지식 정리. Library 라이브러리란 사용하고자하는 함수를 미리 컴파일하여 목적 코드로 만든 이후 목적 코드를 모아 만든 .lib을 링크하여 사용하는 것을 라이브러리라고 한다. 정적 라이브러리 Static Library (.lib 혹은 .a) 정적 라이브러리를 사용하여 자신의 프로젝트 코드를 컴파일 할 때 컴파일러는 사용자 함수에서 라이브러리 함수를 호출하는 경우 해당 함수의 목적 코드를 크게 두 가지 형태로 실행 파일에 담는다. 1. 사용자 함수를 목적 코드로 만드는 과정에서 라이브러리 함수 내용도 같이 담을 수 있다. (주로 인라인이 가능한 함수들) 2. 라이브러리 함수나 프로시저의 내용이 클 경우 등 해당 라이브러리 함수나 프로시저 실행 명령어(목적 코드)를 실행 파일에 포함시키되..

[C++] Protobuf (Google Protocol Buffer) 라이브러리

Protobuf JSON과 같은 메시지 직렬화/역직렬화 라이브러리로 이진 데이터 직렬화로 효율적인 메모리 사용하고 빠른 메시지 파싱 및 다중 언어를 지원한다는 특징이 있다. 메시지의 프로토콜은 .proto 파일로 정의하여 protoc라는 실행 파일로 (cpp의 경우) .pb.h / pb.cc를 자동 생성한다. message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; } Protobuf의 직렬화 원리 다음 글을 읽어보면 좋다. 기본적으로 Key-Value 쌍으로 이루어진 이진 데이터로 인코딩 되는데 https://medium.com/naver-cloud-platform/nbp-%EA%B8%B0%EC..

Advanced C++ 2022.09.27

[Boost] 문자열 다루기

boost 에서 문자열을 다루는 방법을 알아본다. boost::lexical_cast 정수형 실수형 값을 문자열로 바꾸거나 반대로 문자열을 정수형, 실수형 값으로 변환할 때 사용한다. 기본 사용 문자열에서 값으로 변환하기, 타입으로 넘겨준다. auto i = boost::lexical_cast("100"); char chars[] = { 'x', '1', '0', '0', 'y' }; auto i2 = boost::lexical_cast(chars + 1, 3); 해당 변수에 담을 수 없는 값으로 변환하거나 변환이 불가능하다면 boost::bad_lexical_cast를 던진다. try { auto sh = boost::lexical_cast("100000"); } catch (const boost::b..

C++/Boost 2022.08.21

[Boost] thread

boost thread 사용법을 알아본다. 대부분의 기능은 C++11에 표준화되어 헤더에 포함되어 있다. 필요 헤더 #include thread 사용하기 static bool is_first_run() { return true; } static void fill_file(char fill_char, std::size_t size, const char* filename); static void p_example() { if (is_first_run()) { boost::thread(boost::bind(&fill_file, 0, 8 * 1024 * 1024, "save_file.txt")).detach(); } } 실행하고자 하는 함수를 전달하여 스레드를 만들어 실행하도록 한다. detach()는 프로그램..

C++/Boost 2022.08.21

[Boost] any / variant / optional

boost::any C#, JAVA와 같이 모든 타입을 지칭할 수있는 타입을 제공한다. 필요 헤더 #include 모든 타입을 담을 수 있는 클래스 void example2() { boost::any variable(std::string("Hello World!")); // if casting failed, may throw boost::bad_any_cast string s1 = boost::any_cast(variable); // if casting failed, s2 is null string* s2 = boost::any_cast(&variable); } 값에 대한 any_cast는 타입이 맞지 않을 시 boost::bad_any_cast를 던진다. 포인터에 대한 any_cast는 null로 대체..

C++/Boost 2022.08.20

[Boost] program_options

boost의 program_options을 사용해본다. 프로그램 시작 인수를 ./program.exe --option=value 과 같이 실행하고 필요 정보를 출력할 수 있게 해준다. 필요 헤더 #include 사용 방법 1. options_description 개체를 정의를 해준다. 2. 프로그램 인수를 파싱한다. 3. 프로그램 인수를 적용한다. 특징 options_description의 add_option()을 할 때 인수를 필수로 지정하거나 기본값을 지정하는 등을 할 수 있다. ./program.exe --help를 통해 옵션 정보를 출력할 수 있다. .cfg 파일을 통해 인수를 설정할 수 있다. #include "global.h" #ifdef _DEBUG #pragma comment(lib, "l..

C++/Boost 2022.08.20

[Boost] 라이브러리 설치

C++ 고급 기능을 사용할 수 있는 boost 라이브러리를 설치해본다. https://www.boost.org/ Boost C++ Libraries Welcome to Boost.org! Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work well with the C++ Standard Library. Boost libraries are intended to be widely useful, and usable across a broad spectrum of applications www.boost.org 공식 사이트 기준 boost 1.80.0 버전을 사용할 수 있다. 라이브러리 소..

C++/Boost 2022.08.20

[C++] Redis 사용하기

C++ Redis 라이브러리를 사용해본다. Redis 데이터 베이스 서버에서 쿼리로 조회하는 것보다 캐시 서버(Redis)를 둬 I/O를 동반한 데이터 베이스 서버보다 빠르게 데이터를 가져오기 위해 사용한다. 기본적으로 key-value 쌍의 데이터를 저장한다. Redis 는 C언어로 작성된 hiredis 라이브러리를 의존하는 C++ 라이브러리를 사용할 예정이다. C hiredis https://github.com/redis/hiredis GitHub - redis/hiredis: Minimalistic C client for Redis >= 1.2 Minimalistic C client for Redis >= 1.2. Contribute to redis/hiredis development by crea..

Advanced C++ 2022.08.18

[C++] CryptoPP 암호화/복호화 라이브러리

CryptoPP 라이브러리를 사용해본다. https://www.cryptopp.com/ Crypto++ Library 8.7 | Free C++ Class Library of Cryptographic Schemes hash functions BLAKE2b, BLAKE2s, Keccack (F1600), SHA-1, SHA-2, SHA-3, SHAKE (128/256), SipHash, LSH (128/256), Tiger, RIPEMD (128/160/256/320), SM3, WHIRLPOOL www.cryptopp.com SHA(Secure Hash Algorithm) 해시 함수 미 국가보안국(NSA)에서 개발한 암호화 해시 생성 알고리즘으로 Merkle–Damgård construction 에 기반..

Advanced C++ 2022.08.11