μ΄λ²μ ν΄κ²°ν λλ κ° ν
μ€νΈ λΆλΆμ λν΄ μκ°μΈ‘μ μ νκ³ νμ΅λλ€. (ν 5λΆκ°κ²©μ λ κΈ°μ€) μ€κ°μ ν
μ€νΈλ₯Ό μμ ν
μ€νΈλ‘ λλλ λΉΌκ³ λ λ³΄ν΅ ν ν
μ€νΈ λΉ 5λΆμ λ 걸리λκ΅°μ.
μ°.. κ·Έλ¦¬κ³ μ¬μ ν ν
μ€νΈ μ½λλ₯Ό μκ°νκΈ° μ΄λ €μ λ λΆλΆμ΄ μ€μ Queen μ λλ λΆλΆμΈλ°μ. λ€μκ³Ό κ°μ΄ μ½λλ₯Ό λμ΄νκ³ μ¬κ·νΈμΆ λΆλΆμ λν΄μ μ λλ₯Ό νλ λ°©λ²μ μλν΄λ΄€μ΅λλ€. μΌμ’
μ μμ΄ μ°Ύλ λ°©λ²μ΄ λλκ΅°μ. μ.. μ΄ λΆλΆμ λν΄μλ EightQueenProblem μ λν νλμ ν΄λ₯Ό μμλκ³ μμνλ€λ©΄ TDDλ₯Ό μλν μ μμκ² κ°λ€λ μκ°μ΄ λ€κΈ΄ νλλ°. (λ¬Έμ λ, λ΅μ ꡬν΄λκ³ λμμΌ μ΄ μκ°μ΄ λ¬λλΌλ. --;)
- νκ³ λλ μμ¬μ λμ - μ¬μ κ° μμλλ°, λ§λ€κ³ λλ κΈ°μ‘΄μ μκ°νμλ λ°©λ²κ³Ό λΉμ·νκ² λμ΄λ²λ Έλ€λ μ . μ’ λ μ¬μ λ₯Ό κ°μ§κ³ , νμ¬ μκ°ν λ°©λ² μμ²΄κ° λ³΅μ‘ν λ°©λ²μ΄ μλκΉ μκ°νλ©΄μ λ μ¬μ΄λ°©λ²μ μκ°ν΄λΌ μ μμμν
λ°.. λ€λ₯Έ μ¬λλ€μ μμ€λ₯Ό 보λ Queenμ λν λκ°μ μ²λ¦¬ μκ³ λ¦¬μ¦ λΆλΆμ΄ ν¨μ¬ λ λ¨μνκ² ν μ μκ² λλΌλ.
μκ³ λ¦¬μ¦μλ OAOOλ₯Ό μ μ©ν μ μμ΅λλ€. μ 보μ μ€λ³΅(duplication)μ΄ μλ€λ©΄ μ κ±°νλ μμΌλ‘ 리ν©ν λ§μ νλ κ²λλ€. μ΄ λ μ 보μ μ€λ³΅μ μ νμ€ νΉμ μΈλ§ν±μ€μ μ€λ³΅μΌ μ μμ΅λλ€.
μ λ κ³Όμ λΆλΆ ¶
~cpp def MakeEightQueen (self, Level): UnAttackableList0 = self.GetUnAttackableOthersPositionList (0) for UnAttackablePosition0 in UnAttackableList0: self.SetQueen (UnAttackablePosition0) UnAttackableList1 = self.GetUnAttackableOthersPositionList (1) if not len (UnAttackableList1): self.EraseQueen (UnAttackablePosition0) continue for UnAttackablePosition1 in UnAttackableList1: self.SetQueen (UnAttackablePosition1) UnAttackableList2 = self.GetUnAttackableOthersPositionList (2) if not len (UnAttackableList2): self.EraseQueen (UnAttackablePosition1) continue for UnAttackablePosition2 in UnAttackableList2: self.SetQueen (UnAttackablePosition2) . . ## if level == 8: ## make clone and append the eq = QueenBoard () self.Clone (eq) self.EightQueenList.append (eq) return 0
μ΅μ’ λΆλΆ ¶
~cpp def MakeEightQueen (self, Level): if Level == self.size: eq = QueenBoard () self.Clone (eq) self.EightQueenList.append (eq) return 0 UnAttackableList = self.GetUnAttackableOthersPositionList (Level) if not len (UnAttackableList): return 0 ## return before level. ( if level == 0: have no solution) for UnAttackablePosition in UnAttackableList: self.SetQueen (UnAttackablePosition[0], UnAttackablePosition[1]) if not self.MakeEightQueen (Level + 1): self.EraseQueen (UnAttackablePosition)
-- μμ²
EightQueenProblemDiscussion μμ μ§μ ν΄μ£Όμ κ²μ²λΌ, OOPλ₯Ό μ¨λ³΄μλΌλ λͺ©νλ‘ λ€μ μμ±ν΄λ³΄μλλ, λμμΈμμ κ³ λ € λλ¬ΈμΈμ§, μ λ
μκ°μ΄λΌ λλ ₯μ μλͺ¨ λλ¬ΈμΈμ§λ λͺ°λΌλ μ€νλ € μκ°μ΄ λ λμ΄λ²λ Έμ΅λλ€. μ΄λ² λμμΈμ κ³Όμ° OOPλ₯Ό μ λλ‘ μ΄κ±΄μ§ μ견μ ꡬν©λλ€.
λμμΈνλ©΄μ, κ°μ₯ μλ¬Έμ΄ λ€μλ λΆλΆμ΄ μΆλ ₯κ³Ό κ΄κ³λ λΆλΆμ΄μμ΅λλ€. EightQueenProblem μμ²΄κ° μΆλ ₯μ΄ νμν λ¬Έμ μΈμ§, μλμ§λ‘ μμλ κ³ λ―Όμ.. κ²°κ΅ 'μΆλ ₯μ΄ νμνλ€' λΌκ³ κ²°λ‘ μ λ΄λ¦¬κ² λμ΄, μΆλ ₯μ μν κ²½μ°, μΈμλ‘ μΆλ ₯ μμ€λ₯Ό λ겨주면 μ§μν κ³³μΌλ‘ μΆλ ₯νκ³ , λΆκ°μ μΌλ‘ output formatμ μ§μνλ λ°©μμ μ±ννμμ΅λλ€.
--μ΄μ μ°
μ κ° λ³΄κΈ°μ νμ¬μ λμμΈμ class ν€μλλ§ λΉΌλ©΄ μ μ°¨μ νλ‘κ·Έλλ°(procedural programming)μ΄ λλ κ² κ°μ΅λλ€. μ€λΈμ νΈ μμ±μ μ μ λ³μκ° λκ³ λ§μ΄μ£ . μ΄λ° ꡬμ±μ μΌλ¬ God Class Problemμ΄λΌκ³ λ ν©λλ€. AOP(Action-Oriented Programming -- μμ Procedural Programmingμ΄λΌκ³ νλ κ²) μͺ½μμ μ¨ νλ‘κ·Έλλ¨Έλ€μ΄ μμ£Ό λ§λλ μ€μμ΄κΈ°λ ν©λλ€. κ°μ²΄μ§ν₯ λΆν΄λΌκΈ°λ³΄λ€λ ν κ±°λ ν΄λμ€ λ΄μμμ κΈ°λ₯μ λΆν΄(functional decomposition)κ° λλ κ²μ΄μ£ . Wirfs-Brockμ μ§λ₯(Intelligence)μ κ³ λ₯Έ λΆν¬λ₯Ό OODμ μ€μμμλ‘ λ½μ΅λλ€. NQueen μ€λΈμ νΈλ κ·Έ μ΄λ¦μ "Manager"λ "MainController"λ‘ λ°κΏλ λ μ λλ‘ λͺ¨λ μ±
μ(responsibility)μ λλ§‘μ νκ³ μμ΅λλ€ -- Meyerλ νλμ ν΄λμ€λ νκ°μ§ μ±
μλ§μ μ λλ‘ ν΄μΌνλ€(A class has a single responsibility: it does it all, does it well, and does it only )κ³ λ§νλλ°, μ΄κ²μ ν΄λμ€ μ΄λ¦μ΄ μ μ§μ΄μ‘λμ§, μΌλ§λ ꡬ체μ±μ μ£Όλμ§ λ±μμ μ μ μμ΅λλ€. (Coadλ "In OO, a class's statement of responsibility (a 25-word or less statement) is the key to the class. It shouldn't have many 'and's and almost no 'or's."λΌκ³ ν©λλ€. λ§μ½ μ΄κ² μμ°μ€λ½κ² λμ§μλλ€λ©΄ ν΄λμ€λ₯Ό νλ μ΄μ λ§λ€μ΄μΌ νλ€λ μκΈ°κ° λκ² μ£ .) νκ°μ§ κ°λ₯ν μ§λ₯ λΆμ°μΌλ‘, μ¬λ¬κ°μ Queen μ€λΈμ νΈμ Board μ€λΈμ νΈ νλλ₯Ό λ§λλ κ²½μ°λ₯Ό μκ°ν΄ λ³Ό μ μκ² μ΅λλ€. Queen μ€λΈμ νΈ κ°μ΄ Queen μ€λΈμ νΈ μμκ² λ¬Όμ΄λ΄
λλ€. "λ΄κ° λλ₯Ό κ·μ°κ² νκ³ μλ?" --κΉμ°½μ€
λ§μν΄μ£Όμ
μ κ°μ¬ν©λλ€. μ΄ν΄κ° μλλ λΆλΆ λͺκ°μ§ μ¬μ€λ³΄κ² μ΅λλ€. μ’
ν©ν΄λ³΄λ©΄, NQueen μ체λ μ΄λ ν 보λ ννκ° n-Queens problemμ λ§μ‘±νλκ²μΈμ§λ₯Ό μμλ΄μΌ νκ³ , n * n ν¬κΈ°μ 보λλ₯Ό λ§λ€μ΄κ±°λ λ§λ€μ΄μ§ 보λλ₯Ό μΆλ ₯νλ건 λ€λ₯Έ λκ΅°κ°μ λͺ«μ΄λ€. λΌλ μ΄μΌκΈ°κ° λλ건κ°μ?(μ΄ λ΄μ©μ΄ μμμ μ°μ νκ°μ§ κ°λ₯ν ... λ³Ό μ μκ² μ΅λλ€μ λ΄μ©μΈμ§λ κΆκΈν©λλ€.) κ·Έλ¦¬κ³ , λ§μ§λ§μ μ°μ Queen μ€λΈμ νΈ κ°μ΄ Queen μ€λΈμ νΈ μμκ² λ¬Όμ΄λ΄
λλ€. "λ΄κ° λλ₯Ό κ·μ°κ² νκ³ μλ?" μ λ΄μ©μ΄ μ΄λ€ λ»μΈμ§ κΆκΈν©λλ€. --μ΄μ μ°
μλ₯Ό λ€μ΄, Board κ°μ²΄λ Queen κ°μ²΄λ€μ λ§λ€κ³ λ°°μΉ, μμ μ μνλ₯Ό μΆλ ₯νλ μλΉμ€λ₯Ό μ§μνκ³ , Queen κ°μ²΄λ λ΄κ° λ€λ₯Έ Queen κ°μ²΄λ₯Ό 곡격ν μ μλμ§ μλμ§ μλ €μ£Όλ μλΉμ€λ₯Ό μ§μν©λλ€ -- λ λμκ°μ μ€μ€λ‘ μκΈ° μμ μ리λ₯Ό μ°Ύμκ° μ λλ‘ λλνκ² λ§λ€ μλ μκ² μ£ . Queen μ€λΈμ νΈ κ°μ΄ Queen μ€λΈμ νΈ μμκ² λ¬Όμ΄λ΄
λλ€. "λ΄κ° λλ₯Ό κ·μ°κ² νκ³ μλ(attackableμ λν λ©νν¬μ)?", λΌλ λΆλΆμ OOPλ‘ μ΄λ»κ² ννλ μ μμκΉ μ§μ μκ°ν΄ 보λ κ²μ΄ λ μ’μ κ² κ°μ΅λλ€. OOPμμ κ°μ²΄λΌλ¦¬μ μμ¬μν΅μ λ³΄ν΅ λ©μλ νΈμΆλ‘ μ΄λ£¨μ΄μ§κ³ , λͺ©μ μ΄λ μΈμμ ννλ‘ μ λ¬λλ€λ μ μ κ³ λ €νλ€λ©΄ μ¬λ¬κ°μ§ λ°©λ²μ΄ λ μ€λ₯Ό μ μκ² μ£ .
κ³μν΄μ λ¬Έμ μ μ λ°κ²¬νλ μ¬λ°μ΅λλ€. λλ€μ OOPμ λμ ν΄λ΄€μ΅λλ€. κΈ°λ³Έ 컨μ
μ, μ²΄μ€ λ§κ³Ό 보λ κ·Έλ¦¬κ³ μ²΄μ€ νλ μ΄μ΄κ° λ±μ₯ν©λλ€. μ²΄μ€ λ§μ μμ μ΄ λμμΌλ‘μ¨ λ€λ₯Έ λ§μ "κ·μ°κ² νλμ§"λ₯Ό νλ¨νκ³ , 보λλ μ΄λ¬ν μ²΄μ€ λ§λ€μ΄ λμ΄κ³ μΆλ ₯νλ μΌμ λ΄λΉν©λλ€. λ§μ§λ§μΌλ‘ μ²΄μ€ νλ μ΄μ΄λ μμ μ μκ³ λ¦¬μ¦μ λ°λΌ 보λμ νΈμ λ°°μ΄νκ² λ©λλ€. μ΄λ²μ λκ°μ λ°©ν₯μ νΈμ 체ν¬νλ λ°©λ²μΌλ‘ κΈ°μΈκΈ°μ μν λ°©λ²μ΄ λ μ¬λμ΅λλ€. λλΆμ λκ°μ 체ν¬κ° κΉλν΄μ§λ― ν©λλ€. μμμ μ΄μΌκΈ°ν΄μ£Όμ λ°©λ² κ°μ΄λ° 'μ€μ€λ‘ μκΈ° μμ μ리λ₯Ό μ°Ύμκ°λ€'λΌλ λΆλΆμ, κ·Έλ κ² λλ©΄ μ²΄μ€ λ§κ³Ό 보λκ° μλ‘ tightlyνκ² μ°κ²°λ 곡μ°μ΄ 컀μ κ³ λ―Όνλ€κ° μ²΄μ€ νλ μ΄μ΄λ₯Ό νμμν¨ λ°°κ²½μ΄ λμμ΅λλ€.
--μ΄μ μ°
μ.. μμ§ κ΅¬νμ μν΄λ³΄κ³ κ·Έλ₯ μκ°ν΄λ³Έκ±°μ§λ§, μ²΄μ€ λ§κ³Ό 보λκ° νμ΄νΈνκ² μ°κ²°λμ΄λ ν° λ¬Έμ λ μλ κ² κ°μλ°μ. 보λλ₯Ό Singleton μΌλ‘ λͺ¨λ Queenλ€μ΄ 곡μ νλ κ°μ²΄λ‘ μκ°ν΄λ μ’μ κ² κ°κ³ μ. (Queenμ λμ΄ λ¬λ Έλμ§, κ·Έλ μ§ μμΌλ©΄ μ²΄μ€ νλ μ΄μ΄κ°μ΄ Queenμ΄ μ‘΄μ¬νκ³ μλ μΈκ³μ λν λ΅μ λ΄λ €μ€ μ (?) μ΄ μ‘΄μ¬νλμ§ λμ€ νλκ° λ λ― νλ€λ. ^^;) μμ§ OO κ΄μ μΌλ‘λ κ·Έλ₯ μκ°λ§ ν΄λ³΄λμ€. --μμ²
컀νλ§μλ μκ³Ό μμ΄ μμ΅λλ€.
OO ν¨λ¬λ€μμ μ¬λ¬Ό(μ¬κ±΄ + 물건)λ€μ΄ μ ν μΌμ μ€μ€λ‘ μμ νλ μ κΈ°νκ³ νΈλ¦¬ν μΈμμ μμ ν©λλ€. μΉκ΅¬κ° μ§μ μ°Ύμμλ€κ° λ°©μ μ΄μ§λ½νκ³ κ°μ΅λλ€. μμ μ΄ κ°κ³ μλ "κΉ¨λν λ°© λ°°μΉλ"λ₯Ό μ΄μ©νκ±°λ νΉμ κ° λ¬Όκ±΄ λΉ λΆμ΄μλ "μλ μμΉ" 꼬리νλ₯Ό λ³΄κ³ κ°λ€ λμ μμΉμ κ±°κΈ°λ‘ μ΄λ₯΄λ κ²½λ‘λ₯Ό νλ¨, μ§μ μ¬λ°°μΉλ₯Ό ν΄μΌνλ μΈμκ³Ό, λ²½μ μ§λ νμ₯μ λΆμ¬λκ³ λ§μΉ λ§μ (automagically)μ²λΌ "λͺ¨λ 물건μ μ μμΉλ‘!"λΌκ³ μΈμΉλ©΄ λ§λν μ λ¦¬κ° λλ μΈμ, μ΄λ κ²μ΄ OOPμ μΌκΉμ.


