vcpkg는 Microsoft에서 배포하고 C++ 커뮤니티에서 유지 및 관리하는 오픈 소스 C/C++ 패리지 관리자이다. C/C++ 개발자 환경의 고유한 문제를 해결하기 위해 처음부터 설계되었다.2016녕에 시작된 이 기능은 개발자가 프로젝트를 최신 버전으로 마이그레이
STL(Standard Template Library)은 이름 그대로 템플릿을 사용해서 만들어진 라이브러리이다. STL은 일반적으로 많이 사용하는 클래스와 함수들이 만들어져 있는데, 예를 들어 링크드 리스트(Linked List), 동적 배열 클래스, 정렬 함수, 검색
iostream 헤더 파일을 보면 다음과 같이 cout과 cin 객체를 선언하고 있다. extern이 붙어 있는 것을 봐서는 실체 객체의 정의는 어딘가 구현 파일에 있을 것으로 예상할 수 있다.extern ostream cout;extern istream cin;중요한
C++ 개발자가 선호하는 11가지 라이브러리를 소개한다.액티브 템플릿 라이브러리 (Active Template Library, ATL)는 COM(구성 요소 개체 모델) 개체를 만들 수 있는 템플릿 기반 C++ 클래스의 세트이다.Asio C++ Library는 네트워크
반환 값을 사용한 예외 처리 다음의 예제를 살펴보자. 실행 결과는 다음과 같다. SetAt() 함수에서는 잘못된 인덱스를 받았을 때 계속해서 작업을 진행하는 대신 자신을 호출한 곳에 문제가 발생했음을 알려주어야 한다. 그리고 전통적으로 이런 일은 함수의 반환 값을
구조적 예외 처리는 예외 상황을 효율적으로 처리할 수 있게 도와주지만 잘못 사용하는 경우에는 화를 입을 수도 있다. 구조적 예외 처리에는 어떤 문제점이 존재하고 또 어떻게 해결해야 하는지 알아보자.구조적 예외 처리에서 가장 빈번하게 일어나는 문제는 리소스를 정리하기 전
C++ 상속을 다루며 많이 보았던 키워드는 virtual 키워드일 것이다. virtual에 비해 많이 보지 못했던 키워드는 override와 final 키워드일 것이다. override와 final 키워드는 C++11 이후에 등장하는 키워드라서 그렇다. 고로 오래된
C++11부터 생성자에서 default, delete 키워드 선언이 가능해졌다. 생성자에 default와 delete 키워드는 특별한 의미를 가지며, 각각 생성자나 메서드의 기본 구현을 지정하거나 사용을 금지하는 데 사용된다. 이를 통해 더 명확하고 제어된 객체 생성과
포인터 변수를 정의할 때, const를 최대 2개까지 포함할 수 있다. 그 이유는 포인터 변수는 2개의 정보와 관련이 있기 때문이다.포인터 변수 자체에 보관된 정보.포인터 변수가 가리키는 변수에 보관된 정보.즉, 이 두 가지 정보에 대해서 const 여부를 설정할 수
Summary Boost를 이용하여 C++함수를 Wrapping하여 .pyd로 만들어, Python에서 사용하는 일이 생겼다. 그래서 이곳에 정리하면서 진행한다. Boost Python Library는 Python과 C++를 인터페이스하기 위한 프레임워크이다. 이를
Smart PointerC++11 부터 사용 가능한 조금 더 안전한 포인터메모리 할당을 받을 때, 소유권에 대한 정보가 있다.명시적인 delete 구문이 필요없다.std::unique_ptr<>해당 메모리 블록을 단독으로 소유std::shared_ptr<>해
두 가지 모두 클래스의 속성과 기능을 직접 구현하지 않고 이전에 정의된 것을 재활용하는 방법을 말한다. 다중 상속은 새 클래스에서 기존 클래스를 코드로 구현하지만, 컴포지션과 어그리게이션은 멤버 객체로 참조하는 방법이다.다중 상속(multi inheritance)은 부
추상 클래스(abstract class)는 이름처럼 추상적인 클래스이다. 이때 추상적이라는 말은 구체적이지 않다는 뜻이다. 클래스가 구체적이지 않다는 것은 명확한 정의가 없다고 할 수 있다. 클래스에 순수 가상 함수가 하나라도 있으면, 추상 클래스라고 한다.일반 함수나
SOLID 원칙은 로버트 C. 마틴이 2000년대 초반에 발표한 객체지향 설계의 다섯 가지 원칙을 마이클 C. 페더스가 부르기 쉽게 머리글자로 소개한 것이다. SOLID는 소프트웨어의 유지/보수와 확장성에 도움이 되는 다섯 가지 기본 원칙이다.Single Respons
함수 템플릿은 여러 가지 데이터 형식을 처리하는 방법이지만, 특정 데이터 형식만 다른 알고리즘으로 처리하게 만들 수도 있다. 이처럼 특수한 상황일 때만 별도의 함수 템플릿으로 만들어 처리하는 방법을 템플릿 특수화 (template specialization) 라고 한다
클래스 템플릿은 템플릿을 클래스에 적용한 것으로, 템플릿 매개변수를 활용해 다양한 형식에 대응할 수 있는 범용 클래스를 만드는 방법이다. 클래스 템플릿은 함수 템플릿보다 조금 복잡하지만, 기본적인 문법은 그리 어렵지 않다.보통은 클래스 템플릿을 직접 선언하기보다는 라이
string은 유니코드 (unicode)를 지원하지만, 상황에 맞게 적절한 데이터 형식과 인코딩을 선택하여 유니코드 문자열을 처리해야 하는 번거로움이 있다. 그래서 C++11부터는 std::wstring이라는 와이드 문자열 형식을 제공한다. wstring은 와이드 문자
파일 시스템이란 데이터를 저장하고 관리하는 체계를 의미한다. 이러한 파일 시스템은 운영체제에 따라 디렉토리, 파일 종류, 권한, 상태, 속석 등의 구조가 다르다. 따라서 운영체제마다 파일 시스템 프로그래밍에서 사용하는 헤더 파일과 사용 방법이 다르다. C++ 표준 라이
프로그래밍을 하다 보면 난수가 필요할 때가 많다. 특히 게임 분야에서 난수는 매우 중요하다. 난수란 정의된 범위에서 무작위로 추출된 임의의 수를 의미한다. 난수는 그 다음에 나올 값을 누구도 확신할 수 없어야 한다. 컴퓨터 프로그래밍에서 난수를 만들 때는 보통 시드(s
표준 라이브러리에서는
프로그래밍에서 복사는 두 가지 종류가 있다. 하나는 얕은 복사 (shallow copy), 다른 하나는 깊은 복사 (deep copy)이다.얕은 복사주소값을 복사깊은 복사실제 값을 새로운 메모리 공간에 복사얕은 복사는 복사 대상이 주소값이므로 참조하는 값이 서로 같다.
표준 템플릿 라이브러리 (Standard Template Library, STL)는 표준 라이브러리의 일부로서 템플릿에 기반을 둔 컨테이너, 알고리즘, 반복자 등을 구현한 클래스와 함수를 가리키는 용어이다. 표준 템플릿 라이브러리를 사용하면 특정한 데이터 형식이나 알고
순차 컨테이너 (Sequential Container) 컨테이너는 종류에 따라 다음 3가지 범주로 나눌 수 있다. 각 범주에서 대표적인 컨테이너를 소개하고 어떤 상황에서 활용할 수 있는지 살펴보자. 순차 컨테이너 데이터가 순서대로 삽입되는 컨테이너이다. 연관 컨
연관 컨테이너는 데이터를 저장하고 검색할 때에 사용한다. 특정 키(key)를 사용하여 데이터를 효율적으로 검색할 수 있다. 연관 컨테이너의 내부 구조는 트리나 해시 테이블과 같은 최적화된 데이터 구조를 사용하므로 검색 작업의 시간 복잡도가 일반적으로 O(log n) 또
컨테이너 어댑터(container adapter)를 간단ㄷ하게 요약하면, 다른 컨테이너를 기반으로 새로운 기능을 제공하는 컨테이너 라고 말할 수 있다. 즉, 기존의 컨테이너를 감싸서 새로운 인터페이스를 제공한다.예를 들어 std::stack 컨테이너 어댑터는 std::
코드를 작성하다 보면 종종 복잡한 문제에 직면하고 이를 해결하고자 효율적이고 정확한 방법을 찾는다. 이때 C++ 표준 라이브러리의 알고리즘은 신뢰할 수 있는 길잡이 역할을 한다.알고리즘은 코드의 복잡도를 줄이고 효율성을 높일 수 있으며, 다양한 작업을 단순화하고 최적화
기존 C++ 표준으로도 프로그램을 만들 수 있지만, 모던 C++에 추가된 개념과 기능을 활용하면 좀 더 효율적이고 안정된 프로그램을 만들 수 있다.C++98은 언어의 기본 골격을 완성한 최초의 표준이다. 언어가 표준화되었다는 것은 언어의 방언(사투리)이 생기지 않는다는
모던 C++에 추가된 데이터 형식 가운데 가장 많은 변화를 가져온 auto에 대해 알아보자.모던 C++에서는 형식 추론을 말할 때 형식 연역(type deduction)이라는 단어를 사용한다. auto는 형식 연역을 할 수 있는 형식 지정자(type specifier)
모던 C++에서는 변수나 함수를 상수 표현식(constant express)으로 만들어 주는 constexpr 키워드를 제공한다. 모던 C++이전에도 변수를 변경할 수 없도록 상수로 지정하는 const가 있었지만, constexpr은 변수나 함수를 컴파일 타임에 상수
function은 std 네임스페이스에 속한 함수 객체이다. 함수 객체는 함수는 아니지만 함수처럼 호출할 수 있도록 정의한 객체를 말한다.함수 포인터는 포인터를 활용하여 함수를 호출하는 방법이다. 함수 호출은 메모리에서 함수의 주소값을 찾아가는 명령이므로 함수 포인터로
C++의 대표적인 특징은 메모리를 직접 관리할 수 있다는 점이다. 즉, 필요할 때 메모리를 할당하고 필요하지 않을 때 메모리를 해제할 수 있다. 덕분에 C++ 언어로 만든 프로그램은 메모리를 효율적으로 사용해 성능이 좋지만, 메모리 할당과 해제 등을 개발자가 직접 관리
범위 기반 for문은 개발자가 반복을 직접 제어하지 않고 대상 데이터 집합의 크기만큼만 순회하는 방법이다. 형식은 다음과 같다.기존 for문은 개발자가 지정한 횟수를 반복해서 작업하고 이를 활용해 데이터에 접근하므로 어떤 데이터 형식이든지 순회할 수 있었다. 반면에 범
if나 switch, for 같은 제어문에서 사용할 변수를 제어문 외부에서 초기화하면 코드를 읽을 때 혼란스러울 수 있다. 이를 보완하는 문법이 바로 초기화 구문(init-statement)이다. 예를 들어 다음 코드에서는 element 변수를 if문 외부에서 함수가
람다 표현식은 람다식, 람다 함수로도 부르지만, C++에서 정확한 용어는 람다 표현식(lambda expression)이다. 함수형 언어나 파이썬 같은 인터프리터를 사용하는 언어에서 사용되던 클로저(closure)가 네이티브 프로그래밍 언어에 도입되면서 람다 함수, 람
C++17 부터 도입된 폴드 표현식(fold expression)은 개수가 정해지지 않은 매개변수를 하나로 묶은 매개변수 팩(parameter pack)을 반복해서 계산해 준다. C++11부터 도입된 가변 인수 템플릿(variadic templates)의 재귀 호출을
3방향 비교 연산자를 알아보기 전에 객체 비교에 관해 알아보자. 정수형처럼 기본 형식의 데이터를 비교하는 것은 명확하다. 숫자 1은 숫자 2보다 결코 클 수 없다. 하지만 비교할 대상이 클래스나 구조체라면 어떨까?예를 들어 클래스 객체를 특정 멤버 변수 기준으로 오름차
using은 지금까지는 네임스페이스를 생략하는 데에 주로 사용했다. 여기서는 상속 멤버의 접근 지정자 변경, 열거형 사용 선언, 별칭(alias) 등 using의 다양한 활용버을 살펴보자.using 키워드는 자식 클래스에서 부모 클래스의 멤버 접근 지정자를 변경할 때
함수를 만들 때 사용할 수 있는 키워드를 알아보자. 이 키워드들은 함수를 만든 목적과 사용 방법을 명확히 함으로써 개발자 본인은 물론이고 공동 작업자나 라이브러리 사용자가 정확히 이해하고 사용할 수 있도록 돕는다.함수의 목적과 사용 방법을 알리는 가장 확실한 방법은 잘
using VS #define
throw 문을 가지고 있는 함수는 함수 선언문에 예외 발생을 명시할 수 있다. 그 형식은 함수에서 발생시키는 모든 예외 타입을 함수 원형 뒤에 throw()의 괄호 안에 나열한다.예를 들면, int 타입과 char\* 타입의 예외를 던질 수 있도록 작성된 foo()
예외 값으로 int, double 등의 기본 타입을 사용할 때보다 클래스를 사용하면 catch() {} 블록에 더 많은 정보를 전달 할 수 있다. 다음은 예외 값으로 사용할 클래스를 작성하여 실행하는 예이다.
C언어의 역사가 오래된 만큼 C언어로 작성된 많은 라이브러리와 소스 코드가 존재하며, 지금도 C언어는 여러 분야에서 활발히 사용되고 있다. 현재 많은 C++ 프로그램 개발자들이 기존에 작성된 C 소스 코드를 이용하거나 C 라이브러리를 사용하고 있기 때문에, C++ 프로
DLL (동적 라이브러리)에 구현한 함수를 외부에 노출 시키려면 \_\_declspec(dllexport) 키워드를 사용해야 한다.\_\_declspec(dllexport) 키워드가 붙지 않은 함수는 외부에서 호출할 수 없다.\_\_declspec(dllimport/d
배열 인덱스 연산자 오버로딩을 사용하면, 배열에 사용하는 \[] 연산자를 객체에도 사용할 수 있다.\[] 연산자 오버로딩은 일반적으로 많은 객체를 저장하고 관리하는 객체에 사용된다.\[] 연산자 오버로딩은 일반적으로 컨테이너 객체에 사용된다. 컨테이너 객체가 관리하는
\*, -> 연산자는 스마트 포인터나 반복자(iterator) 등의 특수한 객체에 사용된다. 반복자가 STL의 핵심 구성 요소이므로 \*, -> 연산자 오버로딩이 아주 ❗중요 하다.스마트 포인터는 일반 포인터의 기능에 몇 가지 유용한 기능을 추가한 포인터처럼 동작하는
사용자가 직접 정의해서 사용할 수 있는 타입 변환은 두 가지가 있다.생성자를 이용한 타입 변환.타입 변환 연산자 오버로딩을 이용한 타입 변환.특정 타입을 인자로 받는 생성자가 있다면 생성자 호출을 통한 타입 변환(객체 생성 후 대입)이 가능하다. 생성자를 이용해 다른
함수 객체(Function Object)는 함수처럼 동작하는 객체이다. 함수처럼 동작하려면 객체가 ( )연산자를 정의해야 한다. 다시 말해 ( )연산자를 오버로딩한 객체이다. 함수 객체는 함수자(Functor)라 불리기도 한다.functor는 객체지만 함수처럼 호출할