CplusplusProject - 0421cjy/cplusplus GitHub Wiki

it's my Experience C++ Project.

this Project following Google C++ Coding Convention.

ν•¨μˆ˜ (Funtions)

  • λ§€κ°œλ³€μˆ˜ μˆœμ„œ

λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œλŠ” μž…λ ₯μ—μ„œ 좜λ ₯순으둜 μ •μ˜ν•©λ‹ˆλ‹€.

C/C++ ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ“€μ€ ν•¨μˆ˜μ˜ μž…λ ₯을 ν•˜κ±°λ‚˜ ν•¨μˆ˜μ—μ„œ 좜λ ₯λ˜κ±°λ‚˜ λ‘˜λ‹€ 일수 μžˆμŠ΅λ‹ˆλ‹€. μž…λ ₯ νŒŒλΌλ―Έν„°λŠ” λŒ€μ²΄λ‘œ κ°’μ΄κ±°λ‚˜ const μ°Έμ‘°λ“€ μž…λ‹ˆλ‹€. 반면 좜λ ₯κ³Ό μž…/좜λ ₯ λ§€κ°œλ³€μˆ˜λŠ” non-const에 λŒ€ν•œ ν¬μΈν„°λ“€μž…λ‹ˆλ‹€. ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 쀄세움에 μžˆμ–΄μ„œ λͺ¨λ“  μž…λ ₯ μ „μš© λ§€κ°œλ³€μˆ˜λŠ” λͺ¨λ“  좜λ ₯ λ§€κ°œλ³€μˆ˜ μ•žμ— μœ„μΉ˜μ‹œν‚΅λ‹ˆλ‹€. 특히 μƒˆλ‘œμš΄ λ§€κ°œλ³€μˆ˜λ₯Ό ν•¨μˆ˜ 끝에 μΆ”κ°€ν•˜μ§€ λ§ˆμ„Έμš”. μƒˆλ‘œμš΄ μž…λ ₯ μ „μš© νŒŒλΌλ―Έν„°λŠ” 좜λ ₯ λ§€κ°œλ³€μˆ˜ μ•žμ— μœ„μΉ˜μ‹­λ‹ˆλ‹€. μ™œλƒλ©΄ μƒˆλ‘œ μΆ”κ°€λœ λ§€κ°œλ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ΄λŠ” μ—„κ²©ν•œ 룰은 μ•„λ‹™λ‹ˆλ‹€. μž…λ ₯κ³Ό 좜λ ₯ λ‘˜ 닀인 λ§€κ°œλ³€μˆ˜λΌλ©΄ (λ•Œλ•Œλ‘œ 클라슀/ꡬ쑰체) κ΄€λ ¨λœ ν•¨μˆ˜λ“€κ³Όμ˜ 일관성을 μœ„ν•΄μ„œ μœ„μ˜ κ·œμΉ™μ„ λ²—μ–΄λ‚ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

  • 짧은 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λΌ

μž‘κ³  λͺ…ν™•ν•œ ν•¨μˆ˜λ₯Ό μ„ ν˜Έν•©μ‹œλ‹€.

μš°λ¦¬λŠ” λ•Œλ•Œλ‘œ κΈ΄ ν•¨μˆ˜κ°€ μ μ ˆν•˜λ‹€λŠ” 것을 μ•Œκ³ μžˆμŒμœΌλ‘œ, ν•¨μˆ˜μ˜ 길이에 λŒ€ν•œ μ œν•œμ€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ§Œμ•½ ν•¨μˆ˜μ˜ 길이가 μ•½ 40 라인을 μ΄ˆκ³Όν•œλ‹€λ©΄ ν”„λ‘œκ·Έλž¨μ˜ ꡬ쑰λ₯Ό ν•΄μΉ˜μ§€ μ•ŠμœΌλ©΄μ„œ μͺΌκ°€μˆ˜ μžˆλŠ”κ°€μ— λŒ€ν•΄μ„œ μƒκ°ν•΄λ΄…μ‹œλ‹€.

