hugDog
Android DevLog
hugDog
전체 방문자
였늘
μ–΄μ œ
  • πŸ™Œ Hello? (162)
    • πŸ§©μ•ˆλ“œλ‘œμ΄λ“œ (12)
      • κ°œλ… 정리 (5)
      • 버그 ν•΄κ²° (4)
      • 기타 (3)
    • πŸ”μ•Œκ³ λ¦¬μ¦˜ (54)
      • κ°œλ… (0)
      • λ°±μ€€ (48)
      • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (6)
    • πŸ“„κ°œλ°œ 일지 (0)
      • FINPO (0)
    • πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ (71)
      • C++ 정리 (49)
      • C++κΈ°μ΄ˆν”ŒλŸ¬μŠ€ μ—°μŠ΅λ¬Έμ œ (20)
      • Kotlin (2)
    • ⭐Project (1)
    • 🚴TIL (13)
      • Clean Code (13)
    • πŸš©κΈ°νƒ€ (9)
      • λͺ©ν‘œ (6)
      • 일상 (3)
      • λ¬Έμ„œ (0)

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
hugDog

Android DevLog

πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리

C++ 정리 - 44 (exception 클래슀, stdexcept μ˜ˆμ™Έ 클래슀, bad_alloc μ˜ˆμ™Έμ™€ new, μ˜ˆμ™Έ, 클래슀, 상속, 잘λͺ»λœ μ˜ˆμ™Έ)

2020. 12. 1. 20:16
728x90

exception 클래슀

c++ μ˜ˆμ™Έλ“€μ˜ μ£Όλͺ©μ μ€, μ˜€λ™μž‘μ„ λ°©μ§€ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ 섀계할 수 μžˆλ„λ‘ μ–Έμ–΄ μ°¨μ›μ—μ„œ μžμ›ν•˜λŠ” 것이닀.

μ΅œμ‹  c++ μ»΄νŒŒμΌλŸ¬λ“€μ€ μ–Έμ–΄ μžμ²΄μ— μ˜ˆμ™Έλ“€μ„ ν¬ν•¨μ‹œν‚€κ³  μžˆλ‹€. 예λ₯Ό λ“€μ–΄, exception 헀더 νŒŒμΌμ€ λ‹€λ₯Έ μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ˜ 기초 클래슀둜 μ‚¬μš©ν•˜λŠ” exception 클래슀λ₯Ό μ •μ˜ν•œλ‹€. λ˜ν•œ μ‚¬μš©μžκ°€ μž‘μ„±ν•˜λŠ” μ½”λ“œλŠ” exception 객체λ₯Ό λ°œμƒμ‹œν‚€κ±°λ‚˜, exception 클래슀λ₯Ό 기초 클래슀둜 μ‚¬μš©ν•  수 μžˆλ‹€. what()μ΄λΌλŠ” ν•˜λ‚˜μ˜ 가상 멀버 ν•¨μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 그것은 μ‹œμŠ€ν…œμ˜ νŠΉμ„±μ— 따라 ν•˜λ‚˜μ˜ λ¬Έμžμ—΄μ„ λ¦¬ν„΄ν•œλ‹€. κ·ΈλŸ¬λ‚˜, 이 λ©”μ„œλ“œλŠ” 가상이기 λ•Œλ¬Έμ—, exception ν΄λž˜μŠ€λ‘œλΆ€ν„° νŒŒμƒλœ 클래슀 μ•ˆμ—μ„œ μž¬μ •μ˜ ν•  수 μžˆλ‹€.

#include<exception>
class bad_hmean:public std::exception
{
public:
	const char * what(){return "hmean()에 잘λͺ»λœ λ§€κ°œλ³€μˆ˜";}
    ...
};
class bad_gmean:public std::exception
{
public:
	const char *what(){return "gmean()에 잘λͺ»λœ λ§€κ°œλ³€μˆ˜";}
    ...
};

