2019/11/06
6C++ 펑터 또는 펑크터(functor)
펑터 또는 펑크터라고 하는데, 여기선 펑터라고 하겠습니다. 많은 STL 알고리즘들이 펑터(Functor)라고 부르는 함수 객체(Function object)를 많이 사용합니다. 펑터는 함수처럼 ()과 함께 사용할 수 있는 객체입니다. 일반 함수의 이름, 함수를 지시하는 포인터, () 연산자가 오버로딩된 클래스 객체 모두 펑터가 될 수 있습니다. #include class Money { private: int _Money = 0; public: int operator()() { return this->_Money; } void operator()(int N) { this->_Money += N; } }; int main(void) { Money money; money(100); //void operator..
프로그래밍/C++ 2019.11.06 2 PlorenceC++ 생각보다 많이 모르는 삼항 연산자의 특성
https://docs.microsoft.com/ko-kr/cpp/cpp/conditional-operator-q?view=vs-2019 해당 문서만 봐도 해당 게시글에서 설명하는 것은 다봤다고 해도 무방합니다. exp1 ? exp2 : exp3; 라는 삼항 연산자가 있을 때.. exp2과 exp3의 타입이 동일하다면 lvalue이다. 당연히 exp2와 exp3도 lvalue일때를 말합니다. char A = 'a'; char B = 'A'; (1 ? A : B) = 'B'; C는 컴파일 에러가 발생하고 C++에서는 이것이 허용됩니다. exp2과 exp3의 타입이 다르다면 형 변환이 일어난다. 제가 삼항 연산자를 더 알아본 이유입니다. #include int main(void) { char Result =..
프로그래밍/C++ 2019.11.06 PlorenceC++ mutable 키워드
mutable 키워드는 특정 구조체나 클래스가 const로 선언되어 있다 하더라도 특정 멤버를 변경할 수 있음을 나타내는 데 사용할 수 있습니다. 예제 의도는 const 객체여도 int형 변수의 읽기/쓰기가 가능한 클래스를 만들려고 합니다. (cosnt의 의도를 완전히 무시하는 거라 좋지 못하고 불필요한 클래스입니다.) #include class TEST { private: int number; public: void SetNumber(int n) const { number = n; } int GetNumber() const { return number; } }; int main(void) { TEST test1; const TEST test2; test1.SetNumber(100); test2.SetN..
프로그래밍/C++ 2019.11.06 PlorenceC++ 일반화 프로그래밍과 반복자(iterator)
STL는 일반화 프로그래밍(generic programming)의 한 예입니다. 객체 지향 프로그래밍은 프로그래밍의 데이터 측면을 중시하지만, 일반화 프로그래밍은 알고리즘에 중점을 둡니다. 두 프로그래밍 패러다임에 공통적인 것은, 데이터의 추상화와 재활용이 가능한 코드의 작성입니다. 추구하는 철학은 완전히 다른데, 일반화 프로그래밍의 목적은 데이터형과 무관한 코드를 작성하는 것입니다. 템플릿은 일반화 프로그램을 작성하는 C++의 도구입니다. 이터레이터가 필요한 이유 이터레이터를 이해하는 것이 STL을 이해하는 열쇠입니다. 템플릿이 알고리즘을 저장할 데이터형과 무관하게 만드는 것처럼, 이터레이터는 알고리즘을 사용할 컨테이너형과 무관하게 만듭니다. 이터레이터는 STL의 일반화 접근에 필수 구성 요소입니다. ..
프로그래밍/C++ 2019.11.06 PlorenceC++ 표준 템플릿 라이브러리(STL) 의미
표준 템플릿 라이브러리(STL: Standard Template Library) 표준 템플릿 라이브러리는 컨테이너(Container), 이터레이터(iterator), 함수 객체(Function object), 알고리즘(algorihm)을 나타내는 템플릿의 결합을 제공합니다. 컨테이너는 배열과 같이, 여러 개의 값을 저장할 수 있는 구성 단위입니다. 알고리즘은, 배열을 정렬하거나 리스트에서 특정 값을 검색하는 것과 같은, 특별한 작업들을 수행하기 위해 사용하는 방법입니다. 이터레이터는 배열 안에서 포인터를 사용하여 위치를 옮기듯이, 컨테이너 안에서 위치를 옮길 수 있도록 도와 주는 객체들입니다.(즉 이터레이터는 포인터의 일반화.) 함수 객체는 함수와 비슷한 역할을 하는 객체입니다. 함수 객체는 클래스 객체..
프로그래밍/C++ 2019.11.06 PlorenceC++ 스마트 포인터(smart pointer)
smart pointer는 포인터처럼 행동하는 클래스 객체입니다. 스마트 포인터는 동적 메모리를 관리하기 위해 있는데 포인터 변수이 스택에서 해제된다면 지시하는 메모리 블럭도 같이 할당 해제가 됩니다. 스마트 포인터는 왜 필요한가? void test() { std::string * str = new std::string("Hello!!"); //작업후에 if (str->length() == 0) { throw std::exception(); } delete str; return; } 해당 함수는 예외가 발생하면 delete 구문은 실행할 수 없습니다. (예외가 발생할 수 없는 함수지만, 발생한다고 가정해봅시다.) 그래서 포인터 변수 str가 가리키는 메모리 블록은 할당 해제하지 않습니다. 결국엔 memo..
프로그래밍/C++ 2019.11.06 Plorence