당신이 μž‘μ„±ν•œ κΈ΄ ν•¨μˆ˜κ°€ μ§€κΈˆμ€ μ™„λ²½ν•˜κ²Œ λ™μž‘ν•œλ‹€κ³  할지라도 λˆ„κ΅°κ°€ λͺ‡ 주후에 이 ν•¨μˆ˜μ— μƒˆλ‘œμš΄ 행동을 좔가할지도 λͺ¨λ¦…λ‹ˆλ‹€. μ΄λŠ” μ°ΎκΈ° μ–΄λ €μš΄ 버그λ₯Ό μƒμ„±ν•˜λŠ” κ²°κ³Όλ₯Ό μ΄ˆλž˜ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό 짧고 κ°„κ²°ν•˜κ²Œ ν•˜λŠ” 것이 λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ λ‹Ήμ‹ μ˜ μ½”λ“œλ₯Ό 읽고 μˆ˜μ •ν•˜κΈ° μ‰½κ²Œ λ§Œλ“œλŠ” λ§Œλ“œλŠ” κΈΈμž…λ‹ˆλ‹€.

당신은 μΌν•˜λ‹€κ°€ κΈΈκ³  λ³΅μž‘ν•œ ν•¨μˆ˜λ₯Ό λ³Όλ•Œκ°€ μžˆμ„κ²λ‹ˆλ‹€. κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜λŠ” 것에 겁내지 λ§ˆμ„Έμš”. λ§Œμ•½ ν•¨μˆ˜μ—μ„œ 그런 λŠλ‚Œμ„ λ°›μ•˜λ‹€λ©΄ μ΄λŠ” ν•΄λ‹Ή ν•¨μˆ˜κ°€ μ–΄λ ΅λ‹€λŠ” 것을 λœ»ν•©λ‹ˆλ‹€. 버그λ₯Ό μ°ΎκΈ° νž˜λ“€κ³  μ—¬λŸ¬ λ‹€λ₯Έ μƒν™©μ—μ„œ 쑰각으둜 μ‚¬μš©ν•˜κ³  μ‹Άμ„λ•Œ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό 더 μž‘μ€ μž‘κ³  관리 κ°€λŠ₯ν•œ μ‘°κ°λ“€λ‘œ μͺΌκ°œλŠ” 것을 κ³ λ €ν•΄λ³΄μž.

  • μ°Έμ‘° λ§€κ°œλ³€μˆ˜

참쑰둜 λ„˜κ²¨μ§€λŠ” λͺ¨λ“  νŒŒλΌλ―Έν„°λ“€μ€ λ°˜λ“œμ‹œ constκ°€ λΆ™μ–΄μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ •μ˜:

Cμ—μ„œ λ³€μˆ˜λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•œλ‹€λ©΄ ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜λŠ” λ°˜λ“œμ‹œ 포인터λ₯Ό μ‚¬μš©ν•΄μ•Όν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ C++에선 κ·Έ λŒ€μ‹ μ— μ°Έμ‘° λ§€κ°œλ³€μˆ˜λ‘œ μ„ μ–Έν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

μž₯점:

λ§€κ°œλ³€μˆ˜λ₯Ό μ°Έμ‘° λ³€μˆ˜λ‘œ μ„ μ–Έν•¨μœΌλ‘œ (*pval)++와 같은 ν‰μΉ™ν•œ μ½”λ“œλ₯Ό ν”Όν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 볡사 μƒμ„±μžμ™€ 같은 λͺ‡λͺ‡ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ ν•„μš”λ‘œ ν•©λ‹ˆλ‹€. 포인터와 달리 null 포인터가 μœ νš¨ν•œ 값이 μ•„λ‹ˆλΌλŠ” 것을 λΆ„λͺ…νžˆν•©λ‹ˆλ‹€.

단점:

μ°Έμ‘°λŠ” 포인터 μ˜λ―Έμ²΄κ³„λ₯Ό κ°€μ§€λ©΄μ„œ κ°’ ꡬ문을 κ°€μ§€κΈ°λ•Œλ¬Έμ— ν˜Όλž€μŠ€λŸ¬μšΈμˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

