π C++ Modules: μ μ°¨μ μ¬κ³ μμ κ°μ²΄ μ§ν₯κ³Ό μ λ€λ¦ νλ‘κ·Έλλ°μΌλ‘μ ν¨λ¬λ€μ μ ν
42μμΈμ C++ Module κ³Όμ μ νλ‘μ νΈλ€μ CμΈμ΄μ ν΄λμ€λ₯Ό λνλ μμ€μ λμ΄, νλ‘κ·Έλλ° ν¨λ¬λ€μ μ체λ₯Ό κ·Όλ³Έμ μΌλ‘ μ ννλ μ¬μ μ΄λ€.
μ΄ κ³Όμ μ μ μ°¨μ νλ‘κ·Έλλ°(Procedural Programming)μ νκ³λ₯Ό μΈμ§νκ³ , 볡μ‘ν μμ€ν μ ꡬ쑰ννλ μλ‘μ΄ λ°©λ²λ‘ μΈ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(Object-Oriented Programming)μ 체λνλ©°, λμκ° μ½λμ μ¬μ¬μ©μ±μ κ·Ήλννλ μ λ€λ¦ νλ‘κ·Έλλ°(Generic Programming)μ μΈκ³κΉμ§ νννλλ‘ μ€κ³λμ΄ μλ€.
κ° λͺ¨λμ C++λΌλ λ©ν° ν¨λ¬λ€μ μΈμ΄κ° μ 곡νλ νΉμ μ² νκ³Ό λꡬλ₯Ό κΉμ΄ μκ² νκ³ λλ λ 립μ μΈ μ°κ΅¬ κ³Όμ μ΄λ€. μ΄ μ 체 κ³Όμ μ ν΅ν΄ κ°λ°μλ λ¬Έμ μ μ±κ²©μ λ°λΌ μ μ ν ν¨λ¬λ€μμ μ ννκ³ μ‘°ν©ν μ μλ νλμ μμΌμ κ°λ ₯ν 무기λ₯Ό κ°μΆκ² λλ€.
πΊοΈ λͺ¨λλ³ νν μΌμ§: κ°λ μ μ¬μΈ΅ λΆμ
πΉ Module 00: C++μ κΈ°λ³Έ 골격 - βC with Classesβ
- ν΅μ¬ κ°λ : μΊ‘μν(Encapsulation). CμΈμ΄μ ꡬ쑰체μ ν¨μκ° λΆλ¦¬λμ΄ μλ κ²κ³Ό λ¬λ¦¬, ν΄λμ€λ λ°μ΄ν°(λ©€λ² λ³μ)μ κ·Έ λ°μ΄ν°λ₯Ό μ‘°μνλ νμ(λ©€λ² ν¨μ)λ₯Ό νλμ λ¨μλ‘ λ¬Άλλ€. μ΄λ κ°μ²΄μ μνλ₯Ό μΈλΆλ‘λΆν° 보νΈνκ³ , λͺ νν μΈν°νμ΄μ€λ₯Ό ν΅ν΄μλ§ μνΈμμ©νλλ‘ κ°μ νλ 첫걸μμ΄λ€.
- μ£Όμ κ³Όμ :
Accountν΄λμ€ λ±μ ν΅ν΄ μμ±μ(Constructor), μλ©Έμ(Destructor)μ κ°λ μ μ΅νκ³ , κ°μ²΄μ μμ±κ³Ό μλ©Έμ΄λΌλ μλͺ μ£ΌκΈ°(Life Cycle)λ₯Ό μ§μ κ΄λ¦¬νκΈ° μμνλ€. μ΄λ C++μ κ°μ₯ μ€μν μ² ν μ€ νλμΈ RAII(Resource Acquisition Is Initialization)μ κΈ°λ°μ΄ λλ€. μ΄ κ³Όμ λΆν° βμλͺ μ£ΌκΈ°β λΌλ κ°λ μ μ΄ν΄νκΈ° μμνλ€. νλ‘κ·Έλ¨μ΄λ, κ°μ²΄ λ±, κΈ°μ‘΄μλ λ‘μ§μ΄λ μ°¨μμμ μ κ·Ό νλ€κ°, ν΄λΉ κ³Όμ λ₯Ό νλ©΄μλΆν° μ£ΌκΈ°λΌλ κ΄μ μμ λ°λΌλ³Ό μ μκ² λμλ€.
πΉ Module 01: μμμ μλͺ μ£ΌκΈ° κ΄λ¦¬ - RAIIμ μ°Έμ‘°
- ν΅μ¬ κ°λ
: μμ κ΄λ¦¬(Resource Management). CμΈμ΄μ
malloc/freeμ λ¬λ¦¬, C++μμλnew/deleteμ°μ°μλ₯Ό ν΅ν΄ κ°μ²΄μ λμ ν λΉμ μννλ€. μ¬κΈ°μ ν΅μ¬μ μμ±μμμ μμμ ν λΉνκ³ (new) μλ©Έμμμ ν΄μ (delete)νλ RAII ν¨ν΄μ ν΅ν΄, μμμ λμλ₯Ό μμ²μ μΌλ‘ λ°©μ§νλ κ²μ΄λ€. - μ£Όμ κ³Όμ :
Zombieν΄λμ€λ₯Ό ν΅ν΄ λμ ν λΉλ κ°μ²΄μ μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬νλ©° RAIIλ₯Ό μ°μ΅νλ€. λν, ν¬μΈν°μ λ¬λ¦¬ nullμ νμ©νμ§ μκ³ , κ°λ¦¬ν€λ λμμ λ³κ²½ν μ μλ μ°Έμ‘°μ(Reference)λ₯Ό ν΅ν΄ λ μμ νκ³ λͺ νν μ½λλ₯Ό μμ±νλ λ²μ λ°°μ΄λ€.
πΉ Module 02: μ°μ°μ μ€λ²λ‘λ© - μ¬μ©μ μ μ νμ μ μ§κ΄μ±
- ν΅μ¬ κ°λ
: μ°μ°μ μ€λ²λ‘λ©(Operator Overloading). μμ£Ό μ μ°λͺ
ν κ°λ° κ°λ
μΌλ‘ μ¬μ©μκ° μ§μ μ μν ν΄λμ€(User-Defined Type)λ₯Ό
int,doubleκ³Ό κ°μ λ΄μ₯ νμ (Built-in Type)μ²λΌ μμ°μ€λ½κ² μ¬μ©ν μ μλλ‘ λ§λλ κΈ°μ μ΄λ€. μ΄λ μ½λμ κ°λ μ±κ³Ό μ§κ΄μ±μ κ·Ήλννλ€. - μ£Όμ κ³Όμ : κ³ μ μμμ μ«μλ₯Ό νννλ
Fixedν΄λμ€λ₯Ό λ§λ€κ³ , μ¬μΉμ°μ°, λΉκ΅, μ¦κ° μ°μ°μ λ±μ λͺ¨λ μ€λ²λ‘λ©νλ€. μ΄ κ³Όμ μ ν΅ν΄ μ κ· νμ(Canonical Form)μ μ€μμ±, μ¦ ν΄λμ€λ₯Ό μ¬λ°λ₯΄κ² λμμν€κΈ° μν΄ νμμ μΌλ‘ ꡬνν΄μΌ νλ μμ±μ, μλ©Έμ, λ³΅μ¬ μμ±μ, ν λΉ μ°μ°μ λ±μ μ§ν©μ μ΄ν΄νκ² λλ€.
πΉ Module 03: μμ - μ½λ μ¬μ¬μ©κ³Ό βis-aβ κ΄κ³μ νν
- ν΅μ¬ κ°λ
: μμ(Inheritance). κ°μ²΄ μ§ν₯μ ν΅μ¬ κΈ°λ₯ μ€ νλλ‘, κΈ°μ‘΄ ν΄λμ€μ κΈ°λ₯μ μ¬μ¬μ©νκ³ νμ₯ν μ μκ² νλ€. μ΄λ μ½λμ μ€λ³΅μ μ κ±°νκ³ ν΄λμ€ κ°μ βis-aβ κ΄κ³(μ:
ScavTrapis aClapTrap)λ₯Ό λͺ ννκ² νννλ€. - μ£Όμ κ³Όμ :
DiamondTrapꡬνμ ν΅ν΄ λ€μ€ μμ μ λ°μν μ μλ λ€μ΄μλͺ¬λ λ¬Έμ (Diamond Problem), μ¦ λΆλͺ¨ ν΄λμ€μ λ©€λ²κ° μ€λ³΅μΌλ‘ μμλλ λͺ¨νΈμ±μ λ§μ£Όνλ€. μ΄λ₯Ό κ°μ μμ(Virtual Inheritance)μΌλ‘ ν΄κ²°νλ©°, 볡μ‘ν ν΄λμ€ κ³μΈ΅ ꡬ쑰λ₯Ό μ¬λ°λ₯΄κ² μ€κ³νλ λ°©λ²μ λ°°μ΄λ€.
πΉ Module 04: λ€νμ± - μ»΄νμΌ νμμ λμ΄ λ°νμμΌλ‘
- ν΅μ¬ κ°λ : λ€νμ±(Polymorphism). κΈ°λ° ν΄λμ€ ν¬μΈν°λ μ°Έμ‘°λ₯Ό ν΅ν΄ νμ ν΄λμ€μ κ°μ²΄λ₯Ό λ€λ£° μ μκ² νλ, κ°μ²΄ μ§ν₯μ μ μμ΄λ€. μ΄λ κ°μ ν¨μ(Virtual Function)λ₯Ό ν΅ν΄ ꡬνλλ©°, λμ λ°μΈλ©(Dynamic Binding), μ¦ μ€μ νΈμΆλ ν¨μκ° μ»΄νμΌ μμ μ΄ μλ λ°νμμ κ²°μ λλλ‘ νλ€.
- μ£Όμ κ³Όμ :
Animalκ³Ό κ°μ μΆμ κΈ°λ³Έ ν΄λμ€(Abstract Base Class)λ₯Ό μμ κ°μ ν¨μ(=0)λ₯Ό μ΄μ©ν΄ μ μνλ€. μ΄λ νμ ν΄λμ€κ° λ°λμ ꡬνν΄μΌ ν μΈν°νμ΄μ€(Interface)λ₯Ό κ°μ νλ μν μ νλ€. λν, κΈ°λ° ν΄λμ€ ν¬μΈν°λ‘ κ°μ²΄λ₯Ό μμ ν λ λ°μν μ μλ λ©λͺ¨λ¦¬ λμλ₯Ό λ§κΈ° μν΄ κ°μ μλ©Έμ(Virtual Destructor)μ νμμ±μ 체λνλ€.
πΉ Module 05: μμΈ μ²λ¦¬ - μ€λ₯μ λν κ²¬κ³ ν λμ
- ν΅μ¬ κ°λ
: μμΈ μ²λ¦¬(Exception Handling). CμΈμ΄μ λ°ν κ°μ ν΅ν μ€λ₯ μ²λ¦¬ λ°©μμ νκ³λ₯Ό 극볡νκ³ , μ€λ₯ μ²λ¦¬ λ‘μ§κ³Ό μ μμ μΈ μ€ν λ‘μ§μ λΆλ¦¬νλ νλμ μΈ λ°©λ²μ΄λ€.
try-catch-throwꡬ문μ ν΅ν΄ μμΈκ° λ°μνμ λ νλ‘κ·Έλ¨μ νλ¦μ μμ νκ² μ μ΄νκ³ , μ€ν νκΈ°(Stack Unwinding)λ₯Ό ν΅ν΄ μ§μ κ°μ²΄λ€μ μλ©Έμλ₯Ό νΈμΆνμ¬ μμμ μμ νκ² ν΄μ νλ€. μ΄ κ³Όμ λ₯Ό ν΄λ³Έ μ΄λλ‘ try-catch μ μ€μμ±μ μ΄ν΄νμΌλ, μ¬μ ν μμ¬μ΄ μ μ μ΄λ€ μμΌλ‘ κ΄λ¦¬νλ κ²μ΄ μ’μκ°? μ λν΄μ νμ μ λ§€νλ€λ μ μ΄λ€.
πΉ Module 06: C++ νλ³ν - λͺ μμ μ΄κ³ μμ ν νμ λ³ν
- ν΅μ¬ κ°λ
: μλλ₯Ό λͺ
μνλ νλ³ν. C μ€νμΌμ 무λΆλ³ν νλ³ν λμ , C++μ
static_cast,dynamic_cast,const_cast,reinterpret_castμ λ€ κ°μ§ λͺ μμ μΊμ€νΈλ₯Ό μ 곡νλ€. μ΄λ κ°λ°μμ μλλ₯Ό μ½λμ λͺ νν λλ¬λ΄κ³ , μ»΄νμΌλ¬κ° λ λ§μ μ€λ₯λ₯Ό κ²μΆν μ μλλ‘ λλλ€. - μ£Όμ κ³Όμ :
dynamic_castλ₯Ό ν΅ν΄ λ°νμμ νμ μ 보λ₯Ό νμΈνλ©° μμ νκ² λ€μ΄μΊμ€ν (Down-casting)νλ λ°©λ²μ μ΅νλ€. μ΄ κ°λ λ€ μ체λ μ΄ν΄κ° μ¬μ μ§λ§, κ²°κ³Όμ μΌλ‘ νλ³ν κ³Όμ μ μλ¬νΈλ€λ§μ΄λΌλκ°.. ν κ² λ§μλ€.
πΉ Module 07: ν νλ¦Ώ - μ½λμ μΌλ°νμ μ λ€λ¦ νλ‘κ·Έλλ°
- ν΅μ¬ κ°λ : μ λ€λ¦ νλ‘κ·Έλλ°(Generic Programming). νΉμ μλ£νμ μ’ μλμ§ μκ³ , λ€μν μλ£νμ λν΄ λμν μ μλ λ²μ©μ μΈ μ½λ(ν¨μ ν νλ¦Ώ, ν΄λμ€ ν νλ¦Ώ)λ₯Ό μμ±νλ ν¨λ¬λ€μμ΄λ€. μ΄λ μ»΄νμΌ νμ λ€νμ±μ ν΅ν΄ μ½λ μ€λ³΅μ μ΅μννλ©΄μλ νμ μμ μ±κ³Ό μ±λ₯μ λͺ¨λ ν보νλ€. μ΄ λΆλΆμ κ°μ₯ ν₯λ―Έλ‘μ°λ©΄μλ, μ¬λ―Έμλ, κ·Έλ¬λ λμμ κ³Όμ° μ΄λ»κ² μ¨μΌ νλκ°? λΌλ μ°¨μμμ κ³ λ―Όμ΄ λ κΈ°μ μ΄μλ€. λ€λ₯Έ μΈμ΄ νλ‘κ·Έλλ° κ³Όμ μμλ μ λ€λ¦μ€λ κΌ λμ€κ³ , μ€μ λ‘λ μ€μν κ²μ μ¬μ€μ΄μ§λ§, μ λ€λ¦μ€κ° μ€μ μλΉμ€μμ μ΄μ©λκ² λλ©΄, μ΄μ§κ°νλ©΄ 볡μ‘λλ₯Ό λμ΄κ³ μνΈ μν΅μ΄ μλλ©΄ κΈ°μ λΆμ±κ° λλ λλμ΄λΌβ¦ μ μ ν μ’μ λ νΌλ°μ€κ° λ λ§ν μ¬λ‘κ° μλ? μΆμλ€.
πΉ Module 08: STL - 컨ν μ΄λ, λ°λ³΅μ, μκ³ λ¦¬μ¦μ μΌμμΌμ²΄
- ν΅μ¬ κ°λ : STL(Standard Template Library). C++ νμ€ λΌμ΄λΈλ¬λ¦¬μ ν΅μ¬μΌλ‘, 컨ν μ΄λ(Container), μκ³ λ¦¬μ¦(Algorithm), κ·Έλ¦¬κ³ μ΄ λμ μ°κ²°νλ λ°λ³΅μ(Iterator)μ μΈ μμλ‘ κ΅¬μ±λλ€. STLμ μλν¨μ λ°λ³΅μλΌλ ν΅μΌλ μΈν°νμ΄μ€λ₯Ό ν΅ν΄, μ΄λ€ 컨ν μ΄λλΌλ μ΄λ€ μκ³ λ¦¬μ¦κ³Ό ν¨κ» λμν μ μλλ‘ μ€κ³λμλ€λ μ μ μλ€. μ μΈκ³β¦! κ°μ²΄ μ§ν₯ μΈμ΄κ° μ κ·Έλ κ² μ€μνμ§(β¦) μ΄ λͺ¨λμ κΈ°μ€μΌλ‘ μ λ§ λ§μ΄ κΉ¨λ¬μμλ€.
- μ£Όμ κ³Όμ :
vector,list,mapλ± λ€μν 컨ν μ΄λμ λ΄λΆ ꡬ쑰μ μκ° λ³΅μ‘λλ₯Ό μ΄ν΄νκ³ , κ° μν©μ λ§λ μ΅μ μ 컨ν μ΄λλ₯Ό μ ννλ λ₯λ ₯μ κΈ°λ₯Έλ€.
β¨ λμ₯μ μ λ§μΉλ©°
C++ Module 00λΆν° 08κΉμ§μ μ¬μ μ C++λΌλ μΈμ΄λ₯Ό μ μ°¨μ , κ°μ²΄ μ§ν₯μ , κ·Έλ¦¬κ³ μ λ€λ¦ νλ‘κ·Έλλ°μ κ΄μ μμ μ 체μ μΌλ‘ μ΄ν΄νκ² λ§λ μ¬λ μλ νλ ¨ κ³Όμ μ΄μλ€. κ° λͺ¨λμ 볡μ‘ν μννΈμ¨μ΄λ₯Ό ꡬμΆνκΈ° μν΄ νμν κ°κΈ° λ€λ₯Έ μ’ λ₯μ β무기βλ₯Ό μ 곡νλ€. μ΄ κ²½νμ λ¨μν C++ μΈμ΄ μ체μ λν μλ ¨λλ₯Ό λμ΄, λ¬Έμ μ λ³Έμ§μ νμ νκ³ κ·Έμ κ°μ₯ μ ν©ν νλ‘κ·Έλλ° ν¨λ¬λ€μμ μ ννμ¬ μ½λλ₯Ό ꡬ쑰ννλ μννΈμ¨μ΄ μ€κ³μλ‘μμ μλμ κΈΈλ¬μ£Όμλ€.
