노력과 삽질 퇴적물
혼잣말처럼 넘기는 C++ (파트3) 본문
목차
|
|
시작하기 기초 > 키워드와 식별자 > 자료형, 변수 > 연산자 > 자료형 캐스팅 > 배열 제어문 함수 포인터와 참조 |
|
클래스와 상속 > 기본 요소 > 상속: 액세스 지시어, 가시성의 상속, 가상함수 > 라이프 사이클로 본 생성자&소멸자 > friend키워드 > 다중상속 생성자 종류 > 복사 생성자 > 이동 생성자 > 위임 생성자 연산자 다중정의(오버로딩) 업 캐스팅&다운 캐스팅 |
|
파트3.
|
템플릿 예외처리 > try-catch > throw와 exception클래스 > noexcept 함수 |
* 해당 포스팅은 JAVA혹은 파이썬처럼 C기반과 직결되지는 않는 언어에 익숙한 상태로 진행되는터라 과감히 생략하고 넘기는 부분이 존재합니다.
* 일반적인 강의형 포스팅이라기보다는 개인적인 노트정리여서 보조 설명이나 자체적인 언어(?)로 해석/재구성한 부분은 밑줄을 포함한 이탤릭체 혹은 기울임꼴로 표기됩니다.
* 참조 자료상 auto, long long int등이 있는터라 최소사양을 C++11(2011년 승인)에 두고 있습니다.
1. 템플릿
1) 개념
-> "컨테이너(container) 클래스란 다른 객체를 저장하는 클래스로서, 그 예로 스택, 큐, 배열, 리스트 등을 들 수 있다. 컨테이너 클래스는 프로그램 작성에 매우 유용하다. 그러나 동일한 유형의 컨테이너일지라도 저장하고자 하는 객체의 유형이 다르면 이에 맞게 새로운 클래스를 선언하여야 한다." (p.294, C++프로그래밍, 2019)
-> /* 템플릿으로 작업을 하면, doSum(int arg)와 doSum(float arg)에 대해서 함수를 따로 만들거나 형변환을 통해 욱여넣지 않아도 됨. */
2) 예시
클래스 템플릿
|
template<class T> class SampleT { ... ... ... public: SampleT(); ... ... ... }; ... ... ... SampleT<OtherClass1> obj1; SampleT<OtherClass2> obj2; -> /* 만약, 클래스가 아닌 언어에서 제공하는 자료형만 쓴다? template<typename T> class 클래스_이름 앞에 붙이고 SampleT<int> obj1; */ |
함수 템플릿
|
template<class T> void doFunc1(T &arg) { ... ... } template<typename T> void doFunc2(T &arg) { ... ... } -> 변수의 유효범위상 T를 함수의 반환형으로도 가능. |
3) STL(Standard Template Library, 표준 템플릿 라이브러리)
-> "C++언어가 제공하는 템플릿을 사용한 컨테이너 클래스를 제공하는 라이브러리로서, 벡터, 리스트, 큐 그리고 스택 등의 클래스 템플릿과 그 안에 저장된 데이터를 검색하고 정렬하는 등의 터리를 위한 함수들이 제공된다. STL의 목적은 프로그래머들이 많이 사용하는 공통적인 컨테이너 클래스를 제공하는 것이다." (p.311, C++프로그래밍, 2019)
컨테이너 종류 | |
순차
|
vector: idx-value구조여서 [](참조 연산자)로 직접 접근 빠름. 컨테이너 끝에만 삽입이 이뤄짐. list: 데이터 삽입이 용이. 집적 접근 효율이 낮아 제공X. 어느 위치에건 삽입이 가능. deque: 저성능이나 vector와 list 특성 모두 가능. |
연상
|
set/multiset: 키 객체만 저장. multi-류는 중복키 허용 map/multmap: 키-값으로 대응되는 구조. multi-류는 중복키 허용 |
무순서 연상
|
unorder_set, unorder_multiset, unorder_map, unorder_multimap |
-> '반복자'(iterator): for/while문으로 순서가 보장되지 않는 컨테이너에서 값을 뽑아야 하는 경우, 컨테이너에 대한 포인터 역할. 순방향(내부에 ++연산자)/양방향(내부에 ++, --연산자)/랜덤 액세스로 나뉜다.
... ... ...
#include <map>
map<string, int> testMap;
for(auto it = testMap.begin(); it != testMap.end(); it++)
{
//it->first key값.
//it->second value값
... ... ...
}
... ... ...
2. 예외처리
1) try-catch
try{... ... ...} catch(int argExcept){... ... ...} catch(const char * argExcept){... ... ...}
2) throw와 exception클래스
exception클래스
예시
|
#include <exception>//<-상속받아야 하니 필요한 헤더파일 class SampleException: public exception { private: const int errorCode; const char* errorMessage; public: SampleException(int arg) : errorCode(arg) { } SampleException(const char* arg) : errorMessage(arg) { } }; |
throw 예시(1)
|
try{
if(...)
throw 404;
else if(...)
throw "에러 발생";
else if(...)
throw SampleException(503);
else if(...)
throw SampleException("ERR something");
} catch(int argExcept){// try문내 'throw 404'를 처리.
... ... ...
} catch(const char * argExcept){
... ... ...
} catch(SampleException& argExcept){
// try문내 'throw SampleException(...)' 처리
//전역 클래스일 경우, catch(const SampleException& argExcept)
... ... ...
}
|
throw 예시(2)
|
void doFunc1() throw(SampleException) { if(...) throw SampleException("ERR something");
}... ... ... try{
doFunc1();
} catch(SampleException& rgExcept){
// try문내 'throw SampleException(...)' 처리
... ... ...
}
|
-> /* try 블록내에 에러 상황 대응 하는건 다른 언어도 비슷한데, JAVA의 Throwable처럼 처리되는 에러 범위가 넓은 종류가 있나? */
3) noexcept 함수
void doFunc() noexcept{... ... ...}
-> "어떤 함수가 예외를 일으키지 않는 것이 명백하다면 그 함수를 noexcept 함수로 선언할 수 있다. ...(중략)... 프로그래머 입장에서는 프로그램의 흐름을 이해하기 쉽고, 컴파일러의 입장에서는 예외처리를 위한 제어 흐름의 변화를 고려할 필요가 없어 코드를 최적화하기 좋은 장점이 있다." (p.347, C++프로그래밍, 2019)
-> "예외가 호출 스택을 전파하는 것을 허용하지 않는 모든 함수에 적용 noexcept 하는 것이 좋습니다. 함수가 선언되면 noexcept컴파일러가 여러 다른 컨텍스트에서 보다 효율적인 코드를 생성할 수 있습니다." (noexcept(C++) | Microsoft Learn)
1) 서적
윤성우 저. 윤성우의 열혈 C++ 프로그래밍, 오렌지미디어, 2010년.
2) 웹페이지
기타. 참조자료
1) 서적
윤성우 저. 윤성우의 열혈 C++ 프로그래밍, 오렌지미디어, 2010년.
전중남, 이병래 저. C++프로그래밍, 한국방송통신대학교출판문화원, 2019년.
2) 웹페이지
코딩의 시작, TCP School
> try, throw, catch (접속: 2024-01-03)
IBM Documentation (IBM i 7.5)
> 예외 스펙 (C++ 전용) (접속: 2024-01-03)
> 클래스 템플리트 (C++ 전용) (접속: 2024-01-03)
> 함수 템플리트 (C++ 전용) (접속: 2024-01-03)
Learn / Microsoft C++, C 및 어셈블러
> 예외 및 오류 처리에 대한 최신 C++ 모범 사례 (접속: 2024-01-03)
> 예외 사양(throw, noexcept)(C++) | Microsoft Learn (접속: 2024-01-03)
> 클래스 템플릿 | Microsoft Learn (접속: 2024-01-03)
> 함수 템플릿 | Microsoft Learn (접속: 2024-01-03)
> noexcept(C++) | Microsoft Learn (접속: 2024-01-03)
> try 블록 (C++ 전용) (접속: 2024-01-03)
> Try, Throw 및 Catch 문(C++) (접속: 2024-01-03)
3) 블로그
일자
|
변경이력 |
2024-01-03 | 초안 공개. [#블로거] [#티스토리] |
'📂기초 및 세팅 note > 언어. C&C++ 계열' 카테고리의 다른 글
혼잣말처럼 넘기는 C++ (파트2) (0) | 2024.01.03 |
---|---|
혼잣말처럼 넘기는 C++ (파트1) (0) | 2023.08.20 |
오픈 소스: id-Software (0) | 2014.06.21 |
CPP: 이클립스 CDT 개발 환경 구축 (0) | 2013.04.23 |
CPP: 변수 명명법 (0) | 2012.03.09 |