이 νŒŒμƒ μ˜ˆμ™Έλ“€μ„ μ„œλ‘œ λ‹€λ₯΄κ²Œ μ²˜λ¦¬ν•˜κΈ°λ₯Ό μ›ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, λ™μΌν•œ 기초 클래슀 ν•Έλ“€λŸ¬λ₯Ό κ°€μ§€κ³  그듀을 포착할 수 μžˆλ‹€.

try{
...
}
catch(std::exception &e)
{
cout<<e.what()<<endl;
...
}

 

stdexcept μ˜ˆμ™Έ 클래슀

stdexcept 헀더 νŒŒμΌμ€ λͺ‡ κ°€μ§€ μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ„ 더 μ •μ˜ν•œλ‹€.

첫째, 이 ν—€λ”νŒŒμΌμ€ logic_error와 runtime_error 클래슀λ₯Ό μ •μ˜ν•œλ‹€. 이듀은 exceptionμœΌλ‘œλΆ€ν„° public둜 νŒŒμƒλœλ‹€.

class logic_error: public exception {
public:
explicit logic_error(const string & what_arg);
...
};
class domain_error: public logic_error{
public:
explicit domain_error(const string & what_arg)
...
};

이 λ§€κ°œλ³€μˆ˜λŠ” what() λ©”μ„œλ“œμ— μ˜ν•΄ cμŠ€νƒ€μΌ λ¬Έμžμ—΄λ‘œ λ¦¬ν„΄λœ 문자 데이터λ₯Ό μ œκ³΅ν•œλ‹€.

 

이 두 μƒˆλ‘œμš΄ ν΄λž˜μŠ€λŠ” 두 νŒŒμƒ ν΄λž˜μŠ€λ“€μ˜ νŒ¨λ°€λ¦¬λ₯Ό μœ„ν•œ 기초 클래슀의 역할을 ν•œλ‹€. logic_error νŒ¨λ°€λ¦¬λŠ”, 일반적인 논리 μ—λŸ¬λ“€μ„ μ„œμˆ ν•œλ‹€. 각 클래슀의 이름듀을 보면 그듀이 μ–΄λ–€ μ’…λ₯˜μ˜ μ—λŸ¬λ₯Ό λ³΄κ³ ν•˜λŠ”μ§€ μ•Œ 수 μžˆλ‹€.

domain_error

invalid_argument

legth_error

out_of_bounds

각각의 ν΄λž˜μŠ€λŠ”, μ‚¬μš©μžκ°€ what() λ©”μ„œλ“œμ— μ˜ν•΄ λ¦¬ν„΄λ˜λŠ” λ¬Έμžμ—΄μ„ μ œκ³΅ν•˜λŠ”, logic_error의 μƒμ„±μžμ™€ 같은, μƒμ„±μžλ₯Ό κ°€μ§€κ³  μžˆλ‹€.

 

runtime_error νŒ¨λ°€λ¦¬λŠ”, μ‹€ν–‰ν•˜λŠ” λ™μ•ˆμ— λ‚˜νƒ€λ‚  수 μžˆλŠ” μ—λŸ¬λ“€μ„ μ„œμˆ ν•œλ‹€. 각 클래슀의 이름듀을 보면, 그듀이 μ–΄λ–€ μ’…λ₯˜μ˜ μ—λŸ¬λ₯Ό λ³΄κ³ ν•˜λŠ”μ§€ μ•Œ 수 μžˆλ‹€.

range_error

overflow_error

underflow_error

각각의 ν΄λž˜μŠ€λŠ”, μ‚¬μš©μžκ°€ what() λ©”μ„œλ“œμ— μ˜ν•΄ λ¦¬ν„΄λ˜λŠ” λ¬Έμžμ—΄μ„ μ œκ³΅ν•˜λŠ”, runtime_error μƒμ„±μžμ™€ 같은 μƒμ„±μžλ₯Ό κ°€μ§€κ³  μžˆλ‹€.

 