결정사항:

ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜ λͺ©λ‘ λ‚΄μ—μ„œ λͺ¨λ“  μ°Έμ‘°λŠ” constμ—¬μ•Ό ν•©λ‹ˆλ‹€.

void Foo(const string &in, string *out);

사싀 μ΄λŠ” 맀우 μ—„κ²©ν•œ μ»¨λ²€μ…˜μž…λ‹ˆλ‹€. ꡬ글 μ½”λ“œμ—μ„œ μž…λ ₯ λ§€κ°œλ³€μˆ˜λŠ” κ°’μ΄κ±°λ‚˜ const μ°Έμ‘°μž…λ‹ˆλ‹€. 반면 좜λ ₯ λ§€κ°œλ³€μˆ˜λŠ” ν¬μΈν„°μž…λ‹ˆλ‹€. μž…λ ₯ λ§€κ°œλ³€μˆ˜λŠ” μ•„λ§ˆ const 포인터가 λ κ²λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” λΉ„ const μ°Έμ‘°λ³€μˆ˜λ₯Ό μ ˆλŒ€λ‘œ ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ»¨λ²€μ…˜μ— 따라 ν•„μš”ν•œ 경우λ₯Ό μ œμ™Έν•˜κ³  말이죠. (예 swap())

ν•˜μ§€λ§Œ μ•„λž˜μ™€ 같은 경우 μž…λ ₯ λ§€κ°œλ³€μˆ˜μ— λŒ€ν•΄μ„œ const T*λ₯Ό μ“°λŠ”κ²ƒμ΄ const T&λ₯Ό μ“°λŠ”κ²ƒλ³΄λ‹€ μ„ ν˜Έλ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

  1. Null포인터λ₯Ό λ„˜κΈ°κ³  μ‹Άμ„κ²½μš°
  2. μž…λ ₯에 λŒ€ν•΄μ„œ ν•¨μˆ˜κ°€ ν¬μΈν„°λ‚˜ μ°Έμ‘°λ₯Ό μ €μž₯ν•  경우

κΈ°μ–΅ν•˜μ„Έμš” λŒ€λΆ€λΆ„μ˜ 경우 μž…λ ₯ λ§€κ°œλ³€μˆ˜λŠ” const T&둜 μ§€μ •λ©λ‹ˆλ‹€. λŒ€μ‹ μ— const Tλ₯Ό μ‚¬μš©ν•¨μœΌλ‘œ λ…μžλ“€μ—κ²Œ ν•΄λ‹Ή μž…λ ₯은 λ‹€λ₯΄κ²Œ μ‚¬μš©λ¨μ„ μ•”μ‹œν•©λ‹ˆλ‹€. λ§Œμ•½ 당신이 ꡬ체적인 μ΄μœ κ°€ μžˆλ‹€λ©΄ const T& λŒ€μ‹ μ— const Tλ₯Ό μ„ νƒν–ˆλ‹€λ©΄ κ·Έλ ‡κ²Œ ν•˜μ„Έμš”. 그렇지 μ•ŠμœΌλ©΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ„€λͺ…을 찾게 λ§Œλ“€μ–΄μ„œ ν˜Όλž€μ— λΉ λ“œλ¦΄μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

  • ν•¨μˆ˜ μ˜€λ²„λ‘œλ”©

λ…μžκ°€ 호좜 μœ„μΉ˜λ₯Ό 보고 μ •ν™•νžˆ μ–΄λ–€ μ˜€λ²„λ‘œλ“œλœ ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€ μ•Œ ν•„μš”μ—†μ΄ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ 쒋은 아이디어λ₯Ό μ–»μ„μˆ˜ μžˆλŠ” κ²½μš°μ—λ§Œ μ˜€λ²„λ‘œλ”©λœ ν•¨μˆ˜(μƒμ„±μžλ₯Ό ν¬ν•¨ν•΄μ„œ)λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

