프로그래밍/C++

57

C++ vector와 valarray, 그리고 array 중 뭘 써야 할까?

이 클래스들은 서로 다른 목적을 가지고 서로 다른 그룹들에 의해 개발되었습니다. 먼저 vector 템플릿 클래스는 컨테이너 클래스와 알고리즘으로 구성된 시스템의 일부입니다. vector 클래스는 정렬, 삽입, 재배치, 검색, 다른 컨테이너로의 데이터 전송, 그 밖의 조작과 같은 컨테이너 지향적인 액티비티들을 지원합니다. 반면에 valarray 템플릿 클래스는 수치 계산을 지향하며 STL의 일부가 아닙니다. (valarray 템플릿 클래스은 push_back(), insert() 메서드를 가지고 있지 않음.) 그러나 많은 수학적 연산에 대해 간단하고 직관적인 인터페이스를 제공합니다. valarray 템플릿 클래스은 객체의 내용을 합하는 sum() 메서드, 최댓값을 리턴하는 max() 메서드, 최솟값을 리턴..

프로그래밍/C++ 2019.11.07 Plorence

C++ 펑터 또는 펑크터(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 Plorence

C++ 생각보다 많이 모르는 삼항 연산자의 특성

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 Plorence

C++ 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 Plorence

C++ 일반화 프로그래밍과 반복자(iterator)

STL는 일반화 프로그래밍(generic programming)의 한 예입니다. 객체 지향 프로그래밍은 프로그래밍의 데이터 측면을 중시하지만, 일반화 프로그래밍은 알고리즘에 중점을 둡니다. 두 프로그래밍 패러다임에 공통적인 것은, 데이터의 추상화와 재활용이 가능한 코드의 작성입니다. 추구하는 철학은 완전히 다른데, 일반화 프로그래밍의 목적은 데이터형과 무관한 코드를 작성하는 것입니다. 템플릿은 일반화 프로그램을 작성하는 C++의 도구입니다. 이터레이터가 필요한 이유 이터레이터를 이해하는 것이 STL을 이해하는 열쇠입니다. 템플릿이 알고리즘을 저장할 데이터형과 무관하게 만드는 것처럼, 이터레이터는 알고리즘을 사용할 컨테이너형과 무관하게 만듭니다. 이터레이터는 STL의 일반화 접근에 필수 구성 요소입니다. ..

프로그래밍/C++ 2019.11.06 Plorence

C++ 표준 템플릿 라이브러리(STL) 의미

표준 템플릿 라이브러리(STL: Standard Template Library) 표준 템플릿 라이브러리는 컨테이너(Container), 이터레이터(iterator), 함수 객체(Function object), 알고리즘(algorihm)을 나타내는 템플릿의 결합을 제공합니다. 컨테이너는 배열과 같이, 여러 개의 값을 저장할 수 있는 구성 단위입니다. 알고리즘은, 배열을 정렬하거나 리스트에서 특정 값을 검색하는 것과 같은, 특별한 작업들을 수행하기 위해 사용하는 방법입니다. 이터레이터는 배열 안에서 포인터를 사용하여 위치를 옮기듯이, 컨테이너 안에서 위치를 옮길 수 있도록 도와 주는 객체들입니다.(즉 이터레이터는 포인터의 일반화.) 함수 객체는 함수와 비슷한 역할을 하는 객체입니다. 함수 객체는 클래스 객체..

프로그래밍/C++ 2019.11.06 Plorence

C++ 스마트 포인터(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

C++ 데이터형 변환 연산자(cast 연산자)

C에서는 데이터형 변환이 너무 느슨합니다. 이러한 느슨함을 해결하기 위해 Stroustrup(C++ 개발자)는 일반적인 데이터형 변환을 허용하는 것을 공고히 하고 데이터형 변환 과정을 더욱 엄격하게 규정하는 4개의 데이터형 변환 연산자를 추가하였습니다. dynamic_cast const_cast static_cast reinterpret_cast dynamic_cast dynamic_cast를 쓸려면 프로젝트에서 RTTI옵션을 활성화해야 합니다. #include class Animal { public: virtual void Move() { std::cout

프로그래밍/C++ 2019.11.04 Plorence

C++ RTTI(Runtime Type Infomation or Runtime Type Identification)

RTTI는 RunTime Type Identification 또는 RunTIme Type Information의 약자로 실행 시간 데이터형 정보라는 뜻입니다. 오래된 C++은 대다수가 지원 안 하며 어떤 C++은 켜거나 끌 수 있는 옵션이 있습니다. (visual studio는 옵션이 있지만, 디폴트로 체크되어 있습니다. 만약 해제하고 사용한다면 런타임 에러가 발생합니다.) (프로젝트 우클릭 -> 속성 -> C/C++ -> 언어 -> 런타임 형식 정보 사용) RTTI RTTI의 목적은 프로그램이 실행 도중에 객체의 데이터형을 결정하는 표준 방법을 제공하는 것입니다. 기초 클래스부터 상속된 클래스 계층이 있다고 하면 어떤 클래스의 객체인지에 따라 다른 처리를 해야 한다면 RTTI를 사용해야 합니다. RTT..

프로그래밍/C++ 2019.11.04 Plorence

C++ 예외 발생 후 고려해야할 문제

예외가 발생한 후에도 문제를 일으킬 수 있는 두 가지 가능성이 있습니다. 예외가 발생했을 때 예외 지정자 리스트에 있는 데이터형들과 일치하는 게 없을 때 일치하는 게 없다면 그 예외는 기대하지 않는 예외(unexpected exception)라는 낙인이 찍히고 기본적으로 프로그램 실행이 중지됩니다. 예외가 발생한 후에 try블록이 없거나 예와 일치하는 catch블록이 없을 때(예외가 포착되지 않았을 때) 이러한 경우에는 포착되지 않는 예외(ucaught exception)라는 낙인이 찍히고 기본적으로 프로그램 실행이 중지됩니다. 이 둘은 예외에 대한 프로그램 응답을 사용자가 변경할 수 있습니다. 포착되지 않는 예외 예외가 발생했으나 포착되지 않는 예외가 발생했을 때 다음과 같은 순서로 진행합니다. ter..

프로그래밍/C++ 2019.11.02 Plorence

C++ new 연산자 사용시 예외 처리

C++에서 new 연산자를 사용할 때 일어나는 메모리 할당 문제를 해결하는 두 가지 방법을 제공합니다. 메모리 할당 문제가 발생할경우 널 포인터를 리턴 new가 bad_alloc 예외를 발생시킴 bad_alloc 예외 방식 #include #include struct Temp { double a[90000]; long b[90000]; }; int main(void) { Temp * temp; try { temp = new Temp(); } catch (std::bad_alloc & ba) { std::cout

프로그래밍/C++ 2019.11.01 Plorence

C++ 예외 클래스(exception class)

C++ 예외들의 주목적은, 오동작을 방지하는 프로그램을 설계할 수 있도록 언어 차원에서 지원하는 것입니다. 최신 C++ 컴파일러들은 언어 자체에 예외들을 포함시키고 있습니다. exception헤더 파일은 다른 예외 클래스들의 기초 클래스로 사용하는 exception 클래스를 정의합니다. exception 객체를 발생시키거나 기초 클래스로 사용할 수 있습니다. exception 클래스는 what()이라는 하나의 가상 멤버 함수가 주어집니다. 시스템의 특성에 따라 하나의 문자열을 리턴합니다. #include #include class Exce : public std::exception { public: const char* what() { return "문제가 있습니다."; } }; void Func1() ..

프로그래밍/C++ 2019.11.01 Plorence