ν•œνŽΈ, 상속 κ΄€κ³„λŠ” μ›ν•œλ‹€λ©΄ 그듀을 μΌκ΄„μ μœΌλ‘œ ν•¨κ»˜ λ‹€λ£¨λŠ” 것을 ν—ˆμš©ν•œλ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό 같은 μ½”λ“œλŠ” out_of_bounds μ˜ˆμ™Έλ₯Ό κ°œλ³„μ μœΌλ‘œ ν¬μ°©ν•˜κ³ , λ‚˜λ¨Έμ§€ logic_error μ˜ˆμ™Έ νŒ¨λ°€λ¦¬λ₯Ό ν•˜λ‚˜μ˜ 그룹으둜 μ²˜λ¦¬ν•˜κ³ , exception 객체, runtime_error 객체 νŒ¨λ°€λ¦¬, exceptionμœΌλ‘œλΆ€ν„° νŒŒμƒλœ λ‚˜λ¨Έμ§€ μ˜ˆμ™Έ λ°μ΄ν„°ν˜•λ“€μ„ μ§‘ν•©μ μœΌλ‘œ μ²˜λ¦¬ν•œλ‹€.

try
{...}
catch(out_of_bounds &oe) //out_of_bounds μ—λŸ¬λ₯Ό ν¬μ°©ν•œλ‹€.
{...}
catch(logic_error &oe) //λ‚˜λ¨Έμ§€ logic_error νŒ¨λ°€λ¦¬λ₯Ό ν¬μ°©ν•œλ‹€.
{...}
catch(exception &oe) //runtime_error, exception 객체듀을 ν¬μ°©ν•œλ‹€.
{...}

 

-bad_alloc μ˜ˆμ™Έμ™€ new

c++ μ‹œμŠ€ν…œλ“€μ€ newλ₯Ό μ‚¬μš©ν•  λ•Œ μΌμ–΄λ‚˜λŠ” λ©”λͺ¨λ¦¬ λŒ€μž… 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 두 κ°€μ§€ 방법을 μ œκ³΅ν•œλ‹€.

첫 번째 방법은 λ©”λͺ¨λ¦¬ μš”μ²­μ„ μΆ©μ‘±μ‹œν‚¬ 수 없을 경우 newκ°€ 널 포인터λ₯Ό λ¦¬ν„΄ν•˜λŠ” 것이닀. 두 번째 방법은 newκ°€ bad_alloc μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 것이닀. new ν—€λ”νŒŒμΌμ—λŠ” exception ν΄λž˜μŠ€μ—μ„œ public으둜 νŒŒμƒλœ bad_alloc 클래슀의 선언이 λ“€μ–΄μžˆλ‹€. 

 

μ˜ˆμ™Έ, 클래슀, 상속

μ˜ˆμ™Έ, 클래슀, 상속은 μ„œλ‘œ μƒν˜Έμž‘μš©ν•œλ‹€.

  1. ν•˜λ‚˜μ˜ μ˜ˆμ™Έ 클래슀λ₯Ό λ‹€λ₯Έ κ²ƒμœΌλ‘œλΆ€ν„° νŒŒμƒμ‹œν‚¬ 수 μžˆλ‹€.
  2. 클래슀 μ •μ˜ μ•ˆμ— μ˜ˆμ™Έ 클래슀 선언을 λ‚΄ν¬μ‹œν‚΄μœΌλ‘œμ¨ μ˜ˆμ™Έλ“€μ„ 클래슀 μ•ˆμ— λ³‘ν•©μ‹œν‚¬ 수 μžˆλ‹€.
  3. κ·Έλ ‡κ²Œ λ‚΄ν¬λœ 선언듀은 상속될 수 있으며, κ·Έλ“€ μžμ‹ μ΄ 기초 클래슀의 역할을 ν•  수 μžˆλ‹€.

잘λͺ»λœ μ˜ˆμ™Έ