μ •μ˜:

당신은 μ•„λ§ˆ const string& λ₯Ό λ°›λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€ 그리고 이λ₯Ό μ˜€λ²„λ‘œλ”©ν•΄μ„œ const char*λ₯Ό 받도둝 ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

class MyClass { public: void Analyze(const string &text); void Analyze(const char *text, size_t textlen); };

μž₯점:

μ˜€λ²„λ‘œλ”©μ€ λ™μΌν•˜κ²Œ λͺ…λͺ…λœ ν•¨μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μœ„ν• μˆ˜ μžˆλ„λ‘ ν•¨μœΌλ‘œ μ½”λ“œλ₯Ό 보닀 μ§κ΄€μ μœΌλ‘œ λ§Œλ“€μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν…œν”Œλ¦Ών™”λœ μ½”λ“œλ₯Ό μœ„ν•΄μ„œ ν•„μš”ν•©λ‹ˆλ‹€. 그리고 μ΄λŠ” λ°©λ¬Έμžλ“€μ—κ²Œ νŽΈλ¦¬ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

단점 :

λ§Œμ•½ ν•¨μˆ˜κ°€ λ§€κ°œλ³€μˆ˜ νƒ€μž…λ§ŒμœΌλ‘œ μ˜€λ²„λ‘œλ”© λœλ‹€λ©΄ λ…μžλŠ” 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ•ŒκΈ° μœ„ν•΄μ„œ C++의 λ³΅μž‘ν•œ 일치 κ·œμΉ™μ„ μ΄ν•΄ν•΄μ•Όν• μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ λ§Œμ•½ νŒŒμƒλœ ν΄λž˜μŠ€κ°€ 였직 ν•¨μˆ˜μ˜ 일뢀 λ³€ν˜•λ§Œ μž¬μ •μ˜ ν•˜λŠ” 경우 λ§Žμ€ μ‚¬λžŒλ“€μ€ μƒμ†μ˜ 의미둜 ν˜Όλ™ν•©λ‹ˆλ‹€.

κ²°λ‘  :

λ§Œμ•½ 당신이 ν•¨μˆ˜λ₯Ό μ˜€λ²„λ‘œλ”©ν•˜κΈΈ μ›ν•œλ‹€λ©΄, Append()보단 AppendString (), AppendInt ()와 같은 μΈμˆ˜μ— λŒ€ν•œ μ •λ³΄λ‘œ 이름을 ν•œμ •ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λ§Œμ•½ κ°€λ³€ 개수 λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ›ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ˜€λ²„λ‘œλ”©ν•˜κ³  싢은 경우 μ‚¬μš©μžκ°€ μ΄λ‹ˆμ…œ 라이저 λͺ©λ‘μ„ μ‚¬μš©ν•˜μ—¬ 인수λ₯Ό μ§€μ •ν• μˆ˜ μžˆλ„λ‘ std::vector둜 λ§Œλ“œλŠ” 것을 κ³ λ €ν•΄λ³΄μž.

  • λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜

λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜λŠ” 기본값이 항상 λ™μΌν•œ 값을 보μž₯ν•˜λŠ” 경우 λΉ„ 가상 ν•¨μˆ˜μΈ κ²½μš°μ—λ§Œ ν—ˆμš©λœλ‹€. ν•¨μˆ˜ μ˜€λ²„λ‘œλ”©κ³Ό λ™μΌν•œ μ œν•œμ„ λ”°λ₯΄κ³  κΈ°λ³Έ 인수둜 얻은 가독성이 μ•„λž˜ 단점보닀 μ€‘μš”ν•˜μ§€ μ•Šμ€ 경우 μ„ ν˜Έν•©λ‹ˆλ‹€.

μž₯점 :

