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++ 정리 - 45 (RTTI, dynamic_cast μ—°μ‚°μž, typeid μ—°μ‚°μžμ™€ type_info 클래슀, λ°μ΄ν„°ν˜• λ³€ν™˜ μ—°μ‚°μž, string 클래슀)

2020. 12. 4. 21:37
728x90

RTTI

RTTIλŠ” 'runtime type identification'의 μ•½μžλ‘œ, μ‹€ν–‰ μ‹œκ°„ λ°μ΄ν„°ν˜• μ •λ³΄λΌλŠ” λœ»μ΄λ‹€. RTTI의 λͺ©μ μ€ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 도쀑에 객체의 λ°μ΄ν„°ν˜•μ„ κ²°μ •ν•˜λŠ” ν‘œμ€€ 방법을 μ œκ³΅ν•˜λŠ” 것이닀.

 

RTTI의 λ™μž‘ 방식

c++λŠ” RTTIλ₯Ό μ§€μ›ν•˜λŠ” μ„Έ κ°€μ§€ μš”μ†Œλ₯Ό κ°€μ§€κ³  μžˆλ‹€.

  • dynamic_cast μ—°μ‚°μžλŠ”, κ°€λŠ₯ν•˜λ‹€λ©΄ 기초 ν΄λž˜μŠ€ν˜•μ„ μ§€μ‹œν•˜λŠ” ν¬μΈν„°λ‘œλΆ€ν„° νŒŒμƒ ν΄λž˜μŠ€ν˜•μ„ μ§€μ‹œν•˜λŠ” 포인터λ₯Ό μƒμ„±ν•œλ‹€. κ°€λŠ₯ν•˜μ§€ μ•Šλ‹€λ©΄, 널 포인터인 0을 λ¦¬ν„΄ν•œλ‹€.
  • typeid μ—°μ‚°μžλŠ” μ–΄λ–€ 객체의 μ •ν™•ν•œ λ°μ΄ν„°ν˜•μ„ μ‹λ³„ν•˜λŠ” ν•˜λ‚˜μ˜ 값을 λ¦¬ν„΄ν•œλ‹€.
  • type_info κ΅¬μ‘°μ²΄λŠ” μ–΄λ–€ νŠΉλ³„ν•œ λ°μ΄ν„°ν˜•μ— λŒ€ν•œ 정보λ₯Ό μ €μž₯ν•œλ‹€.

RTTIλŠ” 가상 ν•¨μˆ˜λ“€μ„ κ°€μ§€κ³  μžˆλŠ” ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

-dynamic_cast μ—°μ‚°μž

dynamic_cast μ—°μ‚°μžλŠ” 포인터가 μ§€μ‹œν•˜λŠ” κ°μ²΄ν˜•μ΄ 무엇인지 μ•Œλ €μ£Όμ§€ μ•ŠλŠ”λ‹€. κ·Έ λŒ€μ‹ μ— κ·Έ 객체의 μ£Όμ†Œλ₯Ό νŠΉμ •ν˜•μ˜ 포인터에 μ•ˆμ „ν•˜κ²Œ λŒ€μž…ν•  수 μžˆλŠ”μ§€ μ•Œλ €μ€€λ‹€.

이 μ—°μ‚°μžλŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©λœλ‹€. (pgλŠ” μ–΄λ–€ 객체λ₯Ό μ§€μ‹œν•œλ‹€.)

Superb * pm = dynamic_cast<Superb *>(pg);

이 μ½”λ“œλŠ” 포인터 pgκ°€ Superb *ν˜•μœΌλ‘œ μ•ˆμ „ν•˜κ²Œ λ³€ν™˜λ  수 μžˆλ‹€λ©΄, κ·Έ μ—°μ‚°μžλŠ” κ·Έ 객체의 μ£Όμ†Œλ₯Ό λ¦¬ν„΄ν•œλ‹€. λ³€ν™˜ν•  수 μ—†λ‹€λ©΄, 널 포인터인 0을 λ¦¬ν„΄ν•œλ‹€.

 

dynamic_castλ₯Ό 참쑰와 ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ‹€.

널 ν¬μΈν„°ν˜•μ— ν•΄λ‹Ήν•˜λŠ” μ°Έμ‘° 값은 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ‹€νŒ¨λ₯Ό λ‚˜νƒ€λ‚΄λŠ”λ° μ‚¬μš© κ°€λŠ₯ν•œ νŠΉλ³„ν•œ 참쑰값이 μ—†λ‹€. κ·Έ λŒ€μ‹  λΆ€μ μ ˆν•œ μš”μ²­μ΄ μ œμ‹œλ  λ•Œ, dynamic_castλŠ” bad_cast ν˜•μ˜ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

 

typeid μ—°μ‚°μžμ™€ type_info 클래슀

typeid μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 두 객체의 λ°μ΄ν„°ν˜•μ΄ 같은지 κ²°μ •ν•  수 μžˆλ‹€. 두 μ’…λ₯˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 받아듀인닀.

  • 클래슀의 이름
  • 객체둜 ν‰κ°€λ˜λŠ” 식

