MoreEffectiveC++
1. Item 32: Program in the Future tense ¶
- Item 32: λ―Έλλ₯Ό λλΉνλ νλ‘κ·Έλ¨
μ¬λ¬Όμ λ³ννλ€.
μννΈ μ¨μ΄ κ°λ°μλΌλ©΄, μ°λ¦° μλ§ λ§μκ²μ μ νμλ μλ€. νμ§λ§ λ³νλ κ²μ μΈμ§ν΄μΌ νλ€. μ°λ¦¬λ 무μμ΄ λ³ν 건κ°, μ΄λ»κ² λ³ν 건κ°, μΈμ λ³νκ° μΌμ΄λλκ°, μ κ±°κΈ°μμ λ³νκ° μΌμ΄λλκ° μ΄λ°κ² λ°μλ μνμκ° μλ€. κ·Έλ μ§λ§ μ°λ¦° μμμΌ νλ€. λ³ννλ€. λΌλ μ λ§μ΄λ€. (μμ±μμ£Ό:κ°μΈμ μΈ μ견μΌλ‘ μμν λ¨λ½, νΉμλ κ΄μ¬μμΌλ©΄ μκ²¬μ’ λ΄μ£ΌμΈμ.)
μλ¬Έ:As software developers, we may not know much, but we do know that things will change. We don't necessarily know what will change, how the changes will be brought about, when the changes will occur, or why they will take place, but we do know this: things will change.
μ’μ μννΈμ¨μ΄λ λ³νλ₯Ό μ μμ©νλ€. μλ‘μ΄ κΈ°λ₯μ μμ©νκ³ , μλ‘μ΄ νλ«νΌμ μ μ μ©λκ³ , μλ‘μ΄ μꡬλ₯Ό μ λ°μ λ€μ΄λ©°, μλ‘μ΄ μ
λ ₯μ μ μ‘λλ€. μ΄λ° μννΈμ¨μ΄λ μ μ°νκ³ , κ°νκ³ , μ λ’°μ±μκ³ , λλ° μν©(μ¬κ³ )μ μν΄ μ£½μ§ μλλ€. μ΄λ° μννΈμ¨μ΄λ λ―Έλμ νμν μμλ₯Ό μμνκ³ , μ€λλ ꡬνμμ ν¬ν¨μν€λ νλ‘κ·Έλλ¨Έλ€μ μν΄μ λμμΈλλ€. μ΄λ¬ν μ’
λ₯μ μννΈμ¨μ΄λ-μ°μνκ² λ³ννλ μννΈμ¨μ΄- program in the future tens(λ§€λμ νλ‘κ·Έλ¨:μ΄ν μλ¬Έ μ§μ μ¬μ©)μ κ°μνλ μ¬λλ€μ΄ μμ±νλ€.
program in future tenseλ, λ³νμ μμ©νκ³ , μ€λΉνλ€. λΌμ΄λΈλ¬μ μΆκ°λ μλ‘μ΄ ν¨μ, μμΌλ‘ μΌμ΄λ μλ‘μ΄ μ€λ²λ‘λ©(overloading)μ μκ³ , μ μ¬μ μΌλ‘ λͺ¨νΈμ±μ κ°μ§ ν¨μλ€μ κ²°κ³Όλ₯Ό μμΈ‘νλ€. μλ‘μ΄ ν΄λμ€κ° μμ κ³μΈ΅μ μΆκ°λ κ²μ μκ³ , μ΄λ¬ν κ°λ₯μ±μ λνμ¬ μ€λΉνλ€. μλ‘μ΄ μ΄ν리μΌμ΄μ
μμ μ½λκ° μ°μ΄κ³ , κ·Έλμ μλ‘μ΄ λͺ©μ μΌλ‘ ν¨μκ° νΈμΆλκ³ , κ·Έλ° ν¨μλ€μ΄ μ νν λμμ μ μ§νλ€. νλ‘κ·Έλλ¨Έλ€μ΄ μ μ§ λ³΄μλ₯Ό ν λ, μΌλ°μ μΌλ‘ μλμ κ°λ°μμ μμμ΄ μλ, μ μ§ λ³΄μμ λͺ«μ μλ€. κ·Έλ¬λ―λ‘, λ€λ₯Έ μ¬λμ μν΄μ μννΈμ¨μ΄λ μ΄ν΄, μμ , λ°μ μ κ΄μ μμ ꡬννκ³ λμμΈλλ€.
μ΄λ° μ’μ μννΈμ¨μ΄λ₯Ό λ§λ€κΈ° μν λ°©λ²μΌλ‘, μ£Όμμ΄λ, κΈ°ν λ€λ₯Έ λ¬Έμ λμ μ C++ λ΄λΆμ λμμΈμΌλ‘ ꡬμν΄ λ²λ¦¬λ κ²μ΄λ€. μλ₯Όλ€μλ©΄ λ§μ½ ν΄λμ€κ° κ²°μ½ λ€λ₯Έ ν΄λμ€λ‘ μ λλμ§λ₯Ό μμΉ μμλ, λ¨μ μ£Όμμ ν€λ νμΌμ λ£λ κ²μ΄ μλλΌ, μ λλ₯Ό λ°©μ§νκΈ° μνμ¬ C++μ λ¬Έλ²μ μ΄μ©ν κΈ°μ λ‘ κ΅¬μ μν¨λ€.;μ΄μ λν λ°©λ²μ Item 26μ μΈκΈλμλ€. λ§μ½ ν΄λμ€κ° λͺ¨λ μΈμ€ν΄μ€λ₯Ό Heapμμμ μμ±μν€κ³ μ ν λ, ν΄λΌμ΄μΈνΈμκ² λ§(λ¬Έμ)λ‘ μ λ¬νλ κ²μ΄ μλλΌ. Item 27κ³Ό κ°μ μ κ·ΌμΌλ‘ μ ν μμΌ λ²λ¦΄ μ μλ€. λ§μ½ ν΄λμ€μ λνμ¬ λ³΅μ¬μ ν λΉμ λ§μλ €κ³ ν λλ, λ³΅μ¬ μμ±μμ ν λΉ(assignment) μ°μ°μλ₯Ό μ¬μ(private)μΌλ‘ λ§λ€μ΄ λ²λ €λΌ. C++μ νλ₯ν νκ³Ό, μ μ°μ±, ννμ±μ μ 곡νλ€. μ΄λ¬ν μΈμ΄μ νΉμ§λ€μ λΉμ μ νλ‘κ·Έλλ°μμ λμμΈμ μ μ±
μ μν΄μ μ¬μ©νλΌ.
DeleteMe λͺ¨νΈ
"λ³ννλ€.", νλν μννΈμ¨μ΄μ λ°μ μ μ 견λλ ν΄λμ€λ₯Ό μμ±νλΌ. (μλ¬Έ:Given that things will change, writeclasses that can withstand the rough-and-tumble world of software evolution.) "demand-paged"μ κ°μ ν¨μλ₯Ό νΌνλΌ. λ€λ₯Έ μ΄κ° λ§λ€μ΄ λμ§ μμΌλ©΄, λλ λ§λ€ λ°©λ²μ΄ μλ κ·Έλ° κ²½μ°λ₯Ό νΌνλΌ.(λͺ¨νΈ, μλ¬Έ:Avoid "demand-paged" virtual functions, whereby you make no functions virtual unless somebody comes along and demands that you do it) λμ μ ν¨μμ meaningμ κ²°μ νκ³ , μ λλ ν΄λμ€μμ μλ‘κ² μ μν κ²μΈμ§ νλ¨νλΌ. κ·Έλ κ² λλ©΄, κ°μ(virtual)μΌλ‘ μ μΈν΄λΌ, μ΄λ€ μ΄λΌλ μ¬μ μ λͺ»ν μ§λΌλ λ§μ΄λ€. κ·Έλ μ§ μλ€λ©΄, λΉκ°μ(nonvirtual)μΌλ‘ μ μΈν΄λΌ, κ·Έλ¦¬κ³ μ°¨νμ κ·Έκ²μ λ°κΎΈμ΄λΌ μλνλ©΄ κ·Έκ²μ λ€λ₯Έμ¬λμ νΈνκ² νκΈ° λλ¬Έμ΄λ€.;μ 체 ν΄λμ€μ λͺ©μ μμ λ³νλ₯Ό μ μ§νλμ§ νμ μ ν΄λΌ.
"λ³ννλ€.", νλν μννΈμ¨μ΄μ λ°μ μ μ 견λλ ν΄λμ€λ₯Ό μμ±νλΌ. (μλ¬Έ:Given that things will change, writeclasses that can withstand the rough-and-tumble world of software evolution.) "demand-paged"μ κ°μ ν¨μλ₯Ό νΌνλΌ. λ€λ₯Έ μ΄κ° λ§λ€μ΄ λμ§ μμΌλ©΄, λλ λ§λ€ λ°©λ²μ΄ μλ κ·Έλ° κ²½μ°λ₯Ό νΌνλΌ.(λͺ¨νΈ, μλ¬Έ:Avoid "demand-paged" virtual functions, whereby you make no functions virtual unless somebody comes along and demands that you do it) λμ μ ν¨μμ meaningμ κ²°μ νκ³ , μ λλ ν΄λμ€μμ μλ‘κ² μ μν κ²μΈμ§ νλ¨νλΌ. κ·Έλ κ² λλ©΄, κ°μ(virtual)μΌλ‘ μ μΈν΄λΌ, μ΄λ€ μ΄λΌλ μ¬μ μ λͺ»ν μ§λΌλ λ§μ΄λ€. κ·Έλ μ§ μλ€λ©΄, λΉκ°μ(nonvirtual)μΌλ‘ μ μΈν΄λΌ, κ·Έλ¦¬κ³ μ°¨νμ κ·Έκ²μ λ°κΎΈμ΄λΌ μλνλ©΄ κ·Έκ²μ λ€λ₯Έμ¬λμ νΈνκ² νκΈ° λλ¬Έμ΄λ€.;μ 체 ν΄λμ€μ λͺ©μ μμ λ³νλ₯Ό μ μ§νλμ§ νμ μ ν΄λΌ.
λͺ¨λ ν΄λμ€μμ ν λΉ(assignment), 볡μ¬λ₯Ό μ‘μλΌ. "λΉλ‘ μ무κ²λ νμ§ μλ κ²"μ΄λΌλ λ§μ΄λ€. μλνλ©΄ κ·Έκ²λ€μ΄ μ§κΈ ν μ μλ건 λ―Έλμλ ν μ μλ€λ μλ―Έμ΄λ€. λ§μ½ μ΄λ¬ν ν¨μλ€μ΄ ꡬννκΈ°μ μ΄λ ΅κ² νλ€λ©΄, κ·Έκ²μ privateλ‘ μ μΈνλΌ. λ―Έλμλ λμμν€κ² νμ§ μλ€λ μλ―Έλ€. μ»΄νμΌλ¬κ° λ§λ€μ΄λ΄λ ν¨μμ λν λͺ¨νΈν νΈμΆμ ν λ¦¬κ° μλ€. (κΈ°λ³Έ ν λΉ μμ±μλ κΈ°λ³Έ λ³΅μ¬ μμ±μκ° μ’
μ’
λ°μλλ κ²μ²λΌ)
μ리λ₯Ό ꡬννκΈ° μν΄ νΉμ΄νκ² νμ§ λ§λΌ.:μ°μ°μμ ν¨μλ₯Ό μμ°μ€λ½κ³ λͺ
μμ μΈ λ¬Έλ²μΌλ‘ μ 곡νλΌ. built-in(κΈ°λ³Έ μλ£) νμΌλ‘ ꡬννλΌ:μμ¬λ λλ intλ‘ νλΌ
μ΄λ€μ΄κ° 무μΈκ°λ₯Ό ν μμλ€λκ² μκ²λλ©΄ κ·Έλ€μ κ·Έκ²μ ν κ²μ΄λ€. κ·Έλ€μ μμΈλ₯Ό λμ§ κ²μ΄λ€. κ·Έλ€μ κ·Έλ€ μ€μ€λ‘μκ² κ°μ²΄λ₯Ό ν λΉν κ²μ΄λ€. κ·Έλ€μ κ°μ μ 곡νκΈ°μ μ κ°μ²΄λ₯Ό μ¬μ©ν κ²μ΄λ€. κ·Έλ€μ κ°μ²΄λ₯Ό μ 곡νκ² μ§λ§, κ²°μ½ μ¬μ©νμ§ μλλ€. κ·Έλ€μ 컀λ€λ κ°μ μ 곡ν κ²μ΄λ€. κ·Έλ€μ μμ£Ό μμ κ°μ μ 곡ν κ²μ΄λ€. κ·Έλ€μ null κ°μ μ 곡ν κ²μ΄λ€. μΌλ°μ μΌλ‘ λ§μ½ μ»΄νμΌμ΄ λλ©΄ μ΄λ€μ΄κ° κ·Έκ²μ ν κ²μ΄λ€. κ²°κ³Όμ μΌλ‘ λΉμ μ ν΄λμ€λ₯Ό μ νν μ¬μ©νλ건 μ½κ², μ΄μνκ² μ¬μ©νλ건 μ΄λ ΅κ² λ§λ€μ΄λΌ. ν΄λΌμ΄μΈνΈκ° μ€μλ₯Ό νλλ‘ ν΄λΌ κ·Έλ¦¬κ³ λΉμ μ ν΄λμ€λ€μ΄ κ·Έλ¬ν μλ¬λ€μ λ°©μ§νκ³ , μ°Ύκ³ , μμ ν μ μκ² λ§λ€μ΄λΌ. (μλ₯Όλ€μ΄ Item 33 μ°Έκ³ )
μ΄μμ± μλ μ½λλ₯Ό λ§λ€μ΄λΌ. μ΄μμ± μλ νλ‘κ·Έλ¨μ μ μμ κ·Έλ μ§ μμ κ²½μ°λ³΄λ€ λ§€μ° μ΄λ €μ΄κ² μλλ€. κ·Έλ¦¬κ³ λμ λ³΄μΌ λ§νΌ μ±λ₯λ©΄μμ μ΄μμ± μλ μ½λλ₯Ό κ³ μ§ν΄μΌ νλ κ²½μ°λ ν¬κ·νλ€.(Item 16μ°Έκ³ ) νΉμ ν νλμ¨μ΄λ₯Ό μν νλ‘κ·Έλ¨μ λμμΈμμλ, μΌλ§ μμμ΄ νλμ¨μ΄ μ±λ₯μ΄ λμΌν μμ€μ μ±λ₯μ κ°μ Έλ€ μ£Όλ―λ‘, μ΄μμ± μλλ‘ λ§λ€μ΄λΌ. μ΄μμ± μλ μ½λμ μμ±μ νλ«νΌ κ°μ λ³νμ μ½κ³ , λΉμ μ ν΄λΌλΌμ΄μΈνΈ κΈ°λ°μ κ³΅κ³ ν νκ³ , μ€ν μμ€ν
μ μ§μμ κ΄νμ¬ μ’λ€. λ§μ½, ν OSμμ μ±λ₯μ΄ μ€ν¨ν΄λ, μ½κ² 볡ꡬν μ μλ€.
λΉμ μ μ½λλ₯Ό λ³νκ° νμν λ, κ·Έ ν¨κ³Όλ₯Ό μ§μν(μ§μν:localized) μν€λλ‘ λμμΈ ν΄λΌ. κ°λ₯νν μΊ‘μν νμ¬λΌ:ꡬ체μ μΈ κ΅¬νμ private νλΌ. κ΄λ²μνκ² μ μ©ν΄μΌ ν κ³³μ΄ μλ€λ©΄ μ΄λ¦μλ(unamed) namespaceλ, file-staticκ°μ²΄ λ ν¨μ(Item 31μ°Έκ³ )λ₯Ό μ¬μ©νλΌ. κ°μ κΈ°μ΄ ν΄λμ€κ° μ£Όλνλ λμμΈμ νΌνλΌ. μλνλ©΄ κ·Έλ¬ν ν΄λμ€λ κ·Έλ€λ‘ λΆν° μ λλ λͺ¨λ ν΄λμ€κ° μ΄κΈ°ν ν΄μΌλ§ νλ€. - κ·Έλ€μ΄ μ§μ μ μΌλ‘ μ λλμ§ μμ κ²½μ°λ(Item 4μ°Έκ³ ) if-than-elseμ κ°λ¨μμΌλ‘ μ¬μ©ν RTTI κΈ°λ°μ λμμΈμ νΌνλΌ.(Item 31μ°Έκ³ ) νμ ν΄λμ€μ κ³μΈ΅μ λ³ννλ€. κ° μ½λλ€μ μ
λ°μ΄νΈ λμ΄μΌλ§ νλ€. κ·Έλ¦¬κ³ λ§μ½ νλλ₯Ό μ½μ΄ λ²λ¦°λ€λ©΄, λΉμ μ μ»΄νμΌλ¬λ‘ λΆν° μλ¬΄λ° warningλ₯Ό λ°μμ μμ κ²μ΄λ€.
μ΄μ κ°μ λ΄μ©λ€μ μ무리 λ°λ³΅ν΄μ λ§νκ³€ νμ§λ§, λλΆλΆμ νλ‘κ·Έλλ¨Έλ€μ νμ¬μ μλ₯λ₯Ό κ·Έλλ‘ κ³ μ§νλ€. νλ₯ν μλͺ©μ C++ μ λ¬Έκ°κ° λ§νλ μΆ©κ³ μ κ΄ν΄μ μκ°ν΄λΌ.
- λΉμ μ B*κ° κ°λ¦¬ν€κ³ μλ Dλ₯Ό μ κ±°ν λ κ°μ νκ΄΄μλ₯Ό νμλ‘ νλ€.
~cpp class B { ... }; // κ°μ νκ΄΄μκ° μλ€. class D: public B { ... } B *pb = new D;
~cpp delete pb; // μ, λΉμ μ Bμμ κ°μ μμ±μκ° νμνλ€. μκ·Έλ°κ°?
DeleteMe μ 체μ μΌλ‘ λͺ¨νΈκ° μλλ€, λ€μ λ΄μ©μ λ΄μΌ μμ λ΄μ©μ΄ μ΄ν΄κ° κ°.
κ°μ μ£Όμ λ‘, λ λ€λ₯Έ νμμ κΈμ 보μ.
- λ§μ½ public base classκ° κ°μ νκ΄΄μλ₯Ό κ°μ§κ³ μμ§ μλ€λ©΄, μ λλ ν΄λμ€λ, μ λλ ν΄λμ€μ λ©€λ²λ€μ΄ νκ΄΄μλ₯Ό κ°μ§κ³ μμ§ μλ€.
~cpp class String { public: ~string(); }; class B { ... }
~cpp class D: public B{ string name; };
κ°μ νμλ μ΄λ κ² μ΄λ€.
- λ§μ½ λ€μ€ μμ μνμμ μ΄λ ν νκ΄΄μκ° μλ€λ©΄, λͺ¨λ κΈ°λ³Έ ν΄λμ€κ° μλ§ κ°μ νκ΄΄μ(virtual destructor)κ° λμ΄μΌ ν κ²μ΄λ€.
λ―Έλμ μλ₯λ‘ μκ°νλ κ΄μ μ μμ ν λ€λ₯΄λ€. μ§κΈ μ΄λ»κ² ν΄λμ€λ₯Ό μ¬μ©νλλλ₯Ό 묻λκ² λμ μ, μ΄λ»κ² ν΄λμ€λ₯Ό λμμΈ νλλλ₯Ό 묻λλ€. λ―Έλ μ§ν₯μ μκ°μΌλ‘λ μ΄λ κ² λ§νλ€. λ§μ½ κΈ°μ΄ ν΄λμ€λ‘ μ¬μ©λ ν΄λμ€κ° λμμΈ λλ€λ©΄ κ·Έ ν΄λμ€λ κ°μ νκ΄΄μλ₯Ό κ°μ ΈμΌ νλ€. κ·Έλ¬ν ν΄λμ€λ μ§κΈκ³Ό λ―Έλ λͺ¨λ μ νν λμν΄μΌ νλ€. κ·Έλ¦¬κ³ κ·Έλ€μ€ λΆν° ν΄λμ€λ€μ΄ νμλ λ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ ν΄λμ€μκ² μν₯μ λΌμ³μλ μλλ€. ( μ΅μν, νκ΄΄μλ‘ μΈν λ
Όλ λ§νΌ, μν₯μ΄ μμ΄μΌ νλ€. μΆκ°μ μΈ λ³νκ° ν΄λμ€μ νμνλ©΄ λ€λ₯Έ ν΄λΌμ΄μΈνΈλ€μ€ μλ§ μν₯μ λ°μ κ²μ΄λ€.)
μμ
μ© ν΄λμ€ λΌμ΄λΈλ¬λ¦¬(C++νμ€ λΌμ΄λΈλ¬λ¦¬ μμ string μ€νμ λ μ§λ₯Ό μλΉκΈ°λ €λ νμ¬)λ κ°μ νκ΄΄μλ₯Ό κ°μ§κ³ μμ§ μμ stingν΄λμ€λ₯Ό ν¬ν¨νλ€. κ·Έ λ²€λμ μ€λͺ
μ?
- μ°λ¦¬λ κ°μ νκ΄΄μλ₯Ό λ§λ€μ§ μλλ€. μλνλ©΄, Stringκ° vtblμ κ°μ§κΈ°λ₯Ό μνμ§ μκΈ° λλ¬Έμ΄λ€. μ°λ¦¬λ String*λ₯Ό κ°μ§κ²ν μλλ μλ€. κ·Έλμ μ΄λ λ¬Έμ κ° λμ§ μλλ€. μ°λ¦¬λ μ΄κ²μ΄ μλ°νλ μ΄λ €μμ λνμ¬ μκ°νμ§ μλλ€.
νμ€ν vtbl λ¬Έμ λ ν©λ²μ μΈ μ κ·Όμ΄λ€. (Item 24μ°Έκ³ ) λλ€μ Stringν΄λμ€μ ꡬνμμ μ€μ§ νλμ char*λ₯Ό κ°κ°μ String κ°μ²΄κ° κ°μ§κ³ μλ€. κ·Έλμ κ° Stringκ°μ²΄μ μΆκ°λλ vptrλ λλ°°μ μμ μ°¨μ§νλ€. νμ©νμ§ μμΌλ €λ μ΄μ λ μ΄ν΄νκΈ° μ½λ€. Stringκ°μ ν΄λμ€λ₯Ό 무κ²κ² μ¬μ©νλ©΄ λμ λ λ μ±λ₯ μ νκ° μλ€. μμ μΈκΈν κ²½μ° ν΄λμ€λΉ μ±λ₯ μ νλ μ½ 20%μ λλ₯Ό κ°μ§κ³ μ¨λ€. (Item 16μ°Έκ³ )
λ¬Έμμ΄ κ°μ²΄μ λν λ©λͺ¨λ¦¬μ ν λΉμ-λ¬Έμμ κ°μ κ°μ§κ³ μκΈ° μν΄ νμλ‘νλ heapλ©λͺ¨λ¦¬κΉμ§ κ°μν΄μ-μΌλ°μ μΌλ‘ char*μ΄ μ°¨μ§νλ μμ λΉνμ¬ ν¨μ¬ ν¬λ€. μ΄λ¬ν κ΄μ μμ, vtprμ μν μ€λ²ν€λ(overhead)λ λ―Έλ―Ένλ€. κ·ΈλΌμλ λΆκ΅¬νκ³ , κ·Έκ²μ ν λ§ν(ν©λ²μ μΈ,μ¬λ°λ₯Έ) κ³ λ―Όμ΄λ€. (νμ€ν ISO/ANSI ν¬μ€ λ¨μ²΄μμλ κ·Έλ¬ν κ΄μ μΌλ‘ μκ°νλ€. κ·Έλμ νμ€ strnig νμ λΉ κ°μ νκ΄΄μ(nonvirtual destructor) μ΄λ€.)
μ΄λ€ κ²μ΄ λ λ§μ λ¬Έμ λ₯Ό μΌμΌν€λ κ²μΌλ‘, λ°΄λλ€μ μ£Όλͺ©μ λ°κ³ μμκΉ? "μ°λ¦¬λ String*μ μ¬μ©νλ λͺ©μ μ κ°μ§μ§ μλλ€. κ·Έλμ μ΄λ λ³ λ¬Έμ κ° λμ§ μλλ€." 그건 μλ§ μ¬μ€μΌ κ²μ΄λ€. νμ§λ§ κ·Έλ€μ Stringν΄λμ€λ μλ§μ κ°λ°μλ€μ΄ μ¬μ©κ°λ₯ν κ²μ΄λ€. μλ§μ κ°λ°μλ€μ΄ C++μ μμ€μ΄ μ κ°κ°μ΄λ€. μ΄λ¬ν κ°λ°μλ€μ΄ Stringμμμμ λΉκ°μ νκ΄΄μ(no virtual destructor)λ₯Ό μ΄ν΄ν κΉ? κ·Έλ€μ΄ λΉκ°μ νκ΄΄μλ₯Ό κ°μ§ Stringλλ¬Έμ StringμΌλ‘ μ λλ μλ‘μ΄ ν΄λμ€κ° λͺ¨ν λΉμ·ν κ²μ μκ³ μμκΉ? μ΄λ° λ²€λλ€μ κ·Έλ€μ ν΄λΌμ΄μΈνΈλ€μ΄ κ°μ νκ΄΄μκ° μλ μνμμ String*λ₯Ό ν΅νμ¬ μμ κ° μ¬λ°λ₯΄κ² μλνμ§ μκ³ , RTTIμ Stringμ λν μ°Έμ‘°κ° μλ§ λΆμ νν μ 보λ₯Ό λ°ννλ€λκ±Έ νμ μν¬κΉ? μ΄ ν΄λμ€κ° μ νν μ°κΈ° μ¬μ΄ ν΄λμ€μΌκΉ? λΆμ ννκ² μ°κΈ° μ΄λ €μ΄ ν΄λμ€μΌκΉ?
μ΄ λ²€λλ λ¬Όλ‘ Stringν΄λμ€μ κ΄ν μ λν΄μλ μλλλ‘ λμμΈ λ λ¬Έμλ€μ μ 곡ν κ²μ΄λ€. νμ§λ§, νλ‘κ·Έλλ¨Έλ€μ΄ λ¬Έμλ₯Ό 보λ λμ€μ κ·Έ λΆλΆμ λμ³€λ€λ©΄ μ΄λ»κ² νκ² λκ°?
λμμΌλ‘ C++μ μ¬μ©ν λ μ λλ₯Ό μ νν΄ λ²λ¦¬λ κ²μ΄λ€. Item 26μμ μ΄λ»κ² κ°μ²΄λ₯Ό heapμ λ§λ€κ±°κ³ auto_ptrκ°μ²΄λ‘ heapκ°μ²΄λ₯Ό μ‘°μ νλ λ°©λ²μ κ΄ν΄μ μΈκΈνμλ€. Stringμ μν μΈν°νμ΄μ€ μμ±μ μλ§ λ
νΉνκ³ λΆνΈν λ€μκ³Ό κ°μ λ¬Έλ² μ μꡬνλ€.
~cpp auto_ptr<String> ps(String::makeString("Future tense C++")); ... // μ΄μ ν΄λΉ κ°μ²΄λ ν¬μΈν°μ²λΌ λ€λ£¬λ€. νμ§λ§ deleteλ₯Ό λΆλ₯΄μ§ λ§μμΌ νλ€.
~cpp String s("Future tense C++");
λ¬Όλ‘ , νμνλ€λ©΄ νμ¬ κ°μνλ μκ°μΌλ‘ μ κ·Όνλ€. λΉμ μ΄ κ°λ°μ€μΈ μννΈμ¨μ΄λ νμ¬μ μ»΄νμΌλ¬μμ λμν΄μΌλ§ νλ€.;λΉμ μ μ΅μ μ μΈμ΄κ° ν΄λΉ κΈ°λ₯μ ꡬνν λκΉμ§ κΈ°λ€λ¦¬μ§ λͺ»νλ€. λΉμ μ νμ¬ κ°μ§κ³ μλ μΈμ΄μμ λμν΄μΌ νκ³ . κ·Έλμ λΉμ μ ν΄λΌμ΄μΈνΈμμ μ¬μ© κ°λ₯ν΄μΌ νλ€.;λΉμ μ κ³ κ°μκ² κ·Έλ€μ μμ€ν
μ μ
κ·Έλ μ΄λ νκ±°λ, μν νκ²½μ(operating environment) λ°κΎΈκ² νμ§λ λͺ»ν κ²μ΄λ€. 그건μ μ§κΈ μνν¨μ 보μ¦ν΄μΌ νλ€.;μ’λ μμ, μ’λ λΉ λ₯Έ νλ‘κ·Έλ¨μ λν μ½μμ λΌμ΄ν μ¬μ΄ν΄μ μ€μ΄κ³ , κ³ κ°μκ² κΈ°λκ°μ λΆν릴 κ²μ΄λ€. κ·Έλ¦¬κ³ λΉμ μ΄ λ§λλ νλ‘κ·Έλ¨μ κ³§ μλν΄μΌλ§ νλ€. μ΄λ μ’
μ’
"μ΅μ μ κ³Όκ±°"λ₯Ό λ§λ€μ΄ λ²λ¦°λ€. μ΄λ μ€μν μλ°μ΄λ€. λΉμ μ μ΄λ₯Ό 무μν μ μλ€.
- μ΄λ€ λΆλΆμ΄ νμ¬μ¬μ©ν μ μλλΌλ, μμ ν ν΄λμ€λ₯Ό μ 곡νλΌ. μλ‘μ΄ μκ΅¬κ° λΉμ μ ν΄λμ€λ₯Ό λ§λ€κ² ν λ, λΉμ μ μλ‘μ΄ ν΄λμ€λ₯Ό μμ νκ±°λ, κ³Όκ±°λ‘ λμκ° μΌμ΄ μμκΊΌλ€.
- λΉμ μ μΈν°νμ΄μ€μκ² μΌλ°μ μΈ κΈ°λ₯μ μ 곡νκ³ , μλ¬λ₯Ό λ°©μ§νλλ‘ λμμΈ ν΄λΌ. λΆμ ννκ² μ¬μ©νκΈ° μ΄λ ΅κ² νκ³ , μ ννκ² μ¬μ©νκΈ° μ½κ² λ§λ€μ΄λΌ. μλ₯Ό λ€μ΄μ ν΄λμ€μ λν 볡μ¬λ ν λΉμ λν μ°μ°μλ₯Ό μμ μ, 볡μ¬, ν λΉμ λͺ»νκ² νλΌ. λΆλΆμ μΈ ν λΉμ λνμ¬ μμνλΌ. (Item 33μ°Έκ³ )
- λ§μ½, λΉμ μ μ½λλ₯Ό ꡬν (generalize:μΌλ°ν) νκΈ° μν΄μ ν° μ νμ¬νμ΄ μλ€λ©΄, ꡬν(generalize:μΌλ°ν) ν΄λΌ. μλ₯Όλ€μ΄μ, λΉμ μ΄ tree κ²μ μκ³ λ¦¬μ¦μ μμ±νλ μ€μ΄λΌλ©΄, μ¬μ΄ν΄μ΄ μλ κ·Έλ νμ λν΄ μ μ© μν¬μ μλ μΌλ°νμ λν κΆλ¦¬λ₯Ό ν΄λΌ.
2. Item 33: Make non-leaf classes abstract. ¶
- Item 33: μ λλ ν΄λμ€κ° μλ μνμ ν΄λμ€λ‘ μΆμν νλΌ.
Animal ν΄λμ€λ μ£Όμ΄μ§ λͺ¨λ μλͺ
체λ€μ΄ 곡μ νκ³ μλ λΆλΆμ΄λ€. κ·Έλ¦¬κ³ Lizardκ³Ό Chicken ν΄λμ€λ Animalμμ λλ§λ±κ³Ό λλ§μΌλ‘ νΉνλ ν΄λμ€μ΄λ€.
μ¬κΈ° μ΄λ€ ν΄λμ€λ€μ λκ°μ λͺ¨μ΅μ κ·Έλ¦°λ€.
~cpp class Animal { public: Animal& operator=(const Animal& rhs); ... }; class Lizard: public Animal { public: Lizard& operator=(const Lizard& rhs); ... }; class Chicken: public Animal { public: Chicken& operator=(const Chicken& rhs); ... };
~cpp Lizard liz1; Lizard liz2; Animal *pAnimal1 = &liz1; Animal *pAnimal2 = &liz2; ... *pAnimal1 = *pAnimal2;
λλ²μ§Έ λ¬Έμ λ μ§μ§ νλ‘κ·Έλλ¨Έλ€μ΄ μ΄μ κ°μ μ½λλ₯Ό μ΄λ€λ κ²μ΄λ€. νΉλ³ν C++λ‘ μ ν₯ν Cνλ‘κ·Έλλ¨Έλ€μ κ²½νμμ 보면, ν¬μΈν°λ₯Ό ν΅ν κ°μ²΄μ ν λΉμ 그리 ννμ§ μμκ²λ μλλ€. κ·Έλ¬ν κ²½μ°λ μ΄μ±μ μΈ μκ°μΌλ‘ μ·¨ν ν λΉκ°μ΄ 보μΈλ€. Item 32μ μ΄μ μ€, μμ κ΄κ³ μμμ μ°λ¦¬μ ν΄λμ€λ μ νν μ¬μ©νκΈ° μ½κ³ , λΆμ ννκ² μ¬μ©νκΈ° μ΄λ ΅κ² ν΄μΌ νλ€κ³ μΈκΈνλ€.
λ¬Έμ μ λν νκ°μ§ μ κ·ΌμΌλ‘ ν λΉ(assignment)μ°μ°μλ₯Ό κ°μ(virtual)λ‘ μ μΈνλ λ°©λ²μ΄ μλ€. λ§μ½ Animal::operator= κ° κ°μ(virtual)μ΄λ©΄, μμ κ²½μ°μ ν λΉ μ°μ°μλ μ νν Lizard ν λΉ μ°μ°μλ₯Ό νΈμΆνλ €κ³ μλν κ²μ΄λ€. κ·Έλ μ§λ§ λ§μ½ μ°λ¦¬κ° κ°μμΌλ‘ ν λΉ μ°μ°μλ₯Ό μ μΈνμλ λ€μμ λ΄λΌ.
~cpp class Animal { public: virtual Animal& operator=(const Animal& rhs); ... }; class Lizard: public Animal { public: virtual Lizard& operator=(const Animal& rhs); ... }; class Chicken: public Animal { public: virtual Chicken& operator= (const Animal& rhs); ... };
~cpp Lizard liz; Chicken chick; Animal *pAnimal1 = & liz; Animal *pAnimal2 = & chick; ... *pAnimal1 = *pAnimal2; // chickenμ lizardμ ν λΉνλ¨ λ§μ΄λ€.!
μ΄κ²μ μ΄λ €μ΄ λ©΄μ΄λ€. μ°λ¦¬λ same-type ν λΉλ§ ν¬μΈν°λ‘ νμ©νκ² λ§λ€μ΄μΌ ν κ²μ΄λ€. κ·Έμ λ°νμ¬ κ°μ ν¬μΈν°λ₯Ό ν΅ν Mix-type ν λΉμ κ±°λΆλλλ‘ λ§λ€μ΄μΌ νλ€. λ€λ₯Έ λ§λ‘ νμλ©΄ μ°λ¦¬λ μ΄λ°κ±΄ ν΅κ³Όμ§λ§
~cpp Animal *pAnimal1 = &liz1; Animal *pAnimal2 = &liz2; ... *pAnimal1 = *pAnimal2; // ν΅κ³Όλ₯Ό μν΄μ! κ°μ νμ΄λ―λ‘
~cpp Animal *pAnimal1 = &liz; Animal *pAnimal2 = &chick; ... *pAnimal1 = *pAnimal2; // μλκΈΈ μν΄μ~
μ°λ¦° dynamic_cast(Item 2μ°Έκ³ )λ₯Ό μ΄λ¬ν νλμ μ μ©ν΄μ μ¬μ©ν μ μλ€. μ¬κΈ° Lizardμ ν λΉ μ°μ°μμ λν λ°©λ²μ΄ μλ€.
~cpp Lizard& Lizard::operator=(const Animal& rhs) { // lizardκ° μ§μ§ rhsκ° λ§λκ°? const Lizard& rhs_liz = dynamic_cast<const Lizard&>(rhs); *thisμ rhs_lizμ μΌλ°μ μΈ ν λΉκ³Όμ μνμ νλ€. }
μμΈ κ΄ν μ£Όμκ° νμ μλ 보ν΅μ κ²½μ°μ, μ΄ ν¨μλ 볡μ‘νκ³ , λΉμ© λΆλ΄μ΄ νμν κ²μΌλ‘ 보μΈλ€.
~cpp Lizard liz1, liz2; ... liz1 = liz2; // dynamic_castκ° νμλ‘ νμ§ μλ€. μ΄κ±΄ λ°λμ μ³λ€.
~cpp class Lizard: public Animal { public: virtual Lizard& operator=(const Animal& rhs); Lizard& operator=(const Lizard& rhs); // λν λΆλΆ ... }; Lizard liz1, liz2; ... liz1 = liz2; // const Lizard&λ₯Ό μΈμλ‘ νλ operator= νΈμΆ Animal *pAnimal1 = &liz1; Animal *pAnimal2 = &liz2; ... *pAnimal1 = *pAnimal2; // const Ainmal&μΈμλ‘ κ°μ§λ operator= μ°μ°μ νΈμΆ
~cpp Lizard& Lizard::operator=(const Animal& rhs) { return operator=(dynamic_cast<const Lizard&>(rhs)); }
μμ§ν, dynamic_castλ₯Ό μ¬μ©ν΄μ μ€ν μκ°μ κ²μ¬νλ건 μ’ μ§μ¦λλ€. νκ°μ§, λͺλͺ μ»΄νμΌλ¬λ μμ§ dynamic_castμ λν μ§μμ΄ λΆμ‘±ν΄μ, μ΄λ₯Ό μ¬μ©νλ©΄, μ΄λ‘ μ μΌλ‘λ μ΄μμ±μ΄ 보μ₯λμ§λ§ μ€μ λ‘λ κ·Έλ μ§ μλ€. λ μ€μνκ² Lizardμ Chickenμ ν΄λΌμ΄μΈνΈλ€μ bad_cast μμΈμ λν μ€λΉμ, ν λΉμ μνν λμ κ° μ½λ©μμ λ―Όκ°νκ² μ²λ¦¬νμ§ λͺ»νλ€. λ΄ κ²½νμ λΉμΆμ΄ λ³Όλ λ§μ νλ‘κ·Έλλ¨Έλ€μ΄ κ·Έλ° λ°©λ²μ μ·¨νμ§ μκ³ μλ€. λ§μ½ κ·Έλ€μ΄ νμ§ μλλ€λ©΄, ν λΉμ΄ μΌμ΄λλ μλ§μ κ³³μμ μ ννμ§ μμ μ²λ¦¬μνλ‘, λͺ
λ£μ±μ 보μ₯ λ°μμ μλ€.
κ°μ ν λΉ μ°μ°μλ₯Ό μ΄μ©νλ κ² μμ λΆμΆ©λΆν μνκ° μ£Όμ΄μ§λ€. κ·Έκ²μ ν΄λΌμ΄μΈνΈκ° λ¬Έμ μλ ν λΉμ νλ κ²μ λ°©μ§νλ λ°©λ²μ μ°Ύλλ‘ λ
Έλ ₯νλλ° νμμ°κ² λ§λ λ€. λ§μ½ κ·Έλ¬ν ν λΉμ΄ μ»΄νμΌ μ€μ κ±°λΆλλ€λ©΄, μ°λ¦¬λ μλͺ»μ΄ μΌμ΄λ κ²μ λν΄ κ±±μ ν νμκ° μκ²λλ€.
κ°μ₯ μ¬μ΄ λ°©λ²μ Animal λ΄λΆμ operator=λ₯Ό μ¬μ(private)λ‘ λ¬Άμ΄μ ν λΉ μ체λ₯Ό νμ§ λͺ»νκ² λ§λ€μ΄ λ²λ¦¬λ κ²μ΄λ€. κ·Έλ° λ°©λ²μ λλ§λ±μ΄ λλ§λ²°μκ², λμ΄ λμκ²λ§ ν λΉμ ν μ μμ§λ§, λΆλΆμ μ΄κ³ Mix-type ν λΉμ λ°©μ§νλ€.
~cpp class Animal { private: Animal& operator=(const Animal& rhs); // μ¬μ(private)μ΄λ€. ... }; class Lizard: public Animal { public: Lizard& operator=(const Lizard& rhs); ... }; class Chicken: public Animal { public: Chicken& operator=(const Chicken& rhs); ... }; Lizard liz1, liz2; ... liz1 = liz2; // μ³λ°λ₯΄λ€. Chicken chick1, chick2; ... chick1 = chick2; // μμ μ³λ°λ₯΄λ€. Animal *pAnimal1 = &liz1; Animal *pAnimal2 = &chick1; ... *pAnimal1 = *pAnimal2; // μλ¬! Animal::operator=κ° μ¬μμ΄λΌ μλ¬λλ€.
~cpp Animal animal1, animal2; ... animal1 = animal2; // μλ¬! Animal::operator=κ° μ¬μ(private)μ΄λ€.
~cpp Lizard& Lizard::operator=(const Lizard& rhs) { if (this == &rhs) return *this; Animal::operator=(rhs); // μλ¬! μ¬μ(private) μΈμμ ν¨μλ₯Ό νΈμΆνλ μλλ₯Ό νλ€. // νμ§λ§ Lizard::operator=λ λ°λμ μ΄ ν¨μλ₯Ό Animal λΆλΆ // μ ν λΉμ μν΄ νΈμΆν΄μΌ νλ€. ... }
κ·Έλ¦¬κ³ λ€μκ³Ό κ°μ΄ μ μ λλ€.
μ΄ λμμΈμ λΉμ μ΄ νμν λͺ¨λ κ²μ μ 곡νλ€. λμ’
μ ν λΉμ κ΄ν΄μ λλ¬Ό, λλ§λ±, λμ ν λΉ μ°μ°μ νμ©νλ€.;λΆλΆμ μΈ ν λΉκ³Ό νμ’
κ°μ ν λΉμ κΈμ§νλ€λ κ²;κ·Έλ¦¬κ³ μ λλ ν΄λμ€μ ν λΉμ μλ§ κΈ°λ³Έ ν΄λ μ€ λ΄μ ν λΉ μ°μ°μκ° λ§‘μ κ²μ΄λ€. κ²λ€κ° Animal, Lizard, Chickenν΄λμ€μ μν μ΄ κΈ°λ‘λ μ½λλ€μ μμ μ νμλ‘ νμ§ μλλ€. μλνλ©΄, μ΄λ€ ν΄λμ€λ μκ³λ AbstractAnimal ν΄λμ€λ‘ κΈ°μ‘΄μ μν λ€μ λμ λ°μμ μλ€. λ¬Όλ‘ , κ·Έλ¬ν μ½λλ€μ μ¬ μ»΄νμΌμ΄ λμ΄μΌ νλ€. κ·Έλ μ§λ§ μ»΄νμΌλ¬κ° ν λΉμ λͺ
μμ±μ 보μ₯ν΄ μ£Όμ΄μ 보μ₯λλ 보μμ±μ λΉνμ¬ μμ λΉμ©μ΄λ€.
~cpp class AbstractAnimal { protected: AbstractAnimal& operator=(const AbstractAnimal& rhs); public: virtual ~AbstractAnimal() = 0; // μ΄μ κ΄ν΄μλ μ€λͺ μ μμΈν ... }; class Animal: public AbstractAnimal { public: Animal& operator=(const Animal& rhs); ... }; class Lizard: public AbstractAnimal { public: Lizard& operator=(const Lizard& rhs); ... }; class Chicken: public AbstractAnimal { public: Chicken& operator=(const Chicken& rhs); ... };
λͺ¨λ μΌμ λνμ¬ AbstractTnimalμ λ°λμ μΆμμ μ΄μ΄μΌ νλ? κ·Έκ²μ λ°λμ μ΅μ νλμ μμ κ°μ ν¨μλ₯Ό κ°μ§κ³ μμ΄μΌ νλ€. λλΆλΆμ κ²½μ°μ μλ§λ ν¨μλ₯Ό κ³ λ₯΄κΈ°μλ λ³ λ¬Έμ κ° μλ€. κ·Έλ μ§λ§ ν¬κ·ν κ²½μ°μ λΉμ μ μλ§ AbstractAnimal κ°μ ν΄λμ€λ₯Ό λ§λ€μ΄μΌ νλ μν©μ μ§λ©΄ν μ§λ λͺ¨λ₯Έλ€. κ·Έλ¬ν κ²½μ°μ, μ λΉν λ°©λ²μ μμ κ°μ ν¨μλ‘ νκ΄΄μλ₯Ό λ§λ€μ΄ λ²λ¦¬λ κ²μ΄λ€.;μμμ 보λκ²κ³Ό κ°μ΄ λ§μ΄λ€.ν¬μΈν°λ₯Ό ν΅ν λ€νμ±μ μ§μνκΈ° μνμ¬ κΈ°λ³Έ ν΄λμ€λ κ°μ νκ΄΄μλ₯Ό μ΄λ€ λ°©λ²μΌλ‘λ νμλ‘ νλ€. κ·Έλμ μμ κ°μν¨μλ₯Ό λ§λ€κΈ° μν λΉμ©λ§μ΄ ν΄λΉ ν΄λμ€ μ μλΆ λ°κΉ₯μμ μ΄λ£¨μ΄μ§ ꡬνμμ μ§λΆλλ€. (μλ₯Όλ€μ΄μ p195λ₯Ό 보μλΌ)
(μμ κ°μ ν¨μμ λν ꡬνμ κ°λ
μ΄ λΉμ μ νΌλμ€λ½κ² νλ€λ©΄, κ·Έκ±°μ μ κ²½μ λμΌλ©΄ λλ€. μμ κ°μ ν¨μμ μ μΈμ ꡬνμ΄ μλκ²μ μλ―Έ νμ§λ§μ μλ€. κ·Έκ²μ μλ―Ένλ€.
- νμ¬μ ν΄λμ€λ₯Ό μΆμν νλ€. 그리κ³
- νμ¬ ν΄λμ€μμ μ λλ μ΄λ ν concrete ν΄λμ€λΌλ λ°λμ "보ν΅" κ°μ ν¨μλ‘ ν¨μλ₯Ό μ μΈν΄μΌ νλ€. (λ€μ λ§ν΄ "=0"μ μ μΈνκ³ )
λΉμ μ μλ§λ λ°μ΄ν° λ©€λ²λ₯Ό κ°μ§λ Animal ν΄λμ€ κ°μ΄, Concrete κΈ°μ΄ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ μ 체νκ³ κΈ°μ΄ ν΄λμ€μ ν¬μΈν°λ₯Ό ν΅ν΄μ ν λΉμ λν λ
ΌμλΌλκ±Έ μ£Όλͺ©ν κ²μ΄λ€. κ·Έλ λ€λ©΄, λ§μ½ μλ¬΄λ° λ°μ΄ν°κ° μλ€λ©΄, μλμ λΆν©νλ, λ¬Έμ κ° μλ κ²μ΄ μκ³ , μ’λ μκ°ν΄ 보면, κ·Έκ²μ μλ£κ° μλ concrete ν΄λμ€κ° λλ² μμ λμ΄λ μμ ν κΊΌλΌκ³ μ견μ νΌμ§ λͺ¨λ₯Έλ€.
λκ°μ§ κ²½μ°μ νκ°μ§λ λΉμ μ λ°μ΄ν°κ° μλ concreteλ‘ μ μ©νλ€.:μ΄κ±΄ λ―Έλμ λ°μ΄ν°λ₯Ό κ°μ§μ§λ, μκ°μ§μ§λ λͺ¨λ₯Έλ€. λ§μ½ λ―Έλμ λ°μ΄ν°λ₯Ό κ°μ§λ€λ©΄, λΉμ μ΄ νλ λͺ¨λ κ²μ λ°μ΄ν° λ©€λ²κ° μΆκ°λ리λκΉμ§ λ¬Έμ λ₯Ό λ―Έλ£¨μ΄ λλ κ²μ΄λ€. μ΄λ° κ²½μ° λΉμ μ μ κΉμ νΈν¨κ³Ό μ€λ μκ°μ κ³ λλ₯Ό λ§λ°κΎΈλ κ²μ΄λ€. (Item 32μ°Έκ³ ) λμμΌλ‘, λ§μ½ κΈ°μ΄ ν΄λμ€κ° μ λ§ μ΄λ ν λ°μ΄ν°λ κ°μ§κ³ μμ§ μλ€λ©΄, μ²μμ μΆμν ν΄λμ€μ μμ£Ό λΉμ·ν μ΄μΌκΈ°κ° λλ€. concrete κΈ°λ³Έ ν΄λμ€λ λ°μ΄ν° μμ΄ μ¬μ©λλ건 무μμΈκ°?
AbstractAnimal κ°μ μΆμ κΈ°λ³Έ ν΄λμ€λ₯Ό Animal κ°μ concrete κΈ°λ³Έ ν΄λμ€λ‘μ κ΅μ²΄λ operator= μ λμμ λ μ½κ² μ΄ν΄ν μ μλ μ₯μ μ κ°μ Έλ€ μ€λ€. λν λΉμ μ΄ λ°°μ΄μ λ€ννκ² λ€λ£¨λ κΈ°ν μμ μ€μ¬μ€λ€.(λ°°μ΄κ³Ό ν΄λμ€μ λν κ΄κ³λ Item 3μ μ°Έκ³ νλΌ.) κ·Έλ μ§λ§, κΈ°μ μ μΌλ‘ κ°μ₯ λλλ¬μ§λ μ΄μ μ λμμΈ λ 벨μμ λνλλ€. μλνλ©΄ λΉμ μ μ μ©ν μΆμμ μ‘΄μ λ₯Ό λͺ
μμ μΌλ‘ μΈμ§ ν μ μκΈ° λλ¬Έμ΄λ€. κ·Έκ²μ μ μ©ν κ°λ
μ μ‘΄μ¬λ₯Ό μμνμ§ μμμ§λΌλ, λΉμ μΌλ‘ νμ¬κΈ μλ‘μ΄ μ μ©ν κ°λ
μ μν μΆμ ν΄λμ€ μμ±νκ² νλ€.
λ§μ½ λΉμ μ΄ C1,C2 λκ°μ concrete ν΄λμ€λ₯Ό κ°μ§κ³ μκ³ , C2λ C1μ public μμ νμλ λΉμ μ μλ§λ λ ν΄λμ€μ κ΄κ³λ₯Ό AλΌλ μλ‘μ΄ ν΄λμ€λ₯Ό μμ±ν΄μ, λ€μ ꡬ쑰λ₯Ό μ¬νΈνλ κ³Όμ μ λΆλ΄μμ΄ ν μ μλ€.
μ΄λ¬ν λ³ν κ³Όμ μμ μ²μμ κ°μ μΆμ μΆμ ν΄λμ€ A λ₯Ό νμΈνκ² λ§λ λ€. C1κ³Ό C2λ μλ§ λ³΄ν΅ λͺκ°μ§λ₯Ό κ°μ§κ³ μλ€.:κ·Έκ²μ κ·Έλ€μ΄ public μμμ΄ λλ μ΄μ μ΄λ€. μ΄ λ³νμΌλ‘ λΉμ μ λ°λμ κ·Έ κ°μ§κ³ μλ μ΄λ»κ²μ νμΈν΄μΌ νλ€. κ²λ€κ° C++μμ ν΄λμ€λ‘ λͺ¨νΈν λΆλΆμ λνμ¬ λͺ
ννκ² ν΄μ£Όμ΄μΌ νλ€. κ·Έκ²μ λ³΄ν΅ μΆμν(abstraction)κ° μΆκ΅¬ν΄μΌ νλ κ²μ΄κ³ μ μ μλ λ©€λ² ν¨μμ νμ€ν λ¬Έλ²μΌλ‘ ꡬνλλ€.
μ΄ λͺ¨λ κ²μ΄ μ΄λ€ μλͺ»λ μκ°μΌλ‘ μΈλνλ€. κ²°κ΅, λͺ¨λ ν΄λμ€λ μ΄λ ν μ’
λ₯μ μΆμνλ₯Ό νννλ€. κ·Έλμ μ°λ¦¬λ κ³μΈ΅ κ΄κ³μμ λͺ¨λ κ°λ
μ μν΄μ λκ°μ§μ ν΄λμ€λ₯Ό μμ±ν μκ° μκ² λμ§ μμκ°? νλλ μΆμνλ‘(μΆμνλ₯Ό νννλ λΆλΆ μμ±) νλλ concreteλ‘(κ°μ²΄ μμ± λΆλΆ μμ±)? μλλ€. λ§μ½ λΉμ μ΄ κ·Έλ κ² νλ©΄ λΉμ μ κ΅μ₯ν λ§μ ν΄λμ€λ‘ κ³μΈ΅ κ΄κ³λ₯Ό λ§λ€ κ²μ΄λ€. κ·Έλ¦¬κ³ μ»΄νμΌμλ λ§μ λΉμ©μ μμνλ€. κ·Έκ²μ κ°μ²΄ μ§ν₯ λμμΈμ μλͺ»λ λͺ©νμ΄λ€.
κ·Έ λͺ©νλ μ μ©ν μΆμνμ μΆμνλ₯Ό μΆμ ν΄λμ€λ‘ μ‘΄μ¬νκ² κ°μ ν΄ λ²λ¦¬ λλ‘ κ΅¬λΆνλ€. κ·Έλ μ§λ§ λΉμ μ μ΄λ»κ² μ μ©ν μΆμνλ₯Ό λΆκ° ν κ²μΈκ°? λκ° κ·Έ μΆμνκ° λ―Έλμλ μ μ©νμ§ μλ €μ£Όλκ°? λκ° μ΄λλ‘ λΆν° μμλλμ§ μμν μ μλκ°?
μ, λλ μ΄λ»κ² λ―Έλμ μμ κ΄κ³μ λν μ¬μ©μ μμΈ‘ν μ μλ€. κ·Έλ¬λ λλ μ΄κ±° νλλ μκ³ μλ€.:νλμ λͺ©μ μμ μΆμνμ λν νμλ λΉμ·ν κ²μ΄λΌλκ², κ·Έλ¬λ λ λ§μ λͺ©μ μΌλ‘ μΆμνμ λν νμμ±μ λ³΄ν΅ μ€μνλ€. μ¦, μ μ©ν μΆμνλ νλ μ΄μμ μ©λ(λͺ©μ )μμ νμμ±μ΄ μλ€. κ·Έκ²μ κ·Έλ λ μΆμνκ° κ·Έλ€μ λͺ©μ μ λΆν©νλ ν΄λμ€μ μ¬λ°λ₯΄κ² μ°μΈλ€λ κ²κ³Ό, μ λλ ν΄λμ€μμλ λν μ μ©νλ€λ κ±Έ μλ―Ένλ€. (μμ±μμ£Ό:μμ)
μ΄κ²μ μ ννκ² concrete κΈ°λ³Έ ν΄λμ€κ° μ μ©ν μΆμ κΈ°λ³Έ ν΄λμ€λ‘ λ³νλλ μ΄μ κ° λλ€.:κ·Έκ²μ μ€μ§ μ‘΄μ¬νλ concrete ν΄λμ€κ° κΈ°λ³Έ ν΄λμ€ κ°μλ, λ€μ λ§νλ©΄ ν΄λμ€κ° μλ‘μ΄ λͺ©μ μΌλ‘ μ¬μ¬μ© λ λ, μλ‘μ΄ μΆμ ν΄λμ€μ λμ
μ κ°μνλ€. κ·Έλ¬ν μΆμνλ μ μ©νλ€. μλνλ©΄ κ·Έλ€ μμ μ΄ λ³΄μ΄λ κ²κ³Ό κ°μ΄ ꡬνλ νμμ±μ κ°μ§κ³ μκΈ° λλ¬Έμ΄λ€.
μ²μμ μꡬλλ κ°λ
μ, μ°λ¦¬λ μΆμ ν΄λμ€(κ°λ
μ μν)μ concrete ν΄λμ€(κ°μ²΄κ° κ°λ
μ λ°μνκΈ° μν) μμͺ½λ€ μ λΉν μν¬μ μλ€. νμ§λ§ λλ²μ§Έλ‘ νμν κ°λ
μ, μ°λ¦¬κ° μ΄ λ ν΄λμ€μ μμ±μ μ λΉν ν μ μλ€. λ΄κ° κ°λ¨νκ² μΈκΈν λ³νμ μ΄λ¬ν κ³Όμ (process)λ₯Ό 곡μ ν(mechanize) νλ κ²μ΄λ€. κ·Έλ¦¬κ³ λΉλ‘ λμμ΄λμ νλ‘κ·Έλλ¨Έλ€μ΄ μ μ©ν κ°λ
μ νμ μμμ κ°μ§κ³ μκ°νμ§ μμμ§λΌλ, κ·Έλ€μκ² μκ°νλ μ μ©ν μΆμν κ³Όμ μ λͺ
μμ μΌλ‘ 보μ΄λλ‘ κ°μ νλ€.
λ―Ώμμ§ν μμ λ₯Ό μκ°ν΄ 보μ. λΉμ μ΄ λ€νΈμ μμμ μ΄λ€ νλ‘ν μ½μ μ΄μ©ν΄μ μ 보λ₯Ό ν¨ν· λ¨μλ‘ λλμ΄ μ»΄ν¨ν° μ¬μ΄μ μ΄λμν€λ μ΄ν리μΌμ΄μ
μ μμ±νλ€κ³ νμ.(λͺ¨νΈ κ·Έλμ μλ΅:by breaking it into packets) packetμ νννλ ν΄λμ€λ ν΄λμ€λ€μ κ΄νμ¬ μκ°ν΄μΌ ν κ²μ΄λ€. κ·Έλ¬ν ν΄λμ€λ€μ μ΄ μ΄ν리μΌμ΄μ
μ λνμ¬ μμκ³ μμ΄μΌ νλ€κ³ μ μ ν κ²μ΄λ€.
μΌλ¨, μ€μ§ νμ’
λ₯μ νλ‘ν μ½μ ν΅νμ¬ μ€μ§ νμ’
λ₯μ ν¨ν·λ§μ μ μ‘νλ€κ³ κ°μ νμ. μλ§λ λ€λ₯Έ νλ‘ν μ½κ³Ό ν¨ν·μ μ‘΄μ¬λ₯Ό μκ³ μμ κ²μ΄λ€. κ·Έλ μ§λ§ λΉμ μ κ·Έλ€μ μ§μνμ§ μκ³ , λ―Έλμλ μ΄λ€μ μ§μν κ³νμ΄ μμ κ²μ΄λ€. λΉμ μ ν¨ν·μ λν μΆμ ν΄λμ€(ν¨ν·μ νννλ κ°λ
μ μν)λ₯Ό μ¬μ©ν ν¨ν·μ concrete ν΄λμ€μ κ°μ΄ λ§λ€κ²μΈκ°? λ§μ½ κ·Έλ κ² νλ€λ©΄ λΉμ μ΄ ν¨ν·μ κΈ°λ³Έ ν΄λμ€μ λ³ν μμ΄ μ°¨νμ μλ‘μ΄ ν¨ν· ννλ₯Ό μΆκ°νλ κ²μ λ°λμ μλ€. κ·Έκ²μ μλ‘μ΄ ννμ ν¨ν·μ΄ μΆκ°λ κ²½μ° ν¨ν·κ³Ό κ΄λ ¨νμ¬ μ¬μ»΄νμΌν μκ³ λ₯Ό λμ΄ μ€κ²μ΄λ€. κ·Έλ μ§λ§ κ·Έλ° λμμΈμ λκ°μ ν΄λμ€λ₯Ό μꡬνλ€. κ·Έλ¦¬κ³ μ§κΈ λΉμ μκ²λ νλλ§μ΄ νμνλ€.(λΉμ μ΄ μ¬μ©νλ ν¨ν·λ§μ νννλ ν΄λμ€) μμμ§λ λͺ¨λ₯΄λ λ―Έλλ₯Ό μν νμ₯μ μν΄μ λΉμ μ λμμΈμ 볡μ‘νκ² νλ κ²μ ν΄μΌ ν κΉ?
μ¬κΈ°μλ μ νν λ΅μ λ΄λ¦΄μ μλ€. κ·Έλ μ§λ§ κ²½νμμΌλ‘ κ·Έκ²μ μ°λ¦¬κ° μμ ν μ΄ν΄νκΈ° νλ κ°λ
μ μ ꡬνν νλ₯ν ν΄λμ€μ λμμΈμλ κ²°μ½ κ°κΉμ μ§μ μμ κ²μΌλ‘ 보μΈλ€. λ§μ½ λΉμ μ΄ ν¨ν·μ μν΄μ μΆμ ν΄λμ€λ₯Ό λ§λ€μλ€λ©΄, μ€μ§ λ¨μΌ ν¨ν· ννλ‘ μ ννλ λμμΈ μ΄νμ μ΄λ»κ² μ³λ°λ₯Έ λμμΈμ ν μ μκ² λκ°? κΈ°μ΅ν΄ λ΄λΌ, λ§μ½ λΉμ μ΄ μΆμ ν΄λμ€λ‘ λμμΈν΄μ λ―Έλμ μ΄λ₯Ό μμν ν΄λμ€λ€λ‘ λμμΈμ λ³ λ³ν μμ΄ μ μλ μ μλ€λ λ©΄, μ΄λ° μΆμ ν΄λμ€κ° μ£Όλ μ₯μ μ μ»λλ€. (λ§μ½ λ³νκ° νμνλ€λ©΄ λͺ¨λ ν΄λΌμ΄μΈνΈμκ² μ¬ μ»΄νμΌμ μꡬν΄μΌ νλ€. κ·Έλ¦¬κ³ μ무κ²λ μ»μ§ λͺ»νλ€.)
λΉμ μ΄ νλ €λ νλ₯ν μΆμ ν¨ν· ν΄λμ€ λμμΈμ λΉμ μ΄ λ€μν λͺ©μ μ μλ§μ λ€λ₯Έ ν¨ν·μ νλ₯νκ² λ§λ€μ΄ λ³΄μ§ μκ³ μλ ν μ μλ€. μ΄λ² κ²½μ°μμ μ΄λ° μ νλ κ²½νμ μ μνλ κ²μ λμ μΆ©κ³ κ° ν¨ν·μ λν μ μκ° μλλΌ, μΆν μ€μ§ concrete ν¨ν· ν΄λμ€λ‘ λΆν° μμμ νμμ±μ΄ μμλμ, ν¨ν·μ μΆκ°λ₯Ό μ©μ΄νκ² νκΈ° μν κ²μ΄λ€.
λ΄κ° μ¬κΈ°μ μ μν λ³νμ μΆμ ν΄λμ€μ νμμ±μ νμΈνκΈ° μν νλμ λ°©λ²μ΄μ§ μ μΌν λ°©λ²μ μλλ€. μΆμ ν΄λμ€μ μ§μμ΄ μꡬλλ μλ§μ κ²½μ°λ€μ΄ μλ€.;κ°μ²΄ μ§ν₯μ λΆμμ μ±
λ€μ λ§λ€ λ§νΌ λ€μνλ€. μΆμ ν΄λμ€μ κ΄ν μκ°λ μ΄ κ²½μ° λ§μ΄ μλλΌ μμ μ€μ€λ‘ λ€λ₯Έ concrete ν΄λμ€μ λν μμ κ΄κ³λ₯Ό μ€κ³νλ©΄μ κΉ¨λ¬μλΌ. κ·Έλ μ§λ§, λ³΄ν΅ λκ°μ concrete ν΄λμ€ public μμμΌλ‘ μ°κ²° μ§μ΄ λλκ²μ μλ‘μ΄ μΆμ ν΄λμ€μ νμμ±μ μλ―Ένλ€.
μ’
μ’
λ€μμ λ¬Έμ λ‘, μ¬μ¬ μκ³ ν΄μ λ§λ€μ΄λ
Ό ννλ‘μ΄ μ΄λ‘ μ κ°νΉν νμ€μ΄ λ§μΉλ€. μλ νν° C++ λΌμ΄λΈλ¬λ¦¬λ ννμ μΌλ‘ μ¦κ°νκ³ , λΉμ μ μ½μμ λ°μ μλ λΌμ΄λΈλ¬λ¦¬ μμ concreteν΄λμ€λ‘ λΆν° μμλ°μ concrete ν΄λμ€μ μμ±μ μν λ μ΄λ»κ² ν κ²μΈκ°?
λΉμ μ μλ‘μ΄ μΆμ ν΄λμ€λ₯Ό λ£κΈ°μν΄, λΌμ΄λΈλ¬λ¦¬λ₯Ό μμ ν μ μλ€. κ·Έλμ λΉμ μ μ νμ μ νκ³Ό λ³λ‘ λ§€λ ₯μ μ΄μ§ μλ λ°©λ²μΌ κ²μ΄λ€.
- λΉμ μ concrete ν΄λμ€λ₯Ό μ‘΄μ¬νκ³ μλ concrete ν΄λμ€λ‘ λΆν° μ λνλΌ κ·Έλ¦¬κ³ ν λΉμ κ΄λ ¨ν(assignment-related) λ¬Έμ λ€μΈ, μ΄ Itemμ μμ λΆλΆμ λνμ¬ μνν΄ λ΄λΌ. λν Item 3μ μΈκΈλ λ°°μ΄μ κ΄ν λ¬Έμ κ° μλμ§λ μ κ²ν΄ λ΄μΌλ§ νλ€.
- λΉμ μ΄ νμλ‘ νλ κ²μ κ°μ₯ κ°κΉμ΄ μΆμ ν΄λμ€λ₯Ό μμ κ³μΈ΅ λμ λΆλΆμμ μ°Ύμλ΄λΌ, κ·Έλ¦¬κ³ λμ κ·Έ ν΄λμ€μμ μμνλΌ. λ¬Όλ‘ μ ννμ§ μμ ν΄λμ€ μΌμ§λ λͺ¨λ₯Έλ€. κ·Έλ λλΌλ, μλ§ λΉμ μ νμ₯νκ³ μ νλ κΈ°λ₯μ κ°μ§λ concrete ν΄λμ€μ ꡬνμ λ
Έλ ₯ ν΄μΌ ν κ²μ΄λ€.
- λΉμ μ μλ‘μ΄ ν΄λμ€λ₯Ό λΉμ μ΄ μμ λ°κ³ μ νλκ²κ³Ό λΉμ·ν ν΄λμ€ λΌμ΄λΈλ¦¬μ νλΆλΆμ ꡬνν΄λΌ. μλ₯Ό λ€μ΄μ λΉμ μ΄ λ°μ΄ν° λ©€λ²λ‘μ λΌμ΄λΈλ¬λ¦¬ ν΄λμ€μ κ°μ²΄λ₯Ό κ°μ§κ³ μΆμλ, λΉμ μ μλ‘μ΄ ν΄λμ€μ λΌμ΄λΈλ¬λ¦¬ ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό μ¬μ μ ν΄λΌ.
~cpp class Window { // μ΄κ²μ ν΄λμ€ λΌμ΄λΈλ¬λ¦¬ public: virtual void resize(int newWidth, int newHeight); virtual void repaint() const; int width() const; int height() const; }; class SpecialWindow { // μ΄κ²μ Windowλ‘ λΆν° μμλκΈ° μνλ ν΄λμ€ public: ... // λΉ κ°μ ν¨μλ λκΈ°λ κ²μΌλ‘ ꡬννλ€. int width() const { return w.width(); } int height() const { return w.height(); } // "μμ λ°μ" κ°μ ν¨μμ μλ‘μ΄ κ΅¬ν virtual void resize(int newWidth, int newHeight); virtual void repaint() const; private: Window w; };
μ΄λ¬ν μ λ΅μ λΉμ μ΄ μμ‘΄νκ³ μλ λΌμ΄λΈλ¬λ¦¬ λ²€λμ ν΄λμ€κ° μ λ°μ΄νΈ λ λ λ§λ€ λΉμ μ ν΄λμ€λ₯Ό μ λ°μ΄νΈλ₯Ό ν μ€λΉκ° λμ΄ μλκ±Έ μꡬνλ€. λν λΌμ΄λΈλ¬λ¦¬ ν΄λμ€μμμ κ°μ ν¨μμ μ¬μ μ λ₯λ ₯μ μ κ±°λ₯Ό μꡬνκΈ°λ νλ€. μλνλ©΄ λΉμ μ μμ λ°κΈ° μ κΉμ§ κ°μ ν¨μλ₯Ό μ¬μ μ ν μκ° μλ€.
- λΉμ μ΄ κ°μ§ κ²μ μ΄μ©ν΄ λ§λ€μ΄λΌ. λΌμ΄λΈλ¬λ¦¬μμ concrete ν΄λμ€μ μ¬μ©νκ³ , λΉμ μ μννΈμ¨μ΄μμ μμ νλΌ κ·Έλ¬λ©΄ , κ·Έ ν΄λμ€λ μΆ©λΆνλ€. λΉμ μ΄ ν΄λμ€μ λνκ³ μ νλ κΈ°λ₯μ μ 곡νλ non-member ν¨μλ₯Ό μμ±νλΌ. νμ§λ§ ν μ μλ€. κ·Έμ κ°μ΄ νλ©΄ μννΈμ¨μ΄μ κ²°κ³Όλ λͺ
λ£νμ§ λͺ»νκ³ , ν¨μ¨μ μ΄μ§ λͺ»νκ³ , μ μ§ λ³΄μ€νκΈ° νλ€κ³ , νμ₯νκΈ° νλ€λ€. νμ§λ§ μ΅μν κ·Έλ° μΌμ ν μ μκ² νλΌ.
μμ§ μΌλ°μ μΈ κ·μΉμ΄ λ¨μ μλ€.:non-leaf ν΄λμ€κ° μΆμν λμ΄μΌ νλ€. λΉμ μ μλ§λ μΈλΆμ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν λ, λ¬Άμ΄ μ€λ§ν κ·μΉμ΄ νμν κ²μ΄λ€. νμ§λ§ μ°λ¦¬κ° λ€λ£¨μ΄μΌ νλ μ½λμμ, μΈλΆ λΌμ΄λΈλ¬λ¦¬μ κ°κΉμ μ§λ€λ κ²μ μ λ’°μ±, λ΄κ΅¬μ±, μ΄ν΄λ ₯, νμ₯μ±μμ κ²κ³Ό λ¨μ΄μ§λ κ²μ μΌκΈ°νλ€.
3. Item 34: Understand how to combine C++ and C in the same program ¶
- Item 34: κ°μ νλ‘κ·Έλ¨μμ C++μ Cλ₯Ό νΌν©νλ λ² μ΄ν΄ν΄λΌ.
μ¬κΈ°μμ μ°λ¦¬κ° μκ°ν΄λ³Ό κ΄μ μ μ΄ λ€κ°μ§κ° νμνλ€.:name mangling, initialization of statics, dynamic memory allocation, and data structure compatibility.
3.1. Name mangling : μ΄λ¦ μ‘°μ ¶
λΉμ λ μλ€ μνΌ, name mangling(μ΄λ¦ μ‘°μ :μ΄ν name manglingλ‘ μ) λΉμ μ C++ μ»΄νμΌλ¬κ° λΉμ μ νλ‘κ·Έλ¨μμμ κ° ν¨μμ μ μΌν μ΄λ¦μ λΆμ¬νλ μμ
μ΄λ€. Cμμ μ΄λ¬ν μμ
μ νμκ° μμλ€. μλνλ©΄, λΉμ μ ν¨μ μ΄λ¦μ μ€λ²λ‘λ(overload)ν μκ° μμκΈ° λλ¬Έμ΄λ€. κ·Έλ μ§λ§ C++ νλ‘κ·Έλλ¨Έλ€μ μ΅μν λͺκ° ν¨μμ κ°μ μ΄λ¦μ μ΄λ€.(μλ₯Όλ€μ΄μ, iostream λΌμ΄λΈλ¬λ¦¬λ₯Ό μκ°ν΄λ³΄μ. μ¬κΈ°μλ λͺκ°μ§ λ²μ μ΄λ operator<< μ operator>>κ° μλ€. ) μ€λ²λ‘λ©(overloading)μ λλΆλΆμ λ§μ»€λ€μκ² λΆνΈν μ‘΄μ¬μ΄λ€. μλνλ©΄ λ§μ»€λ€μ μΌλ°μ μΌλ‘ κ°μ μ΄λ¦μΌλ‘ λ λ€μν ν¨μλ€μ λνμ¬ μ΄λμ΄ μκ°μ κ°μ§λ€. name maglingμ λ§μ»€λ€μ μ§μ€μ±μ μΉμΈμ΄λ€.;νΉλ³ν λ§μ»€λ€μ΄ λ³΄ν΅ λͺ¨λ ν¨μ μ΄λ¦μ λνμ¬ μ μΌνλ€λ μ¬μ€μ λνμ¬
C++μ ν
ν¬λ¦¬μ λ¨Έλ¬Όλ¬ μλ€λ©΄, name manglingμ λΉμ κ³Ό 그리 κ΄κ³ μλ κ² κ°μ§ μλ€. λ§μ½ λΉμ μ΄ μ»΄νμΌλ¬κ° xyzzyλΌκ³ maglingν drawLineμ΄λΌλ ν¨μλ₯Ό κ°μ§κ³ μλ€λ©΄ λΉμ μ νμ drawLineμ΄λΌκ³ μ¬μ©νκ³ , μ€λΈμ νΈ νμΌμμ xyzzyλΌκ³ κ΅μ²΄λμ΄ μ°λκ²μλ μ£Όμλ₯Ό κΈ°μΈμΌ νμκ° μλ€.
νμ§λ§ C λΌμ΄λΈλ¬λ¦¬μμ drawLineμ΄λΌλ©΄ μ΄μΌκΈ°κ° λ¬λΌμ§λ€. κ·Έλ° κ²½μ°μ λΉμ μ C++μμ€ νμΌμ μλ§λ μ΄κ²κ³Ό κ°μ΄ μ μΈλ ν€λ νμΌμ κ°μ ΈμΌ ν κ²μ΄λ€.
κ·Έλ¦¬κ³ λΉμ μ μ½λλ μΌλ°μ μΌλ‘ μ¬μ©νλ κ²μ²λΌ drawLineμ νΈμΆνλ μ½λ€λ₯΄ κ°μ§λ€. κ·Έλ¬ν κ° νΈμΆλ§λ€ λΉμ μ μ»΄νμΌλ¬κ° mangleμ ν ν¨μ μ΄λ¦μ νΈμΆ λΆλΆμ λ£λλ€. κ·Έλμ μ΄λ‘ μ½λλ₯Ό μ°λ©΄,
λΉμ μ μ€λΈμ νΈ νμΌμ λ€μκ³Ό κ°μ λͺ¨μ΅μ ν¨μ νΈμΆμ κ°μ§λ€.
κ·Έλ μ§λ§ λ§μ½ drawLineκ° Cν¨μλΌλ©΄, drawLine ν¨μλ₯Ό νΈμΆν λ drawLineμΌλ‘ ν¬ν¨νλ μ»΄νμΌλ¬λ λ²μ μΌλ‘ μ€λΈμ νΈ( νΉμ λμ λ§ν¬ λΌμ΄λΈλ¬λ¦¬ λ±) νμΌμ ν¬ν¨λμ΄ μλ€.;name mangleμ΄ λμ§ μμ μ²΄λ‘ λμ΄ μλ€. λΉμ μ΄ μ΄ λμ λͺ¨λ μμ΄μ νλ‘κ·Έλ¨ νλ €κ³ λ
Έλ ₯νλ©΄, μλ¬κ° λ κ²μ΄λ€. μλνλ©΄ λ§μ»€λ xyzzyμ νΈμΆλλ ν¨μλ₯Ό μ°Ύκ³ , κ·Έμ κ΄ν ν¨μκ° μκΈ° λλ¬Έμ΄λ€.
~cpp void drawLine(int x1, int y1, int x2, int y2);
~cpp drawLine(a, b, c, b); // mangle μ²λ¦¬κ° μλ μν
~cpp xyzzy(a, b, c, d); // mangleν νμ ν¨μ μ΄λ¦
μ΄λ° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μνμ¬, C++ μ»΄νμΌλ¬μκ² ν΄λΉ ν¨μμ name mangleμ μννμ§ μλλ‘ μλ €μΌ ν λ°©λ²μ΄ νμνλ€. Cλ , assempler, FORTRAN, Lisp, Forthλ λκ° κ°μ§ λ¬΄μ¨ μΈμ΄κ°μ, λ€λ₯Έ μΈμ΄μμ μμ±λμ΄μ§ name mangle μ²λ¦¬λ ν¨μλ₯Ό μν μ μλ€.(μ, μ΄ μΈμ΄λ€μ COBOLλ λ€μ΄κ°κ² μ§λ§ λΉμ μ΄ μ°λκ°?) 결곑, λ§μ½ Cν¨μμΈ drawLineμ νΈμΆνλ©΄ κ·Έκ²μ μ§μ§λ‘ drawLineμ νΈμΆνκ³ , λΉμ μ μ€λΈμ νΈ μ½λμμ κ·Έ μ΄λ¦ κ·Έλλ‘ λ³νμμ΄ μ¬μ©νλ€.
μ΄λ¬ν name mangleμ λ§κΈ° μνμ¬, C++μ μμλ extern "C"λ₯Ό μ§μ μ¬μ©νλ€.
extern "C" extern "Pascal", extern "FORTRAN"
~cpp // name mangleνμ§ μλ μ²λ¦¬ extern "C" void drawLine(int x1, int y1, int x2, int y2);
extern "C"λ₯Ό μ°λκ²μ λΉμ°μ μκ°νλ ν¨μ μ λΉ μ§μ§ λ§λΌ, extern "Pascal" μ΄λ extern "FROTRAN" λ§μ΄ μ°μ΄λ κ²½μ°λ μλ€.νμ§λ§ μ΅μν νμ€μ μλλ€. κ°μ₯ μ’μ λ°©λ²μΈ extern "C"λ Cμμ μμ±λ ν¨μλ€κ³Ό κ΄κ³ μλ€λ κ²μ νμ νλ건 μλμ§λ§, λ§μ½ Cμμ μμ±λ κ²μ²λΌ ν΄λΉ ν¨μλ₯Ό νΈμΆν μ μλ€λ μλ―Έμ΄λ€. (κΈ°μ μ μΌλ‘ extern "C" λ Cμμ μ°κ²°μ κ°μ§ ν¨μλ₯Ό μλ―Ένμ§λ§, κΌ κ·Έλ°κ² λ§μ μλλ€. κ·Έλ μ§λ§ name mangleμ λ°©μ§ νλ€λ κ² λ§μ νμ€νλ€.)
μλ₯Όλ€μ΄μ λ§μ½ λΉμ μ λ무λ λΆννκ²λ μ΄μ
λΈλ¬μμ μμ±ν ν¨μμ κ°μ κ²½μ°λΌλ©΄ λΉμ μ μμ extern "C" λ₯Ό μ μΈν μ μλ€.:
λΉμ μ C++μ ν¨μλ₯Ό μ μΈν λμ‘°μ°¨ extern "C"λ₯Ό μ¬μ©ν μ μλ€. μ΄κ²μ C++μμ λΌμ΄λΈλ¬λ¦¬λ₯Ό μμ±ν λ λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄λ€μ λν μ§μμ νκ³ μΆμλ μ μ©νλ€. C++ν¨μμ λνμ¬ name mangleμ κΈμ§ν΄μ λΉμ μ ν΄λΌμ΄μΈνΈλ€μ΄ λΉμ μ΄ mangleμ μ μ©ν ν¨μ λμ μ, μμ°μ€λ½κ² λͺ
μμ μΌλ‘ μ¬μ©ν μ μλ€.
μ’
μ’
λΉμ μ name mangleλ₯Ό μνμ§ μμ ν¨μλ₯Ό λ§μ΄ κ°μ§κ³ μμ κ²μΈλ°, μ΄ λͺ¨λ κ² μμ λͺ¨λ extern "C" λ₯Ό λΆμ΄κΈ°μλ κ·μ°λ€. λ€νμ€λ½κ²λ μ΄μ λν μ§μ μμ λ€μκ³Ό κ°μ λͺ¨μ΅μΌλ‘ ννν μ μλ€.
extern "C"μ μ΄λ¬ν μ¬μ©μ C++κ³Ό Cλ₯Ό μ¬μ©ν΄μΌλ§ νλ ν€λνμΌμ μ μ§λ³΄μλ₯Ό κ°νΈνκ² ν΄μ€λ€. C++λ‘ μ»΄νμΌ ν λλ extern "C"λ₯Ό νμ©νκ³ , Cλ‘ ν λλ νμ©νμ§ μκ³ μ»΄νμΌ νλ©΄ λλ€. μ΄λ¬ν preprocessorμ λν μ¬λ²(symbol)μ __cplusplus κ° C++ μ»΄νμΌ νμμ μ μλμ΄ μλ κ²μ μ΄μ©ν΄μ λ€μκ³Ό κ°μ΄ ꡬμ±ν μ μλ€.
κ·Έλ° λ°©λ²μ μ΄μ©νλ건, "νμ€" μ μΈ name mangle μκ³ λ¦¬μ¦μ΄λ μλ€. λ€λ₯Έ μ»΄νμΌλ¬λ λ€λ₯Έ λ°©λ²μΌλ‘ name mangle μ λ§λ λ°©λ²μ μ 곡νλ€. μ΄λ μ’μ κ²μ΄λ€. λ§μ½μ λͺ¨λ μ»΄νμΌλ¬κ° κ°μ λ°©λ²μΌλ‘ name mangleμ μν νλ©΄, λΉμ μ μλ§λ κ·Έλ€μ΄ λ§λ€μ΄ λ΄λ μλ§μ μ½λμ λν μκ°μ μμ¬ν΄ ν μ§ λͺ¨λ₯Έλ€. λ§μ½ λΉμ μ΄ μ ννμ§ μμ C++ μ»΄νμΌλ¬λ‘ λΆν° μμ±λ κ°μ²΄λ₯Ό νΌμ©νλ©΄ λ§ν¬μ€μ μλ¬λ₯Ό λ°μν μ μλ μ’μ κΈ°νλ₯Ό λ§μ΄ν κ²μ΄λ€. μλνλ©΄, mangleμ²λ¦¬λ μ΄λ¦μ μ°Ύμμ μκΈ° λλ¬Έμ΄λ€. μ΄κ²μ λΉμ μκ² μλ§μμ λ°μ§λ λλ€λ₯Έ λ¬Έμ λ₯Ό μλ―Ένκ³ , λ λμ’μ ν΄κ²°μ±
μ μ°ΎμμΌ ν¨μ μλ―Ένλ€.
~cpp // μ΄ ν¨μλ μ΄μ λΈλ¬μ μλ€. ν¨μλ₯Ό name mangleνμ§ μλλ€. extern "C" void twiddleBit(unsigned char bits);
~cpp // C++ μ λ°λ₯΄λ ν¨μλ C++μ μΈλΆμμ μ°μ΄λλ‘ μ€κ³λμλ€. extern "C" void simulate (int iterations);
~cpp extern "C" { // μ΄ μμμ ν¨μλ λͺ¨λ name mangleκ° μ μ©λμ§ μλλ€. void drawLine(int x1, int y1, int x2, int y2); void twiddleBits(unsigned char bits); void simulate(int iterations); ... }
~cpp #ifdef __cplusplus extern "C" { #endif void drawLine(int x1, int y1, int x2, int y2); void twiddleBits(unsigned char bits); void simulate(int iterations); ... #ifdef __cplusplus } #endif
3.2. Initialization of statics : static μΈμμ μ΄κΈ°ν ¶
μΌλ¨ name mangleμ κ΄ν λ΄μ©μ μ΅νλ€λ©΄, C++μ½λμμ main μ΄μ κ³Ό μ΄νμ λ§μ μ½λλ€μ΄ μνλλ€λ μ¬μ€μ κ΄ν΄μ μκ°ν΄λ³Ό νμκ° μλ€. νΉλ³ν, μ μ μ΄λ¦ 곡κ°, νμΌ μμμμ μ μ (static) ν΄λμ€ κ°μ²΄λ λ³΄ν΅ main λ³΄λ€ λ¨Όμ μ€νλλ€. μ΄ κ³Όμ μ΄ static initialization μ΄λΌκ³ μλ €μ Έ μλ€. μ΄λ νλ‘κ·Έλ¨μ μ€νμμ κ°μ Cμ C++ νλ‘κ·Έλ¨μ λν λ°©λ²μΌλ‘ μμ ν λ€λ₯Έ λ°©ν₯μ μ·¨νλ€. λΉμ·νκ², static initializationμΌλ‘ λ§λ€μ΄μ§ κ°μ²΄λ λ°λμ κ·Έλ€μ νκ΄΄μλ₯Ό static destruct λμμ λΆλ¬μ£Όμ΄μΌ νλ€.;κ·Έλ¬ν κ³Όμ μ μΌλ°μ μΌλ‘ main μ΄νμ μ§νλλ€.
mainμ΄ μνλκΈ° μ μ κ°μ²΄κ° μμ±λμΌ νλ νμμ±μ΄ μμ§λ§, mainμ΄ κ°μ₯ μ²μ λΆλ €μΌ νλκ²μΌλ‘ κ°μ λλ λλ λ§μ ν΄κ²°μ μν΄μ, λ§μ μ»΄νμΌλ¬ λ€μ΄ νΉλ³ν μ»΄νμΌλ¬κ° μμ±νλ ν¨μλ₯Ό mainμ μμλ¨μ λ£λλ€. κ·Έλ¦¬κ³ μ΄ νΉλ³ν νμλ static initialization μ νλ€. λΉμ·νκ² μ»΄νμΌλ¬λ μ’
μ’
mainμ λμ νΉλ³ν ν¨μλ₯Ό λ£μ΄μ static κ°μ²΄μ μμ λ₯Ό μννλ€. main μ λν΄ μμ±λλ μ½λλ μ’
μ’
main μ΄ μκ² μμ±λλ κ²μ²λΌ 보μΈλ€.
~cpp int main(int argc, char *argv[]) { performStaticInitialization(); // mainμ΄ λ£λλ€κ³ κ°μ νλ ν¨μ μ¬κΈ°λ λ©μΈμ μ½λλ€μ μν; performStaticDestruction(); // mainμ΄ λ£λλ€κ³ κ°μ νλ ν¨μ }
λλλ‘ Cμ main μμ±μ΄ λ κ°μΉ μλ€κ³ 보μΈλ€. - λλ€μ νλ‘κ·Έλ¨μ΄ Cμ΄κ³ , C++μ΄ λ¨μ§ λΌμ΄λΈλ¬λ¦¬ μ§μ μ΄λΌλ©΄ μ΄λΌκ³ λ§ν΄λΌ. κ·Έλ κΈ°λ νμ§λ§, C++ λΌμ΄λΈλ¬λ¦¬λ μ μ (static) κ°μ²΄(object)λ₯Ό ν¬ν¨νλ κ²μ΄ μ’λ€.(μ’μ κΈ°λ₯μ΄ λ§λ€λ μλ―Έ) (λ§μ½ μ§κΈ μλ€ν΄λ λ―Έλμ μ΄μ©λ©΄ μμμ§ λͺ¨λ₯΄μ§ μλκ°? Item 32μ°Έκ³ ) κ·Έλμ κ°λ₯νλ€λ©΄ C++μμ mainμ μμ±μ μ’μ μκ°μ΄λ€. κ·Έκ²μ λΉμ μ Cμ½λλ₯Ό μ μμ± νλκ²μ μλ―Ένμ§λ μλλ€. λ¨μ§ Cμμ μ΄ mainμ realMainμΌλ‘ μ΄λ¦λ§ λ°κΎΈκ³ , mainμ C++λ²μ μμλ realMainμ νΈμΆνλ€.:
μ΄λ κ² νλ€λ©΄, mainμμ μ£Όμμ μ£Όλκ²μ΄ μ’μ μκ°μΌ κ²μ΄λ€.
~cpp extern "C" int realMain(int argc, char *argv[]); // C μμ ꡬνλ ν¨μ int main(int argc, char *argv[]) // C++μμ μ΄λ κ² μμ± { return realMain(argc, argv); }
λ§μ½ C++μμ mainμ μμ±ν μ μλ€λ©΄ λ¬Έμ κ° λλ€. μλνλ©΄, μ μ (static) κ°μ²΄ νΈμΆμ μν μμ±μ, νκ΄΄μμ λνμ¬ μ΄μμ±μ νμ μ μ€μ μκΈ° λλ¬Έμ΄λ€. μ΄κ²μ λͺ¨λ κ²μ μλλ€λ μλ―Έλ μλλ€. λ¨μ§ μ’λ ν μΌμ΄ λ§μ μ§λ€λ κ²μ μλ―Ένλ€. μ»΄νμΌλ¬ λ°΄λλ€μ μ΄λ¬ν λ¬Έμ λ₯Ό μ μκ³ μλ€. κ·Έλμ κ±°μ λλΆλΆμ λ²€λλ€μ static initialization, destructionμ μν΄μ λͺκ°μ§μ μΈμ΄μ κ΄κ³μλ κΈ°μ μ μ 곡νλ€. μ΄μ κ΄ν μ 보λ λΉμ μ μ»΄νμΌλ¬μ λ¬Έμλ₯Ό μ°Έμ‘°νκ±°λ, λ²€λλ€μκ² λ¬Έμν΄λΌ
3.3. Dynamic memory allocation : λμ λ©λͺ¨λ¦¬ ν λΉ ¶
λμ λ©λͺ¨λ¦¬ ν λΉ(dynamic memory allocation:μ΄ν λμ λ©λͺ¨λ¦¬ ν λΉ)μ κ΄ν λ¬Έμ κ° μ°λ¦¬μκ² μ£Όμ΄μ§λ€. μΌλ°μ μΈ κ·μΉμ κ°λ¨νλ€.:C++ μμ new, delete λΆλΆ (Item 8μ°Έκ³ ) κ·Έλ¦¬κ³ C νλ‘κ·Έλλ° μμλ malloc(κ·Έλ¦¬κ³ κ·Έκ²μ λ³μλ€) κ³Ό freeμ΄λ€. mallocμΌλ‘ μ»μ건 freeλ‘, newλ‘ μ»μ건 deleteλ‘ ν΄μ¬νλν λͺ¨λ κ²μ΄ μ¬λ°λ₯΄λ€. κ·Έλ μ§λ§, newλ‘ ν λΉλ λ©λͺ¨λ¦¬ μμμ κ°λ¦¬ν€λ ν¬μΈν°λ₯Ό freeλ‘ ν΄μ μν€λ νΈμΆμ μμΈ‘ λͺ»νλ μνμ κ°μ§κ³ μ¨λ€. λ§μ°¬κ°μ§λ‘ mallocλ‘ μ»μ κ²μ deleteλ‘ ν΄μ νλ κ²λ μμΈ‘ν μ μλ€. κ·Έλ λ€λ©΄, μ΄λ₯Ό κΈ°μ΅νκΈ° μν λ°©λ²μ newμ delete, mallocμ freeλ₯Ό μ격νκ² κ΅¬λΆν΄μΌ νλ κ²μ΄λ€.
λλλ‘, μ΄κ²μ λ§νκΈ°μ μ¬μ 보μΈλ€. C, C++ μμͺ½λ€ νμ€μ μλμ§λ§ κ·ΈλΌμλ κ΄λ²μνκ² μ°μ΄λ, μ κΈμ strdup ν¨μμ κ΄νμ¬ μκ°ν΄ 보μ.
λ©λͺ¨λ¦¬ leakλ₯Ό νΌν λ €λ©΄, strdup λ΄λΆμμ ν λΉλ λ©λͺ¨λ¦¬λ₯Ό strdupμ νΈμΆμκ° ν΄μ ν΄ μ£Όμ΄μΌ νλ€. νμ§λ§ λ©λͺ¨λ¦¬λ₯Ό μ΄λ»κ² ν΄μ ν κ²μΈκ°? deleteλ‘? freeλ‘? λ§μ½ strdupλ₯Ό λΉμ μ΄ C λΌμ΄λΈλ¬λ¦¬μμ λΆλ λ€λ©΄, freeλ‘, C++ λΌμ΄λΈλ¬λ¦¬μμ λΆλ λ€λ©΄ deleteλ‘ ν΄μΌ νλ€. 무μμ΄ λΉμ μ strdup νΈμΆνμ 무μμ΄ νμνκ°, μμ€ν
κ³Ό μμ€ν
κ°μ λΏμ΄ μλ, μ»΄νμΌλ¬, μ»΄νμΌλ¬ κ°μλ μ΄κ±΄ λ¬Έμ λ₯Ό μΌμΌν¬μ μλ€. κ·Έλ¬ν μ΄μμ±μ κ³ ν΅μ κ°μλ₯Ό μν΄, νμ€ λΌμ΄λΈλ¦¬μμ λΆλ¬μΌ νμ§ λ§μμΌν ν¨μ, λλ€μ νλ νΌμ μ’
μμ μΌλ‘ κ·μλ λͺ¨μ΅μ ν¨μλ€μ λΆλ₯΄μ§ μλλ‘ λ
Έλ ₯νλΌ.
~cpp char * strdup(const char *ps); // λ¬Έμμ΄μ μ¬λ³Έμ λ°ννλ€.
3.4. Data Structure Compatibility : μλ£ κ΅¬μ‘°μ νΈνμ±(μ΄μμ±) ¶
μ°λ¦¬λ C++μ Cνλ‘κ·Έλ¨ μ¬μ΄μ λ°μ΄ν° κ΅νμ κ΄ν΄μ λ€λ£¬λ€. C++μ κ°λ
μ μ΄ν΄νλ C ν¨μλ₯Ό λ§λλκ² λΆκ°λ₯ νλ€. κ·Έλμ μ΄ λ μΈμ΄κ°μ μ λ¬μ μμ€μ Cκ° ννν μ μλ κ°λ
μΌλ‘ νμ λλ€. κ·Έλμ κ°μ²΄μ μ λ¬ λ°©μμ΄λ, ν¬μΈν°λ₯Ό C μμ μμ±λ 루ν΄μ λ©€λ² ν¨μλ‘ μ λ¬νλ λ°©λ²μ μ΄μμ±μ΄ λ¨μ΄μ§κ²μ λΆλͺ
νλ€. Cλ μΌλ°μ μΈ ν¬μΈν° μ΄ν΄νλ€. κ·Έλμ λΉμ μ C++μ Cμ»΄νμΌλ¬κ° λ§λ€μ΄ λ΄λ, λκ°μ§μ μΈμ΄μμ μλ§λ ν¨μλ pointerμ κ°μ²΄λ₯Ό pointerμ non-member λ static ν¨μλ₯Ό μμ νκ² κ΅μ²΄ν μ μλ€.μμ° μ€λ½κ², ꡬ쑰체μ built-inνμ λ³μλ€ μμ μμ λ‘μ΄ C+++/Cμ κ²½κ³λ₯Ό λλλ λ€.
C++μμ ꡬ쑰체μ μ€κ³ κ·μΉμ΄ Cμμμ κ·Έκ²κ³Ό μΌμΉνκΈ° λλ¬Έμ μ μΈμ΄κ° κ°μμ μ»΄νμΌλ¬λ‘ κ°μ κ·μΉμΌλ‘ κ΅¬μ‘°μ²΄κ° μ€κ³λμ΄ μλ€κ³ κ°μ ν μ μλ€. κ·Έλ¬ν ꡬ쑰체λ μμ νκ² C++κ³Ό Cμ¬μ΄μ κ΅νλ μ μλ€. λ§μ½ λΉμ μ΄ λΉκ°μ ν¨μλ₯Ό C++ λ²μ μ ꡬ쑰체μ μΆκ° νλ€λ©΄, κ·Έκ²μ λ©λͺ¨λ¦¬ λͺ¨μ(layout)μ λ°λμ§ μλλ€. κ·Έλμ λΉκ°μ ν¨μλ₯Ό ν¬ν¨νλ ꡬ쑰체(νΉμ ν΄λμ€)μ κ°μ²΄(object)λ μ€μ§ λ©€λ² ν¨μκ° μλ ꡬ쑰체 Cλ‘ μ΅μ ν λ κ²μ΄λ€. κ°μ ν¨μλ₯Ό λνλ κ²μ λ
Όν κ°μΉκ° μλ€. μλνλ©΄ κ°μ ν¨μλ₯Ό ν΄λμ€μ μΆκ°νλ κ²μ λ©λͺ¨λ¦¬μ λ°°μ΄μ λ€λ₯Έ λͺ¨μ΅μ 보μΈλ€. (Item24μ°Έκ³ ) λ€λ₯Έ ꡬ쑰체(νΉμ ν΄λμ€)λ‘ λΆν° μμ λ°μ ꡬ쑰체λ λ³΄ν΅ κ·Έκ²μ λ©λͺ¨λ¦¬μ λͺ¨μ΅μ΄ λ°λλ€. κ·Έλμ κΈ°λ³Έ(base) ꡬ쑰체(νΉμ ν΄λμ€)μ μν ꡬ쑰체 μμ Cν¨μμ μ§μμ΄ λ―Έν‘νλ€.
μλ£ κ΅¬μ‘°μ μ
μ₯μ μ΄λ κ² μμ½λλ€.:ꡬ쑰체μ μ μλ₯Ό C++μ Cμμ μ λΆ μ»΄νμΌλλλ‘ λ§λ€λ©΄, C++μμ Cλ‘μ ꡬ쑰체μ μ λ¬κ³Ό, Cμμ C++λ‘μ μ λ¬μ μμ νλ€. λΉκ°μ λ©€λ² ν¨μλ₯Ό C++ λ²μ μ ꡬ쑰체μ λνλ κ²μ, λ€λ₯Έ ννΈμΌλ‘ Cμ λ§μΆλ κ²μ΄κΈ°μ μ΄κ²λ λ μΈμ΄κ°μ μ‘°νμ μν₯μ λΌμΉμ§ μνγ΄λ€. νμ§λ§ κ΅¬μ‘°μ²΄κ° λͺκ°μ§μ λ³νμ΄ μλ κ²μ΄λ€.
3.5. Summary : μμ½ ¶
λ§μ½ λΉμ μ΄ C++μ Cλ₯Ό κ°μ νλ‘κ·Έλ¨μμ μμ΄μ μ°κΈ°λ₯Ό μνλ€λ©΄, κ°λ¨ν κ°μ΄λ λΌμΈμμ λ°λ₯Όκ²μ κΈ°μ΅νλΌ.
- C++, Cμ»΄νμΌλ¬κ° μ‘°νλ‘μ΄ μ€λΈμ νΈ νμΌμ μμ±νλλ‘ νλΌ.
- λμΈμ΄μμ λͺ¨λ extern "C" λ₯Ό μ¬μ©ν΄μ ν¨μλ₯Ό μ μΈνλΌ
- newλ‘ ν λΉ λ°μ λ©λͺ¨λ¦¬λ νμ deleteλ‘ μ κ±°νλΌ;mallocλ‘ ν λΉν λ©λͺ¨λ¦¬λ νμ freeλ‘ μ κ±°νλΌ.
- λ μΈμ΄μμμ Cκ° μ»΄νμΌν μ μλ λ°μ΄ν° ꡬ쑰μ μ λ¬λ‘ μ ν λλ€.:C++λ²μ μ ꡬ쑰체λ μλ§λ λΉκ°μ λ©€λ² ν¨μλ§μ κ°μ§κ³ μμ΄μΌ νλ€.
4. Item 35: Familiarize yourself with Β°the language standard. ¶
- Item 35: μΈμ΄ νμ€μ μΉν΄μ ΈλΌ.
post-ARM μ C++λ‘ μ’μ νλ‘κ·Έλ¨μ μμ± ν μ μλλμ ν° μν₯μ μ€λ€. κ²°κ³Όμ μΌλ‘ C++ νλ‘κ·Έλλ¨Έλ€μκ² ARMμ λ΄μ©κ³Ό λ€λ₯Έ νμ€ μ¬νμ μλ κ²μ νλ‘κ·Έλλ¨Έλ€μκ² μ²«λ²μ§Έλ‘ μ€μν λ¬Έμ κ° λ κ²μ΄λ€.
ISO/ANSI standard for C++ λ μ»΄νμΌλ¬κ° ꡬνλ λ, λ²€λλ€μ μ‘°μΈμ΄κ³ , μ±
μ μ€λΉν λ, μκ°λ€μ΄ μνν΄ λ³Ό κ²μ΄κ³ , νλ‘κ·Έλλ¨Έλ€μ΄ C++μ κ΄ν μ μμ μ§λ¬Έμ λ΅μ΄λ€. ARMμ΄ λμ¨ μ΄ν C++μ κ°μ₯ ν° λ³νλ₯Ό μμ 보μ.
- μλ‘μ΄ κ°λ
μ μΆκ° : RTTI, namespace, bool, mutableκ³Ό explicit keyword, enumμ μν μ€λ²λ(overload) μ°μ°μ λ₯λ ₯, ν΄λμ€ μ μ λ΄λΆμμ μ΄μ©ν μμ ν μ μ ν΄λμ€ λ©€λ² μ΄κΈ°ν μ¦λ ₯
- ν
νλ¦Ώ(template)μ νμ₯ :λ©€λ² ν
νλ¦Ώμ΄ νμ©. μ΄κ²μ ν¬νλ¦Ώμ λͺ
μμ ννμ μν νμ€ λ¬Έλ²,ν¨μ ν
νλ¦Ώμμ non-type μΈμλ€ νμ© νλκ², ν΄λμ€ ν
νλ¦Ώμ΄ κ·Έλ€ μμ μ ν
νλ¦Ώμ μΈμλ‘ λ°μμ μλκ² μ΄ μλ€.
- μμΈ νΈλ€λ§μ μ¬μ μ : μμΈ μ€ν©μ νμ¬ μ»΄νμΌ μ€μ λμ±λ μ격νκ² κ²μ¬ λλ€. κ·Έλ¦¬κ³ μμΈ‘ν μ μλ ν¨μλ μλ§λ bad_exception μμΈ κ°μ²΄λ₯Ό λμ§λ€.
- λ©λͺ¨λ¦¬ ν λΉ λ£¨ν΄μ μμ : operator new[]μ operator delete[] κ° μΆκ°, operator new/new[] λ μ΄μ λ©λͺ¨λΌκ° ν λΉ λμ§ μμΌλ©΄, μμΈλ₯Ό λμ§λ€. κ·Έλ¦¬κ³ μ΄ λ°λ operator new/new[]λ μ€ν¨ν κ²½μ°μ 0 μ λ°ννλ€.
- μλ‘μ΄ μΌμ€ν
μ°μ°μμ μΆκ° : static_cast, dynamic_cast, const_cast, reinterpret_cast
- μΈμ΄ κ·μΉμ κ°μ : κ°μ ν¨μμ κ°μ μΌλ‘ μ΄μ λμ΄μ μ¬μ μν ν¨μμ μ νν μΌμΉνλ νμ λ°νμΈμλ₯Ό κ°μ§μ§ μλλ€. κ·Έλ¦¬κ³ μμ κ°μ²΄μ μλͺ
μ£ΌκΈ°λ μ ννκ² μ μλμλ€.
νμ€ λΌμ΄λΈλ¬λ¦¬μ μΌμ΄λλ κ²λ€μ λνκ²μμ C++μ μ νν κ·μ μ λ³νκ° μλ€. κ°λ€κ° νμ€ λΌμ΄λΈλ¬λ¦¬μ κ°μ μ μΈμ΄μ νμ€ λ§νΌμ΄λ μλ €μ§μ§ μλλ€. μλ₯Ό λ€μ΄μ The Design and Evolution of C++ κ±°μ νμ€ λΌμ΄λΈλ¬λ¦¬μ κ΄ν μΈκΈμ΄ κ±°μ μλ€. κ·Έ μ±
μ λΌμ΄λΈλ¬λ¦¬μ κ³Όν λ
ΌμλΌλ©΄ λλλ‘ μλ λ°μ΄ν°μ μΆλ ₯μ΄λ€. μλνλ©΄, λΌμ΄λΈλ¬λ¦¬λ 1994λ
μ μ€μ§μ μΌλ‘ λ³νλμκΈ° λλ¬Έμ΄λ€.
νμ€ λΌμ΄λΈλ¬λ¦¬μ λ₯λ ₯μ μλμ κ°μ μΌλ°μ μΈ μΉ΄ν
κ³ λ¦¬μ λνμ¬
- νμ€ C λΌμ΄λΈλ¬λ¦¬μ λν μ§μ C++ κ° κ·Έκ²μ λΏλ¦¬λ₯Ό κΈ°μ΅νλ€λ©΄, λλ €μ ν κ²μ΄ μλλ€. λͺλͺ minor tweaksλ CλΌμ΄λΈλ¬λ¦¬μ C++ λ²μ μ C++μ λ μ격ν ν κ²μ¬λ₯Ό λμ
νμκ³ μ μνλ€. κ·Έλ μ§λ§ λͺ¨λ κ°λ
μ΄λ, λͺ©μ μ μν΄, C λΌμ΄λΈλ¬λ¦¬μ κ΄νμ¬ λΉμ μ΄ μμμΌ νλ μ’μ(νΉμ μ«μ΄)ν΄μΌ ν κ²μ C++μμλ μμ μ μ§λλ€.
- λ¬Έμμ΄μ λν μ§μ. νμ€ C++ λΌμ΄λΈλ¬λ¦¬λ₯Ό μν μνΉ κ·Έλ£Ήμ μμμΈ Mike Vilotμ μ΄λ κ² μ΄μΌκΈ° νλ€. "λ§μ½ νμ€ string νμ΄ μ‘΄μ νμ§ μλλ€λ©΄ 길거리μμ νΌλ₯Ό νλ¦¬κ² λ κ²μ΄λ€.!" (λͺλͺ μ¬λμ λ§€μ° κ°μ μ μ΄μλ€.) μ§μ νλΌ. - νμ€ C++ λΌμ΄λΈλ¬λ¦¬λ λ¬Έμμ΄μ κ°μ§κ³ μλ€.
- μ§μν(localization)μ λν μ§μ. λ€λ₯Έ λ¬Ένμμλ λ€λ₯Έ κΈμλ₯Ό μ¨μΌνκ³ , νλ©΄μ ννλλ λ μ§, μκ°, λ¬Έμμ΄ μ λ ¬, λμ μΈλ λ¨μ etc κ·Έ λ¬Ένμ νΈμμ λ°λΌμΌ νλ€. νμ€ λΌμ΄λΈλ¬λ¦¬μ μν μ§μν(localization)μ κ° λ¬Ένμ μ°¨μ΄μ μ ν©νλλ‘ νλ‘κ·Έλ¨μ κ°λ°μ νλ€.
- I/Oμ λν μ§μ. iostream λΌμ΄λΈλ¬λ¦¬λ C++ νμ€μ ν λΆλΆμ μ°¨μ§νλ€. νμ§λ§ μμνλ κ·Έκ±Έ μ’ μ΄μ€νκ² λ§λ€μλ€. λͺλͺ ν΄λμ€κ° μ κ±°λκ³ (νμ μλ iostreamκ³Ό fstream), λͺλͺ ν΄λμ€κ° κ΅μ²΄(string κΈ°λ°μ stringstreamμ char* κΈ°λ°μΌλ‘) λμμ§λ§, νμ€ iostream ν΄λμ€μ κΈ°λ³Έ λ₯λ ₯μ λͺλ
λμ μ‘΄μ¬ν΄μ¨ (μλ ) ꡬνμ λͺ¨μ΅μ λ°μνλ€.
- μμΉ κ³μ° μ΄ν리 μΌμ΄μ
μ λν μ§μ. 볡μ‘ν μ«μ, C++ ν
μ€νΈμ μ€μ¬ μμ λ‘ λ§μ§λ§μ νμ€ λΌμ΄λΈλ¬λ¦¬μ ν¬ν¨λμλ€. λλΆμ΄, λΌμ΄λΈλ¬λ¦¬λ aliasingμ μ ννλ νΉλ³ν λ°°μ΄ ν΄λμ€(valarray)κ° ν¬ν¨λμ΄ μλ€. λΌμ΄λΈλ¬λ¦¬λ λν λͺκ°μ§μ μΌλ°μ μΈ μ μ©ν μμΉ κ³μ°μ ν¨μλ€, λΆλΆμ ν©κ³Ό μΈμ νλ μ΄μμ μ°¨μ΄λ₯Ό ν¬ν¨νλ κ²λ€, μ μ§μνλ€.
- μΌλ°μ μΈ λͺ©μ μ 컨ν
μ΄λμ μκ³ λ¦¬μ¦μ λν μ§μ. νμ€ C++ λΌμ΄λΈλ¬λ¦¬μ ν¬ν¨λμ΄ μλ ν΄λμ€, ν¨μ ν
νλ¦Ώμ Standard Template Library(STL)λ‘ μλ €μ Έ μλ€. STLμ νμ€ C++ λΌμ΄λΈλ¬λ¦¬μ κ°μ₯ νλͺ
μ μΈ λΆλΆμ΄λ€. λλ λ°μ μ΄κ²μ νΉμ§μ μμ½νλ€.
첫λ²μ§Έ λΌμ΄λΈλ¬λ¦¬ μμ κ±°μ λͺ¨λ κ²μ΄ templateμ΄λ€. μ΄ μ±
λ΄μμ λλ μλ§λ νμ€ string ν΄λμ€λ₯Ό μ°Έκ³ νλ€. κ·Έλ¬λ μ¬μ€ κ·Έλ° ν΄λμ€κ° μλλ€. λμ μ λ¬Έμλ€μ μμλ₯Ό νννλ basic_string μΌλ‘ λΆλ¦¬λ ν΄λμ€ ν
νλ¦Ώμ΄κ³ , μ΄ ν
νλ¦Ώμ λ¬ΈμνμΌλ‘ μμλ₯Ό λ§λ λ€. μ΄κ²μ λ¬Έμμ΄μ char, wide char, Unide char, 무μμ΄λ νμ©νλ€.
μ°λ¦¬κ° μΌλ°μ μΌλ‘ μκ°νλ string ν΄λμ€λ basic_string<char>μ λͺ
μμ μΌλ‘ ννν κ²μ΄λ€. μ΄κ²μ μΌλ°ν μν€κΈ° μνμ¬ νμ€ λΌμ΄λΈλ¬λ¦¬μμλ λ€μκ³Ό κ°μ΄ μ μνκ³ μλ€.
basic_string ν
νλ¦Ώμ΄ μΈκ°μ§μ λ
Όμλ₯Ό κ°μ§κ³ μμ, μ΄ νμ€μ μ‘°μ°¨ μμΈνκ² μ£Όμμ λ¬μ μλ€.;κ·Έλ μ§λ§ 무μλ³΄λ€ λ¨Όμ μκ°ν κ² μ²«λ²μ§Έλ κΈ°λ³Έ κ°μ΄λ€. μ§μ§ string νμ μ΄ν΄λ₯Ό μν΄μ λ°λμ μ΄μ κ°μ μν©μ μ§λ©΄νλλ°, λ°λ‘ basic_stringμ λν μ μΈμ μμ ν μ μλκ°? μ΄λ€.
~cpp typedef basic_string<char> string;
~cpp template<class charT, class traits = string_char_traits<charT>, class Allocator = allocator> class basic_string;
string νμ λμμΈμ λ°μλ μ΄λ¬ν μ κ·Όμ-ν
νλ¦Ώμ μΌλ°ν- νμ€ C++ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄μ λ°λ³΅λμ΄ μ§λ€. IOStream? κ·Έλ€μ ν
νλ¦Ώμ΄λ€.; μΈμ(type parameter)λ μ€νΈλ¦Όμμ λ§λ€μ΄μ§λ λ¬ΈμνμΌλ‘ μ μλμ΄ μλ€. 볡μ‘ν μ«μ(Complex number)? μμ ν
νλ¦Ώμ΄λ€.;μΈμ(type parameter)λ μ«μλ₯Ό μ΄λ»κ² μ μ₯ν μ§ μ μλμ΄ μλ€. Valarray? ν
νλ¦Ώμ΄λ€.;μΈμ(type parameter)λ κ° λ°°μ΄μ μ΅μ νλλ€. κ·Έλ¦¬κ³ STLμ κ±°μ λͺ¨λ ν
νλ¦Ώμ 볡ν©μ²΄μ΄λ€. λ§μ½ λΉμ μ΄ ν
νλ¦Ώμ μ΅μνμ§ μλ€λ©΄, μ§κΈ νλ°μ λ΄λλ 보μλΌ.
νμ€ λΌμ΄λΈλ¬μ κ΄νμ¬ λ€λ₯Έ λΆλΆλ std μ΄λ¦ 곡κ°μμ λͺ¨λ κ²μ΄ κ°μμ μΌλ‘ ν¬ν¨λμ΄ μλ€. νμ€ λΌμ΄λΈλ¦¬μμ λͺ
μμ μΌλ‘ κ·Έλ€μ μ΄λ¦μ νννμ§ μκ³ μ°κΈ° μν΄μλ, usingμΌλ‘ μ§μ μ κ·Όμ νκ±°λ 미리 usingμ μΈμ ν΅ν΄ μ κ·Όν μ μλ€. (DeleteMe λͺ¨νΈ)λ€νμ€λ½κ²λ μ΄λ¬ν λ¬Έλ²μ κ΄λ¦¬λ λΉμ μ΄ #include λ₯Ό μ¬μ©ν λλ§λ€ μλ§λ ν€λμ μ μ©λλ€.
Fortunately, this syntactic administrivia is automatically taken care of when you #include the appropriate headers.
4.1. The Standard Template Library : νμ€ ν νλ¦Ώ λΌμ΄λΈλ¬λ¦¬ ¶
νμ€ C++ λΌμ΄λΈλ¬λ¦¬μμ κ°μ₯ ν° λ΄μ€λ Standard Template Library(νμ€ ν
νλ¦Ώ λΌμ΄λΈλ¬λ¦¬)μΈ STLμ΄λ€. (C++ λΌμ΄λΈλ¬λ¦¬μμ κ±°μ λͺ¨λ κ²μ΄ ν
νλ¦Ώμ΄ λμ΄ν κ·Έ μ΄λ¦ STLμ μ΄μ νΉλ³νκ²μ΄ μλλ€. κ·ΈλΌμλ, μ΄κ²μ λΌμ΄λΈλ¬λ¦¬μ μκ³ λ¦¬μ¦κ³Ό 컨ν
μ΄λμ λΆλΆμ μ΄λ¦μ΄λ€. κ·Έλμ μ°κΈ°μ μ’μ μ΄λ¦μ΄κΈ°λ, λμ μ΄λ¦μ΄κΈ°λ νλ€.)
STLμ λ§μ μ‘°μ§-κ±°μ λͺ¨λ C++λΌμ΄λΈλ¬λ¦¬-μ μν₯μ λ―ΈμΉλ κ² κ°λ€. κ·Έλμ κ·Έκ²μ μΌλ°μ μΈ κ°λ
κ³Ό μΉν΄μ§λ κ²μ λ§€μ° μ€μνλ€. κ·Έλ€μ μ΄ν΄νκΈ°λ μ΄λ ΅μ§ μλ€. STLμ μΈκ°μ§μ κΈ°λ³Έμ μΈ κ°λ
μ κΈ°λ°νκ³ μλ€.: container, iterator, algorithm. Containerλ κ°μ²΄μ λͺ¨μ(collection)μ΄λ€. Iteratorλ STL 컨ν
μ΄λμμ λΉμ μ΄ built-in νμ μΈμλ€μ ν¬μΈν°λ‘ μ‘°μ νλ κ²μ²λΌ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€. Algorithmμ STL containerμ iteratorλ₯Ό μ¬μ©ν΄μ κ·Έλ€μ μΌμ λλλ° μ¬μ©νλ ν¨μμ΄λ€.
λ°°μ΄μ μν C++(κ·Έλ¦¬κ³ C)μ κ·μΉμ κΈ°μ΅νλ κ²μ΄ STlμ μ 체μ μΌλ‘ λ°λΌλ³΄λλ° κ°μ₯ μ νλμ΄μΌ ν μμ μ΄λ€. μ°λ¦¬κ° μμμΌ ν κ²μ μ λ§ μ€μ§ νλμ κ·μΉμ΄λ€.:λ°°μ΄μ κ°λ¦¬ν€λ ν¬μΈν°λ ν©λ²μ μΌλ‘ λ°°μ΄μμ μ΄λ ν μΈμλ λ°°μ΄μ λμ λμ΄ μ΄λ ν μΈμλΌλ κ°λ¦¬ν¬μ μλ€. λ§μ½ ν¬μΈν°κ° λ°°μ΄μ λμ λμ μΈμλ₯Ό κ°λ¦¬ν¨λ€λ©΄, κ·Έκ²μ λ°°μ΄μ κ°λ¦¬ν€λ λ€λ₯Έ ν¬μΈν°μ λΉκ΅ λμ΄μ§λ μ μ΄λ€.; κ²°κ³Όμ μΌλ‘ μ μλμ§ μμ dereferencingμ μννλ κ²μ΄λ€.
λ°°μ΄μ μν C++(κ·Έλ¦¬κ³ C)μ κ·μΉμ κΈ°μ΅νλ κ²μ΄ STlμ μ 체μ μΌλ‘ λ°λΌλ³΄λλ° κ°μ₯ μ νλμ΄μΌ ν μμ μ΄λ€. μ°λ¦¬κ° μμμΌ ν κ²μ μ λ§ μ€μ§ νλμ κ·μΉμ΄λ€.:λ°°μ΄μ κ°λ¦¬ν€λ ν¬μΈν°λ ν©λ²μ μΌλ‘ λ°°μ΄μμ μ΄λ ν μΈμλ λ°°μ΄μ λμ λμ΄ μ΄λ ν μΈμλΌλ κ°λ¦¬ν¬μ μλ€. λ§μ½ ν¬μΈν°κ° λ°°μ΄μ λμ λμ μΈμλ₯Ό κ°λ¦¬ν¨λ€λ©΄, κ·Έκ²μ λ°°μ΄μ κ°λ¦¬ν€λ λ€λ₯Έ ν¬μΈν°μ λΉκ΅ λμ΄μ§λ μ μ΄λ€.; κ²°κ³Όμ μΌλ‘ μ μλμ§ μμ dereferencingμ μννλ κ²μ΄λ€.
μμ κ·μΉμ, λ°°μ΄μμμ νλμ νΉλ³ν κ°μ μ°ΎκΈ°μν ν¨μμ μμ±μ κ·μΉμ μ΄μ μ΄ λλ€. integer(μ μ)μ λ°°μ΄μ, μ°λ¦¬λ μ΄μ κ°μ ν¨μλ₯Ό μμ±νμλ€.
μ΄ ν¨μλ ν΄λΉ λͺ©ν μμ μ μμκ³Ό λ μμ ν΄λΉ κ°μ΄ μλκ°λ₯Ό μ°Ύλλ€. κ·Έλ¦¬κ³ λ°°μ΄μμ ν΄λΉ μ λΉν μλ₯Ό μ²μ λ§λλ©΄ λ°ννλ€.; λ§μ½ μ°Ύμ§ λͺ»νλ©΄, endλ₯Ό λ°ννλ€.
~cpp int * find(int *begin, int *end, int value) { while (begin != end && *begin != value) ++begin; return begin; }
endλ₯Ό λ°ννλ κ²μ λ¨μν νλ²ν λ°©λ²μΌλ‘ μ¬λ―Έμκ² λ³΄μΈλ€. 0(null pointer)μ΄ λ μ’μ§ μμκΉ? νμ€ν nullμ λ μμ°μ€λ½κ² 보μ΄κ² μ§λ§ "λ μ’μ§"λ μλ€. μ°Ύλ ν¨μλ λ°λμ κ²μμ΄ μ€ν¨ν¨μ μλ―Ένλ μ΄λ ν λλ ·ν ν¬μΈν° κ°μ λ°νν΄μΌλ§ νλ€. κ·Έλ° λͺ©μ μΌλ‘ end ν¬μΈν°λ nullλ§νΌ μ’λ€. κ±°κΈ°μλ€κ° μ°λ¦¬κ° μ΄μ κ³§ 보κ²λ , null ν¬μΈν° λ³΄λ€ λ€λ₯Έ container νμΌλ‘ μΌλ°ν μν€λ κ²μ μμ μλ€.
μμ°ν μ΄κ²μ μλ§ λΉμ μ΄ μ°ΎκΈ° ν¨μ(find function)λ₯Ό μμ±ν λ°©λ²μ΄ μλλ€. κ·Έλ μ§λ§ κ²°μ½ λ©μ²ν κ²μ΄ μλκ³ , κ·Έκ²μ λ§€μ° νλ₯ν μΌλ°ν λλ€. λΉμ μ΄ μ΄μ κ°μ κ°λ¨ν μμ λ₯Ό λ°λ₯΄λ©΄, STLμμ μ°Ύμμ μλ λλ€μμ μκ°λ€μ κ°μ§κ³ μλκ±°λ€.
λΉμ μ μ°ΎκΈ° ν¨μ(find function)λ₯Ό λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μλ€.
λΉμ μ λ°°μ΄μ subrange κ²μλ ν μ μλ€.
ν΄λΉ ν¨μλ λ°°μ΄μ μ μ©μ΄ intμ νμ λμ΄ μμ΄μ μμμ±μ΄ μλ€. κ·Έλμ κ·Έκ²μ ν
νλ¦Ώ(template)μΌλ‘ λ§λ€μ΄ λ³Έλ€.
~cpp int values[50]; ... int *firstFive = find( values, // μ«μ 5λ₯Ό values+50, // value[0] - value[49] 5); // κΉμ§ κ²μ if (firstFive != values+50) { // κ²μμ΄ μ±κ³΅νλμ? ... // λ€ } else { ... // μλμ. κ²μμ μ€ν¨ νλ€. }
~cpp int *firstFive = find(values, // search the range values+10, // values[0] - values[9] 5); // for the value 5 int age = 36; ... int *firstValue = find(values+10, // search the range values+20, // values[10] - values[19] age); // for the value in age
~cpp template<class T> T * find(T *begin, T *end, const T& value) { while (begin != end && *begin != value) ++begin; return begin; }
κ·Έλ μ§λ§ μ΄ ν
νλ¦Ώμ μ’λ€, κ°λ€κ° μΌλ°ν κΉμ§ ν μ μλ€. μμκ³Ό λμ μ°μ°μλ₯Ό 보μλΌ. μ¬μ©λ μ°μ°μλ λ€λ₯΄λ€λ κ², dereferencing, prefixμ¦κ°(Item 6μ°Έκ³ ), 볡μ¬(ν¨μμ λ°ν κ°μ μν΄μ? Item 9μ°Έκ³ )λ₯Ό μν΄μ μ°μλ€. λͺ¨λ μ°μ°μλ μ°λ¦¬κ° overloadν μ μλ€. (DeleteMe λͺ¨νΈ) κ·Έλμ μ ν¬μΈν° μ¬μ©νμ¬ μ°ΎκΈ°λ₯Ό μ ννλκ°? μ νμ©νμ§ μλκ° ν¬μΈν° μΆκ°μμ μ΄λ¬ν μ°μ°μλ₯Ό μ§μνκΈ° μν μ΄λ€ κ°μ²΄λ νμ©ν μ μμκΉ? (hy not allow any object that supports these operations to be used in addition to pointers?) κ·Έλμ μ΄λ κ² νλκ²μ ν¬μΈν° μ°μ°μμ built-in μλ―Έλ₯Ό μ°ΎκΈ°ν¨μ(find function)μ μμ λ‘κ² ν κ²μ΄λ€. μλ₯Ό λ€μ΄μ μ°λ¦¬λ 리μ€νΈ μμ λ€μ 리μ€νΈλ‘μ μ΄λμ ν΄μ£Όλ prefix increment μ°μ°μμ linked listκ°μ²΄μ λΉμ·ν pointerλ₯Ό μ μν μ μλ€.
μ΄κ²μ΄ STL iterator λ€μ μ¨κ²¨μ§ κ°λ
μ΄λ€. Iteratorλ STL containerκ° μ¬μ©νκΈ° μνμ¬ pointer λΉμ·νκ² μ€κ³λ κ°μ²΄μ΄λ€. κ·Έλ€μ Item 28μ μ€λ§νΈ ν¬μΈν°μ μ¬μ΄κ²©μΈ μ
μ΄λ€. κ·Έλ μ§λ§ μ€λ§νΈ ν¬μΈν°λ STLμ iteratorκ° νλ κ²μ λΉνμ¬ μ‘°κΈλ λͺ¨νΈν κ²½ν₯μ΄ μλ€. κ·Έλ μ§λ§ κΈ°μ μ κ΄μ μμ κ·Έλ€μ κ°μ κΈ°μ μ μ΄μ©ν΄μ ꡬνλλ€.
pointer λΉμ·ν κ°μ²΄λ‘μ iterator, μ°λ¦¬λ iteratorλ₯Ό μ΄μ©ν κ²μμμ ν¬μΈν°λ₯Ό κ΅μ²΄ν μ μλ€. κ·Έλμ λ€μκ³Ό κ°μ΄ μ½λλ₯Ό λ€μ μΈμμλ€.
~cpp template<class Iterator, class T> Iterator find(Iterator begin, Iterator end, const T& value) { while (begin != end && *begin != value) ++begin; return begin; }
STLμμ containerλ bitset, vector, list, deque, queue, priority_queue, stack, set, map ν¬ν¨νλ€. κ·Έλ¦¬κ³ λΉμ μ μ΄λ¬ν μ΄λ€ container νμ findμ μ μ©ν μ μλ€.
~cpp list<char> charList; // charμ μμ©νλ // STL listκ°μ²΄λ₯Ό μμ±νλ€. ... // char listμμ 'x' κ° μ²μ λνλλ λΆλΆμ μ°Ύλλ€. list<char>::iterator it = find(charList.begin(), charList.end(), 'x');
list κ°μ²΄λ₯Ό μ°ΎκΈ° μν νΈμΆμ μν΄μ, λΉμ μ listμ κ°μ₯ μ²μ μΈμμ listμ κ°μ₯ λ§μ§λ§μ μΈμλ₯Ό κ°λ¦¬ν€λ iteratorκ° νμνλ€. 리ν¬νΈ ν΄λμ€μ μν λͺκ°μ§μ λμ λ κΈ°λ₯λ€μ μ μΈνκ³ , μ΄κ²μ μ΄λ €μ΄ λ¬Έμ μ΄λ€. μλνλ©΄ λΉμ μ listκ° μ΄λ»κ² ꡬνλμλ κ°μ κ΄ν μ λ³΄κ° μκΈ° λλ¬Έμ΄λ€. λ€ν μ€λ½κ²λ€ 리μ€ν¬(list,λͺ¨λ STLμ containerλ€κ³Ό κ°μ΄) μμκ³Ό λμ μ 곡νλ λ©€λ² ν¨μλ‘μ ν΄κ²°νλ€. μ΄ λ©€λ² ν¨μλ λΉμ μ΄ μνλ iterator λ°ννκ³ μμ μμ μμ ν΄λΉ iterator λκ°μ§λ₯Ό μ°Ύμμ μλ€.
μ°ΎκΈ°(find)κ° λλ¬μΌλ©΄ κ·Έκ²μ μ°Ύμ μΈμλ₯Ό κ°λ¦¬ν€λ, νΉμ charList.end()(μ°Ύμ§ λͺ»νμμλ)μ iterator κ°μ²΄λ₯Ό λ°ννλ€. μλνλ©΄ λΉμ μ listκ° μ΄λ»κ² ꡬνλμλκ°μ λνμ¬ μ무κ²λ μμ μκΈ°λλ¬Έμ μμ ꡬνλ listμμ iteratorκ° μ΄λ»κ² λμλμ§ μ ν μμ μλ€. κ·Έλ°λ° μ΄λ»κ² μ°Ύκ³ μ λ°νλμ΄μ§λ κ°μ²΄μ νμ μμ μμκΉ? λ€μ, list ν΄λμ€λ λͺ¨λ STL containerμ λ§μ°¬κ°μ§λ‘ μ ν ν΄μ λ₯Ό νλ€.: κ·Έκ²μ ν μ μ, iterator, μ¦ listλ΄λΆμ iteratorμ μ μλ₯Ό μ 곡νλ€. charList κ° charμ listκ° λ μ΄νλ‘ iteratorμ μ μλ κ·Έλ¬ν listμΈ list<char>::iterator λ΄λΆμ μκ³ , κ·Έκ²μ μμ μμ μ κ°μ΄ μ°μΈλ€. (κ° STL container ν΄λμ€λ λκ°μ§μ iteraotrνμΈ iterator μ const_iteraotr λ₯Ό μ μνλ€. μ μλ μΌλ°μ μΈ pointerμ κ°μ΄ λμνκ³ νμλ pointer-to-constμ κ°μ΄ λμνλ€. )
λ€λ₯Έ STL continerλ€μ μ΄μ©ν΄μ μ νν κ°μ μ κ·Όμ ν΄λ³Έλ€. κ²λ€κ° C++ ν¬μΈν°λ STL iteratorμ΄λ€. κ·Έλμ μλ λ°°μ΄ μμ λ STL find ν¨μλ μμ μ΄μ©ν μ μλ€.
STL, κ·Έκ²μ μ€μ¬(core)λ λ§€μ° κ°λ¨νλ€. κ·Έκ²μ λ¨μ§, λν μΈνΈ(set of convention)λ₯Ό(μΌλ°ν μμΌ°λ€λ μλ―Έ) λ§λΆμΈ ν΄λμ€μ ν¨μ ν
νλ¦Ώμ λͺ¨μμ΄λ€. STL collection ν΄λμ€λ ν΄λμ€λ‘ μ μλμ΄μ§ νμ iterator κ°μ²΄ beginκ³Ό end κ°μ ν¨μλ₯Ό μ 곡νλ€. STL algorithm ν¨μλ STL collectionμμ iterator κ°μ²΄λ₯Ό μ΄λμν¨λ€. STL iteratorλ ν¬μΈν°μ κ°μ΄ λμνλ€. κ·Έκ²μ μ λ§λ‘ λͺ¨λ κ²μ΄ ν¬μΈν° κ°λ€. ν° μμ κ΄κ³λ μκ³ κ°μ ν¨μλ μκ³ κ·Έλ¬ν κ²λ€μ΄ μλ€. λ¨μ§ λͺκ°μ ν΄λμ€μ ν¨μ ν
νλ¦Ώκ³Ό μ΄λ€μ μν μμ±λ λͺ¨λ κ²μ΄λ€.
~cpp int values[50]; ... int *firstFive = find(values, values+50, 5); // λ§λ€. STL findλ₯Ό νΈμΆνλ€.
λ λ€λ₯Έ λ©΄μ λ§νλ€.: STLμ νμ₯μ±μ΄ μλ€. λΉμ μ λΉμ μ collection, algorithms, iteratorλ₯Ό STLμ μΆκ°ν μ μλ€. λΉμ μ΄ STL νμλ₯Ό λ°λ₯΄λ μ΄μ νμ€ STL collectionμ μλ§λ λΉμ μ algorithmκ³Ό λΉμ μ collectionμ STLμ algorithmsκ³Ό ν¨κΉ¨ λμν κ²μ΄λ€. λ¬Όλ‘ λΉμ μ ν
νλ¦Ώμ νμ€ C++ λΌμ΄λΈλ¬λ¦¬μ νλΆλΆμ΄ μλλ€. κ·Έλ μ§λ§ κ·Έλ€μ κ°μ μλ¦¬λ‘ λ§λ€μ΄ μ§κ²μ΄κ³ , μ¬μ¬μ© λ κ²μ΄λ€.
λ΄κ° μ¬κΈ°μ κΈ°μ ν κ²λ³΄λ€ ν¨μ¬ λ§μ C++ λΌμ΄λΈλ¬λ¦¬κ° μ‘΄μ¬νλ€. λΉμ μ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¨κ³Όμ μΌλ‘ μ°κΈ° μ μ, λ°λμ λΉμ μ΄ μκ³ μλ μμ½ λ³΄λ€ λ λ§μ κ²μ λ°°μμΌ νκ³ , λΉμ μ STL-compliant ν
νλ¦Ώμ μμ±νκΈ° μ μ, λ°λμ STLμ νμμ κ΄ν΄μ 곡λΆν΄μΌ νλ€. νμ€ C++ λΌμ΄λΈλ¬λ¦¬λ C λΌμ΄λΈλ¬λ¦¬ λ³΄λ€ ν¨μ¬ νλΆνλ€. μλ§ λΉμ μμ μ΄ κ·Έκ²(C++lib)μ μΉμν μλ‘ μκ°μ μ μ½ λ κ²μ΄λ€. κ²λ€κ° λΌμ΄λΈλ¬λ¦¬μ λμμΈ μ² νμ - μΌλ°ν(generality), νμ₯μ±(extensibility), μ΅μ ν(customizability), ν¨μ¨μ±(efficiency), μ¬μ¬μ©μ±(reusability) - λΉμ μ΄ μ¬λ°λ₯Έ λ°°μμΌλ‘ κ°λλ° λ§€μ° λμμ΄ λλ€. νμ€ C++ λΌμ΄λΈλ¬λ¦¬μ 곡λΆλ‘ λΉμ μ λΉμ μ μννΈμ¨μ΄μμ μ¬μ© κ°λ₯ν μ»΄ν¬λνΈλ₯Ό λ§λλ μ¬λ° μ§μμ ν₯μμ λ¬Όλ‘ , C++ λ ν¨μ¨μ μΌλ‘ C++μ νΉμ§μ μ μ©μν€λ λ°©λ²μ λ°°μ΄λ€. κ·Έλ¦¬κ³ λΉμ μ λΉμ μ΄ κ°μ§ λΌμ΄λΈλ¬λ¦¬μ μ’μ λμμΈμ λ°©λ²μ λν ν΄μμ μ»λλ€.