~cpp route=superman.getEverydayPath() for each city in the route: superman.visit(each city)μ
~cpp superman.travelEverydayPath()μ μ°¨μ΄μ λλ€.
--κΉμ°½μ€
λ€μ λ¨Έλ¦¬κ° μνμ€κΈ° μμν©λλ€. μ΄λ²μ μλ₯Ό μ μλλ°λ‘ μλΌλ³΄μλΌκ³ κ²°μ¬μ νκ² λ λ°°κ²½μ€ νλκ°, NQueen2 μμ μμ μ μμμ λ°μ΄λλ Managerκ° λλ²λ¦¬λ κ²½μ°μ λν μ΄μΌκΈ°κ° μμ΄μ μμ΅λλ€. κ·Έλ λ€λ©΄ μμΌλ‘, μμμ supermanκ³Ό objectμ κ°λ
μ΄λ κ²½κ³λ λͺ¨νΈν΄μ§λκ² μλκ°μ? κ·Έλ λ€λ©΄, Playerκ° λ°λ‘ μλ κ°λ
보λ€λ Boardμμ μ²λ¦¬νλκ² λ OOμ μΈκ°μ?
--μ΄μ μ°
μ λ§μ
~cpp mainProgram.runEverything()
μ μ€ννλ©΄ λͺ¨λ κ² λ§μ μ²λΌ μμμ μ€νλκ² νλΌλ λ»μΌλ‘ μ€ν΄νμ§λ μμμΌλ©΄ ν©λλ€. μ supermanμ μμμλ, μ μμ κ²½μ° supermanμ μ λλ‘ μ΄μ©ν΄ λ¨ΉμΌλ €λ©΄ supermanμ λ΄λΆμ ꡬ쑰λ₯Ό μμμΌ ν©λλ€. supermanμ ꡬνμ μ’
μμ μ΄ λλ μ
μ΄μ£ . νμ§λ§ νμλ κ·Έκ² λ컀νλ§μ΄ λ©λλ€. μκΈ°κ° λ§€μΌ κ°λ κΈΈμ μλ λμλ₯Ό λ°©λ¬Ένλ κ²μ supermanμ΄ μ€μ€λ‘ μνν μ μμ΄μΌ ν μ±
μμ΄ μλ€ μ΄κ±°μ£ . Queenμ΄λΌλ κ°μ²΄κ° μ¬λκ°κ° μλ€κ³ μΉ©μλ€. μλ€λ€νν
"λλ μ μ¬μμ 곡격ν μ μλ?"νκ³ λ¬»κ³ κ·Έ κ²°κ³Όλ₯Ό κ°μ§κ³ μ¬μμ λ°°μΉνκ³ νλ κ²μ νλμ μΆμ(abstraction)μΌλ‘ λ¬Άλ κ²μ΄ μ΄λ¨κΉμ? 묻μ§λ§κ³ "μν€μ"λ κ²μ΄μ£ -- μ¬λκ°μ λλν Queen κ°μ²΄λ₯Ό λ§λ€κ³ νλμ© "ν μλ‘ μ¬λΌκ°λΌ"κ³ μν΅λλ€. μ΄λ κ² νλ©΄ Boardμ Queenμ 컀νλ§μ΄ μ겨μ λ¬Έμ κ° λλ 건 μλλκ³ νλλ°, μ΄μ°¨νΌ Queenμ Board μμ΄λ λ³ μλ―Έκ° μκ³ , λ, κ·Έλ κ² νμ§ μλλΌλ μ΄λ»κ²λ λΉμ·νκ±°λ νΉμ λ ν° μ λμ 컀νλ§μ΄ μ‘΄μ¬ν©λλ€. μ΄μ¨κ±΄, μ§κΈ λ¨κ³μμλ, λ λμ λ°©λ²μ΄λΌκΈ°λ³΄λ€ κ·Έλ₯ λ€λ₯Έ λ°©λ²μ΄λΌκ³ νΈμνκ² μκ°νλ©΄ μ’μ λ― ν©λλ€. --κΉμ°½μ€DeleteMeLater) λ€, λ¬΄μ¨ λ§μμ΄μ μ§ μκ² μ΅λλ€. λ©°μΉ λμ Queen μκ°νλλΌ μκ°κ°λμ€ λͺ°λμ΅λλ€. μ κΉμ΄ μλλΌ κΎΈμ€ν λ°°μμ΄ μ¦κ±°μΈ μ μμ λ¬μ±
μ΄ μμΌλ©΄ μ’κ² μ΅λλ€. .png)
.png)