typeid μ—°μ‚°μžλŠ” type_info 객체에 λŒ€ν•œ μ°Έμ‘°λ₯Ό λ¦¬ν„΄ν•œλ‹€. type_infoλŠ” typeinfo 헀더 νŒŒμΌμ— μ •μ˜λ˜μ–΄ μžˆλŠ” ν΄λž˜μŠ€μ΄λ‹€. type_info ν΄λž˜μŠ€λŠ” λ°μ΄ν„°ν˜•μ„ λΉ„κ΅ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆλ„λ‘ ==와 != μ—°μ‚°μžλ₯Ό μ˜€λ²„ λ‘œλ”©ν•œλ‹€. typeid(Magnificent)==typeid(*pg) //pgκ°€ Magnificent 객체λ₯Ό μ§€μ‹œν•˜λŠ” 포인터이면 true둜 ν‰κ°€λœλ‹€. pgκ°€ 널 포인터이면, ν”„λ‘œκ·Έλž¨μ€ bad_typeid μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

 

λ°μ΄ν„°ν˜• λ³€ν™˜ μ—°μ‚°μž

λ°μ΄ν„°ν˜• λ³€ν™˜ 과정을 λ”μš± μ—„κ²©ν•˜κ²Œ κ·œμ •ν•˜λŠ” 4개의 λ°μ΄ν„°ν˜• λ³€ν™˜ μ—°μ‚°μžλ₯Ό μΆ”κ°€ν•˜μ˜€λ‹€.

  • dynamic_cast
  • const_cast
  • stataic_cast
  • reinterpret_cast

일반적인 λ°μ΄ν„°ν˜• λ³€ν™˜μ„ μ‚¬μš©ν•˜λŠ” λŒ€μ‹ μ—, νŠΉμ • λͺ©μ μ— λ§žλŠ” μ—°μ‚°μžλ₯Ό 선택할 수 μžˆλ‹€.

const_cast μ—°μ‚°μžλŠ” μ–΄λ–€ 값을 constλ‚˜ volatile둜 λ˜λŠ” κ·Έ λ°˜λŒ€λ‘œ λ³€κ²½ν•˜λŠ” 것이 μœ μΌν•œ λͺ©μ μΈ λ°μ΄ν„°ν˜• λ³€ν™˜μ„ μœ„ν•œ 것이닀. dynamic_cast μ—°μ‚°μžμ™€ λ™μΌν•œ 문법을 μ‚¬μš©ν•œλ‹€.

const_cast<type_name>(expression)

type_nameκ³Ό expression은 constλ‚˜ volatile이 μžˆλŠλƒ μ—†λŠλƒμ— 따라 λ‹¬λΌμ§€λŠ” κ²ƒλ§Œ λΉΌκ³ λŠ”, λ°μ΄ν„°ν˜•μ΄ 동일해야 ν•œλ‹€.

const_castλŠ” μ–΄λ–€ 양에 λŒ€ν•œ ν¬μΈν„°μ˜ 접근은 λ³€κ²½ν•  수 μžˆμœΌλ‚˜, const둜 μ„ μ–Έλœ 양을 λ³€κ²½ν•˜λ €λŠ” μ‹œλ„λŠ” κ·Έ κ²°κ³Όκ°€ μ •μ˜λ˜μ§€ μ•ŠλŠ”λ‹€.

 

static_cast μ—°μ‚°μžλ„ λ‹€λ₯Έ μ—°μ‚°μžλ“€κ³Ό λ™μΌν•œ 문법을 μ‚¬μš©ν•œλ‹€. static_cast<type_name>(expression)

이것은 type_name이 κ·Έ expression이 κ°€μ§€λŠ” λ°μ΄ν„°ν˜•μœΌλ‘œ μ•”μ‹œμ μœΌλ‘œ λ³€ν™˜λ  수 μžˆμ„ λ•Œμ—λ§Œ μœ νš¨ν•˜λ‹€.

 

reinterpret_castμ—°μ‚°μžλŠ” μœ„ν—˜ν•œ λ°μ΄ν„°ν˜• λ³€ν™˜μ„ ν•˜κΈ° μœ„ν•œ 것이닀.

reinterpret_cast<type_name>(expression)

이 μ—°μ‚°μžμ˜ μ‚¬μš© μ˜ˆμ΄λ‹€.

struct dat{short a; short b};

long value = 0xf224B118;

dat * pd = reinterpret_cast<dat *>(&value);

cout<<pd->a; // κ·Έ κ°’μ˜ 처음 2λ°”μ΄νŠΈλ₯Ό 좜λ ₯ν•œλ‹€.

 

string 클래슀

λ¬Έμžμ—΄ 생성

string μƒμ„±μžλ“€μ„ λ¨Όμ € μ‚΄νŽ΄λ³΄μž. ν΄λž˜μŠ€μ— κ΄€ν•΄ μ•Œμ•„μ•Ό ν•  κ°€μž₯ μ€‘μš”ν•œ 것은, κ·Έ 클래슀의 객체λ₯Ό 생성할 λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” μ˜΅μ…˜λ“€μ΄λ‹€. 

 