μ˜ˆμ™Έκ°€ λ°œμƒν•œ 후에도, 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆλŠ” 두 κ°€μ§€ κ°€λŠ₯성이 μžˆλ‹€.

μ˜ˆμ™Έκ°€ μ˜ˆμ™Έμ§€μ •μ„ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜ μ•ˆμ—μ„œ λ°œμƒν•˜λ©΄, κ·Έ μ˜ˆμ™ΈλŠ” μ˜ˆμ™Έ μ§€μ •μž λ¦¬μŠ€νŠΈμ— μžˆλŠ” λ°μ΄ν„°ν˜•λ“€ μ€‘μ˜ μ–΄λŠ ν•˜λ‚˜μ™€ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€. λ§Œμ•½ μ˜ˆμ™Έκ°€ μ˜ˆμ™Έ μ§€μ •κ³Ό μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄, κ·Έ μ˜ˆμ™ΈλŠ” κΈ°λŒ€ν•˜μ§€ μ•ŠλŠ” μ˜ˆμ™Έ(unexcepted exception)λΌλŠ” 낙인이 찍히고, 기본적으둜 ν”„λ‘œκ·Έλž¨ 싀행이 μ€‘μ§€λœλ‹€. μ˜ˆμ™Έκ°€ 이 첫 번째 μž₯애물을 λ›°μ–΄λ„˜μ–΄λ„ μ˜ˆμ™ΈλŠ” λ°˜λ“œμ‹œ ν¬μ°©λ˜μ–΄μ•Ό ν•œλ‹€. μ˜ˆμ™Έκ°€ ν¬μ°©λ˜μ§€ μ•ŠμœΌλ©΄, ν¬μ°©λ˜μ§€ μ•ŠλŠ” μ˜ˆμ™Έ(uncaught exception)λΌλŠ” 낙인이 찍히고, 기본적으둜 ν”„λ‘œκ·Έλž¨ 싀행이 μ€‘μ§€λœλ‹€. κ·ΈλŸ¬λ‚˜ κΈ°λŒ€ν•˜μ§€ μ•ŠλŠ” μ˜ˆμ™Έλ‚˜ ν¬μ°©λ˜μ§€ μ•ŠλŠ” μ˜ˆμ™Έμ— λŒ€ν•œ ν”„λ‘œκ·Έλž¨μ˜ 응닡을 μ‚¬μš©μžκ°€ λ°”κΏ€ 수 μžˆλ‹€.

 

728x90
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬
    'πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • C++ 정리 - 46 (string : c++11 μƒμ„±μžλ“€, string 클래슀 μž…λ ₯, λ¬Έμžμ—΄ μž‘μ—…, μ˜€λ²„ λ‘œλ”©λœ find() λ©”μ„œλ“œ)
    • C++ 정리 - 45 (RTTI, dynamic_cast μ—°μ‚°μž, typeid μ—°μ‚°μžμ™€ type_info 클래슀, λ°μ΄ν„°ν˜• λ³€ν™˜ μ—°μ‚°μž, string 클래슀)
    • C++ 정리 - 43 (abort() 호좜, μ˜ˆμ™Έ λ©”μ»€λ‹ˆμ¦˜, μ˜ˆμ™Έλ‘œ 객체 μ‚¬μš©ν•˜κΈ°, c++11μ—μ„œμ˜ μ˜ˆμ™Έ 규격, μŠ€νƒ ν’€κΈ°, μ˜ˆμ™Έμ˜ κ·Έ λ°–μ˜ κΈ°λŠ₯)
    • C++ 정리 - 42 (ν”„λ Œλ“œ 클래슀, ν”„λ Œλ“œ 멀버 ν•¨μˆ˜, 내포 클래슀)
    hugDog
    hugDog
    μ•ˆλ“œλ‘œμ΄λ“œ 곡뢀 쀑인 ν•™μƒμž…λ‹ˆλ‹€!

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”