μ’…μ’… λ””ν΄νŠΈ 값을 μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜κ°€ μžˆμ§€λ§Œ λ•Œλ‘œλŠ” 기본값을 μ˜€λ²„λΌμ΄λ”© ν•˜λ €κ³  ν•©λ‹ˆλ‹€. λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ“œλ¬Έ μ˜ˆμ™Έμ— λŒ€ν•΄ λ§Žμ€ ν•¨μˆ˜λ₯Ό μ •μ˜ 없이 μ‰¬μš΄ λ°©λ²•μœΌλ‘œ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€. ν•¨μˆ˜μ˜ μ˜€λ²„λ‘œλ”©κ³Ό 비ꡐ할 λ•Œ, λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜λŠ” 보닀 λͺ…ν™•ν•œ ꡬ문을 가지며 'κΈ°λ³Έ'μΈμˆ˜μ™€ '선택적' 인수 μ‚¬μ΄μ˜ λͺ…ν™•ν•œ ꡬ뢄을 μ œκ³΅ν•©λ‹ˆλ‹€.

단점 :

κΈ°λ³Έ μΈμˆ˜λŠ” μ˜€λ²„λ‘œλ“œ 된 ν•¨μˆ˜μ˜ 의미λ₯Ό μ–»κΈ°μœ„ν•œ 또 λ‹€λ₯Έ λ°©λ²•μ΄λ―€λ‘œ ν•¨μˆ˜ μ˜€λ²„λ‘œλ“œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  μ΄μœ κ°€ μ μš©λ©λ‹ˆλ‹€.

가상 ν•¨μˆ˜ ν˜ΈμΆœμ—μ„œ 인수의 기본값은 λŒ€μƒ 객체의 정적 μœ ν˜•μ— μ˜ν•΄ κ²°μ •λ˜λ©° 주어진 ν•¨μˆ˜μ˜ λͺ¨λ“  μž¬μ •μ˜κ°€ λ™μΌν•œ 기본값을 μ„ μ–Έν•œλ‹€λŠ” 보μž₯은 μ—†μŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ 맀개 λ³€μˆ˜λŠ” 각 호좜 μ‚¬μ΄νŠΈμ—μ„œ μž¬ν‰κ°€λ˜μ–΄ 생성 된 μ½”λ“œλ₯Ό λΆ€ 풀릴 수 μžˆμŠ΅λ‹ˆλ‹€. λ…μžλŠ” λ˜ν•œ 각 ν˜ΈμΆœμ—μ„œ λ³€κ²½λ˜μ§€ μ•Šκ³  κΈ°λ³Έκ°’μ—μ„œ 값이 κ³ μ • 될 κ²ƒμœΌλ‘œ μ˜ˆμƒ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜λŠ” μ’…μ’… 호좜 μ‹œκ·Έλ‹ˆμ²˜μ™€ μΌμΉ˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ ν¬μΈν„°λŠ” κΈ°λ³Έ μΈμˆ˜κ°€μžˆμ„ λ•Œ ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ μ˜€λ²„λ‘œλ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°λ‘  :

λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜λŠ” 가상 ν•¨μˆ˜μ—μ„œ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ„ 경우 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그리고 μ§€μ •λœ 기본값이 μΆ”μ • μ‹œμ μ— 따라 λ™μΌν•œ κ°’μœΌλ‘œ κ³„μ‚°λ˜μ§€ μ•Šμ„ 경우 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (예λ₯Ό λ“€μ–΄ void f (int n = counter ++);λ₯Ό 쓰지 λ§ˆμ‹­μ‹œμ˜€.)

λ‹€λ₯Έ κ²½μš°μ—λŠ” λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜κ°€ μœ„μ˜ 단점을 극볡 ν•  수 μžˆλ„λ‘ ν•¨μˆ˜ μ„ μ–Έμ˜ 가독성을 ν–₯μƒμ‹œν‚¬μˆ˜ μžˆμœΌλ―€λ‘œ ν—ˆμš©ν•©λ‹ˆλ‹€. ν™•μ‹€ν•˜μ§€ μ•Šμ„ κ²½μš°μ—λŠ” μ˜€λ²„λ‘œλ“œλ₯Ό μ‚¬μš©ν•˜μ„Έμš”