string 클래슀의 μƒμ„±μžλ“€

μƒμ„±μž μ„€λͺ…
string(const char *s) string 객체λ₯Ό sκ°€ μ§€μ‹œν•˜λŠ” NBTS둜 μ΄ˆκΈ°ν™”ν•œλ‹€.
string(size_type n,char c) 문자 c둜 λͺ¨λ‘ μ΄ˆκΈ°ν™”λœ μ›μ†Œ n개의 string 객체λ₯Ό μƒμ„±ν•œλ‹€.
string(const string &str) string 객체λ₯Ό string 객체 str(볡사 μƒμ„±μž)둜 μ΄ˆκΈ°ν™” ν•œλ‹€.
string() 크기가 0인 λ””ν΄νŠΈ string 객체λ₯Ό μƒμ„±ν•œλ‹€. (λ””ν΄νŠΈ μƒμ„±μž)
string(const char *s,size_type n) string 객체λ₯Ό sκ°€ μ§€μ‹œν•˜λŠ” NBTS둜 μ΄ˆκΈ°ν™”ν•˜λ˜, NBTS의 크기λ₯Ό μ΄ˆκ³Όν•˜λ”λΌλ„ n개의 λ¬ΈμžκΉŒμ§€ μ§„ν–‰ν•œλ‹€.
template<class Iter>
string(Iterbegin,Iter end)
string 객체λ₯Ό [begin,end]의 λ²”μœ„μ— μžˆλŠ” κ°’λ“€λ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€. beginκ³Ό endλŠ” 포인터와 λΉ„μŠ·ν•œ 역할을 ν•˜μ—¬ μœ„μΉ˜λ₯Ό μ§€μ •ν•œλ‹€. κ·Έ λ²”μœ„λŠ” begin은 ν¬ν•¨ν•˜κ³ , endλŠ” ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” end λ°”λ‘œ μ•ž κΉŒμ§€λ₯Ό μ˜λ―Έν•œλ‹€.
string(const string & str,size_type pos,size_type n = npos) string 객체λ₯Ό string 객체 str둜 μ΄ˆκΈ°ν™”ν•œλ‹€. str에 μžˆλŠ” posμœ„μΉ˜μ—μ„œ μ‹œμž‘ν•΄μ„œ str의 λκΉŒμ§€ κ°€κ±°λ‚˜, n 문자λ₯Ό μ‚¬μš©ν•˜λ˜ str의 끝을 λ„˜μ–΄κ°ˆ 수 μ—†λ‹€.
string(string &&str) noexcept string 객체λ₯Ό string 객체 str둜 μ΄ˆκΈ°ν™”ν•œλ‹€. str은 λ°”λ€” 수 μžˆλ‹€.(move μƒμ„±μž)
string(initializer_list <char> il) string 객체λ₯Ό μ΄ˆκΈ°ν™” λͺ©λ‘ il에 μžˆλŠ” 문자둜 μ΄ˆκΈ°ν™”ν•œλ‹€.

NBTS(null-byte-terminated-string) : 널 λ°”μ΄νŠΈ μ’…λ£Œ λ¬Έμžμ—΄

 

λ°°μ—΄μ˜ μ΄λ¦„κ³ΌλŠ” 달리, string 객체의 이름은 κ·Έ 객체의 μ£Όμ†Œλ‘œ κ°„μ£Όλ˜μ§€ μ•ŠλŠ”λ‹€.

728x90
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ (μƒˆμ°½μ—΄λ¦Ό)
    'πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • C++ 정리 - 47 (슀마트 포인터 ν…œν”Œλ¦Ώ 클래슀, auto_ptr ν…œν”Œλ¦Ώ, 슀마트 포인터 고렀사항, auto_ptr 보닀 unique_ptr이 더 쒋은 이유, unique_ptr을 μ‚¬μš©ν•˜λŠ” 경우, 슀마트 포인터 선택)
    • C++ 정리 - 46 (string : c++11 μƒμ„±μžλ“€, string 클래슀 μž…λ ₯, λ¬Έμžμ—΄ μž‘μ—…, μ˜€λ²„ λ‘œλ”©λœ find() λ©”μ„œλ“œ)
    • C++ 정리 - 44 (exception 클래슀, stdexcept μ˜ˆμ™Έ 클래슀, bad_alloc μ˜ˆμ™Έμ™€ new, μ˜ˆμ™Έ, 클래슀, 상속, 잘λͺ»λœ μ˜ˆμ™Έ)
    • C++ 정리 - 43 (abort() 호좜, μ˜ˆμ™Έ λ©”μ»€λ‹ˆμ¦˜, μ˜ˆμ™Έλ‘œ 객체 μ‚¬μš©ν•˜κΈ°, c++11μ—μ„œμ˜ μ˜ˆμ™Έ 규격, μŠ€νƒ ν’€κΈ°, μ˜ˆμ™Έμ˜ κ·Έ λ°–μ˜ κΈ°λŠ₯)
    hugDog
    hugDog
    μ•ˆλ“œλ‘œμ΄λ“œ 곡뢀 쀑인 ν•™μƒμž…λ‹ˆλ‹€!

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