노력과 삽질 퇴적물

혼잣말처럼 넘기는 C++ (파트3) 본문

프로그래밍note/언어. C&C++ 계열

혼잣말처럼 넘기는 C++ (파트3)

MTG 2024. 1. 3. 20:29

 
목차
 시작하기
 기초
 > 키워드와 식별자
 > 자료형, 변수
 > 연산자
 > 자료형 캐스팅
 > 배열
 제어문
 함수
 포인터와 참조
 클래스와 상속
 > 기본 요소
 > 상속: 액세스 지시어, 가시성의 상속, 가상함수
 > 라이프 사이클로 본 생성자&소멸자
 > 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년.
전중남, 이병래 저. 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 및 어셈블러
함수 템플릿 | 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) 블로그
[C++] C++ STL map 기본 사용법과 예제 (접속: 2024-01-03)





기타. 변경이력
일자
 변경이력
 2024-01-03  초안 공개. [#블로거] [#티스토리]