플로렌스라는 개발자

전체 글

185

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

Synology docker로 asp.net core 배포하기

시놀로지 환경 반드시 docker를 지원하는 시놀로지 모델을 사용하셔야 합니다. 저는 DS218+을 사용하였습니다. 빌드 환경 Windows 10 64bit Visual Studio 2019(asp.net core 설치해야 함.) Docker 프로젝트 생성 프로젝트 생성 새 ASP.NET Core 웹 애플리케이션 선택 이름, 경로 설정하고 "솔루션 및 프로젝트를 같은 디렉터리에 배치" 체크 해제 후 만들기 아무거나 선택 후 위쪽에 .NET Core 버전 설정 후 오른쪽에 Docker 지원 사용 -> Linux 선택 만들기 (.NET Core 2.1, MVC를 사용하였습니다.) 처음 프로젝트 로딩할 때 빌드하는데, 도커까지 빌드됩니다. 도커 빌드 중에 에러가 뜨는데, 프로젝트만 성공적으로 빌드된다면 배포 ..

Synology 2019.11.05 (3) 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

C++ 스택 풀기(unwinding the stack)

어떤 try블록이 예외를 발생시키는 함수를 직접 호출하지 않고 그 예외를 발생시키는 함수를 호출하는 다른 함수를 호출한다면 어떻게 될까요? 그 예외는 예외가 발생한 함수로부터 try 블록과 핸들러가 들어 있는 함수로 점프합니다. 이과정에서 스택 풀기(unwinding the stack)이라는 것이 관여합니다. 스택풀기 먼저 지역변수는 return(또는 함수의 종료)을 만나야 스택에서 해제됩니다. 그리고 리턴하는 함수가 스택에 올려놓은 것만 처리합니다. 반면에 예외가 발생하여 스택 풀기가 되면 try 블록에 들어 있는 리턴 주소에 도달할 때까지 계속해서 스택을 해제합니다. 즉 try 블록과 throw구문 사이에 개입된 함수 호출들의 전체적인 연쇄가 스택에 올려놓은 객체들을 모두 처리합니다. return과 ..

프로그래밍/C++ 2019.11.01 Plorence

C++ 예외(Exception)와 Abort함수

프로그램을 실행하다 보면 가끔 정상적으로 실행을 계속할 수 없는 상황이 있습니다. 사용 가능한 메모리보다 더 많은 양의 메모리를 요구함 파일을 읽으려고 하는데 해당 파일이 없음 인터넷 웹사이트에서 값을 가져오는데 인터넷 연결이 안 되어 있음 위와 같은 여러 상황이 생길 수 있습니다. 대부분의 프로그래머들은 이런 상황을 미리 예상하려고 노력합니다. 그래서 C++은 이러한 상황을 처리하기 위해서 예외를 추가했습니다. abort() 호출 abort함수의 원형은 cstdlib헤더 파일에 들어있습니다. 일반적으로 abort()함수는 호출되었을 때 표준 에러 스트림에 "abnormal program temination"(비정상적인 프로그램 종료)과 같은 메시지를 보내고 프로그램을 종료시키도록 구현되어 있습니다. #..

프로그래밍/C++ 2019.11.01 Plorence

C++ 내포 클래스(nested class)

C++에서는 클래스 선언을 다른 클래스 안에 내포시킬 수 있습니다. 다른 클래스 안에 선언된 클래스를 내포 클래스(nested class)라고 합니다. 이 방법은 새로운 데이터형에 클래스 사용 범위를 제공함으로써 이름이 난잡해지는 것을 막습니다. (구형 C++에서는 내포 클래스를 아예 지원하지 않거나 그 개념이 불완전하게 구현됩니다.) class Person { private: int age; class Card { public: char* number; int money; void Show(); }; public: Card card; }; void Person::Card::Show() { } 클래스를 내포시키는 일반적인 이유는 다른 클래스의 구현을 지원하고 이름 충돌을 막는 것입니다. 내포 클래스를 어..

프로그래밍/C++ 2019.11.01 Plorence

C++ 클래스 프렌드(class friend)

이번 프렌드는 클래스에 대한 프렌드인데 클래스도 프렌드가 될 수 있습니다. 이러면 프렌드 클래스의 모든 멤버 함수는 오리지널 클래스의 private 멤버와 protected 멤버에 접근할 수 있습니다. class Plorence { private: int age; public: friend class Guest; }; class Guest { public: int GetAge(const Plorence & plo) { return plo.age; } }; Guest클래스에서 Plorence 클래스의 private인 age멤버에 접근하려면 프렌드여야 됩니다. 프렌드로 인하여 Guest 클래스에서 Plorence 클래스의 private,protected멤버에 접근할 수 있습니다. 프렌드 멤버 함수 위에서 프..

프로그래밍/C++ 2019.11.01 Plorence