✏️ TIL

[ TIL ] νƒ€μž…μ€ λΆ€λͺ¨ 클래슀인데 μžμ‹ 클래슀 μΈμŠ€ν„΄μŠ€λΌκ΅¬μš”?!? / 24λ…„ 3μ›” 7일

EarthSea 2024. 3. 7. 22:48

좜처 : ν•€ν„°λ ˆμŠ€νŠΈ (μˆ˜ν‚€λ„ν‚€)

" 온 μš°μ£Όκ°€ λ‚˜λ₯Ό λ•λŠ” 뢀적 " λ‚˜λ„ ν•˜λ‚˜ 주라! 주라쀘!

 

μ˜€λŠ˜μ€ λΌμ„Ήμˆ˜μˆ ν•œμ§€ 일주일이 μ§€λ‚˜μ„œ μš΄λ™μ„ 갈 수 있게 λ˜μ—ˆμ–΄μš”!

아침에 μΌμ–΄λ‚˜ μš΄λ™μ„ λ‹€λ…€μ™”λ”λ‹ˆ μ’€ 더 κ°œμš΄ν•˜κ²Œ μ•„μΉ¨ 곡뢀λ₯Ό μ‹œμž‘ν•  수 μžˆκ² λ”λΌκ΅¬μš”!!!

근데도 μ™œ μ „ 10μ‹œκ°€ λ„˜μ–΄μ„œ TIL을 μ“°κ³  μžˆμ„κΉŒμš”..?γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹μ˜λ¬Έ..

 


 

μ–΄μ œμ˜ TILμ—μ„œ ν•΄κ²°ν•΄μ•Όν–ˆλ˜ λ¬Έμ œκ°€ μžˆμ—ˆμ£ ?!?!

ν•œκ°€μ§€μ˜ λ³€μˆ˜μ— λΆ€λͺ¨ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λŒ€μž…ν•˜κ³ , κ·Έ λ³€μˆ˜λ₯Ό μžμ‹ 클래슀둜 λ‹€μš΄μΊμŠ€νŒ…ν•˜μ—¬ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ,
κ²½μš°μ— 따라 λ‹€λ₯Έ λ‹€μš΄ μΊμŠ€νŒ…μ„ ν•˜μ—¬ μ§„ν–‰ν•˜λ©΄ μ•ˆλ˜λŠ”μ§€.. μ•ˆλœλ‹€λ©΄ μ™œ μ•ˆλ˜λŠ”μ§€..!!!!

자기 μ „κΉŒμ§€ 이걸 μ–΄λ–»κ²Œ ν•˜λ©΄ ν•  수 μžˆμ„κΉŒμ— λŒ€ν•΄μ„œ μƒκ°ν•΄λ΄€λ˜ 것 κ°™μ•„μš”.

 

✨ μ–΄μ œμ˜ λ¬Έμ œκ°€ κΆκΈˆν•˜μ‹œλ‹€λ©΄ μ–΄μ œμ˜ TIL을 μ°Έκ³ ν•΄μ£Όμ„Έμš”

class Calculator {

    var firstNumber: Int = 0
    var secondNumber: Int = 0
    var op: Character?

    init(firstNumber: Int, secondNumber: Int, op: Character? = nil) {
        self.firstNumber = firstNumber
        self.secondNumber = secondNumber
        self.op = op
    }

    func calculate() -> Double {

        var operation = AbstractOperation()

        // 🚨Error
        //if op == "+" { operation as! AddOperation4 }
        //else if op == "-" { operation as! SubtractOperation4 }
        //else if op == "/" { operation as! DivideOperation4 }
        //else if op == "*" { operation as! MultiplyOperation4 }
        //else if op == "%" { operation as! ModulusOperation4 }
        //else { return 0.0 }

        return operation.calculate(firstNumber, secondNumber)
    }
}

 

μ €μ˜ μ˜λ„λŠ” operationμ΄λΌλŠ” ν•˜λ‚˜μ˜ λ³€μˆ˜μ— AbstractOperationμ΄λΌλŠ” 클래슀λ₯Ό μƒμ†λ°›λŠ” AddOperation, SubtractOperation, DivideOperation, MultiplyOperation, ModulusOperation 의 μžμ‹ 클래슀λ₯Ό 각각의 상황에 맞게 λŒ€μž…ν•˜μ—¬ operation.calculateλΌλŠ” ν•¨μˆ˜λŠ” λ”± ν•œλ²ˆλ§Œ μ‚¬μš©ν•˜κ³  μ‹Άμ—ˆμ–΄μš”.

μ–΄μ œμ˜ 였λ₯˜ 해결은 "이 μ˜λ„μ— λŒ€ν•œ ν•΄κ²°"이 μ•„λ‹ˆμ—ˆμ–΄μš”. μ–΄μ œλŠ” op의 변경에 따라 상황에 맞게 μΈμŠ€ν„΄μŠ€λ₯Ό λ”°λ‘œ μƒμ„±ν•˜μ—¬ κ·Έλ•Œλ§ˆλ‹€ ν•¨μˆ˜λ₯Ό 좜λ ₯ν•˜μ—¬ 였λ₯˜λ₯Ό ν•΄κ²°ν–ˆμ–΄μš”. μ•„λž˜μ™€ 같이

 

func calculate() -> Double {

   guard let op = op else { return 0.0 }

   switch op {
   case "+" :
        return AddOperation4().calculate(firstNumber, secondNumber)
   case "-" :
        return SubtractOperation4().calculate(firstNumber, secondNumber)
   case "/" :
        return DivideOperation4().calculate(firstNumber, secondNumber)
   case "*" :
        return MultiplyOperation4().calculate(firstNumber, secondNumber)
   case "%" :
        return ModulusOperation4().calculate(firstNumber, secondNumber)
   default :
        print("계산기에 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ—°μ‚°μžμž…λ‹ˆλ‹€.")
        return 0.0
   }
}
흠.. 이건 λ‚΄κ°€ μ›ν•˜λŠ” 방식이 μ•„λ‹Œλ°..

κ·Έλž˜μ„œ μ œκ°€ μ›ν•˜λŠ” μ˜λ„λŒ€λ‘œ ν’€ 수 μžˆλŠ” 방법이 μžˆμ§€ μ•Šμ„κΉŒμ— λŒ€ν•œ 고민을 μΆ©λΆ„νžˆ ν•œ ν›„ ν•΄κ²°λ˜μ§€ μ•Šμ•„ νŠœν…¨λ‹˜μ„ μ°Ύμ•„κ°”μ–΄μš”.

 

ν•΄κ²° μ™„λ£Œ!!

λ‹€μš΄ μΊμŠ€νŒ…μ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” AddOperation()의 μ˜΅μ…”λ„ νƒ€μž…μœΌλ‘œ μ„ μ–Έλœ λ³€μˆ˜κ°€ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— κ·Έλ ‡κ²Œ 되면 μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ•Όν•˜λ‹ˆ μ œκ°€ μ˜λ„ν•œ λ°”( ν•˜λ‚˜μ˜ λ³€μˆ˜λ‘œ μžμ‹ 클래슀 ν• λ‹Ή ) 을 ν•  수 μ—†μ—ˆλ˜ κ±°μ—μš”. κ·ΈλŸ¬λ‹ˆ λ‹€μš΄ μΊμŠ€νŒ…μœΌλ‘œ ν‘ΈλŠ” 게 μ•„λ‹ˆμ—ˆλ˜ κ±°μ£ !!

λ³€μˆ˜λŠ” λΆ€λͺ¨ 클래슀의 νƒ€μž…μ„ 가지고 μžˆλŠ” λΆ€λͺ¨ 클래슀의 μΈμŠ€ν„΄μŠ€μ΄κΈ° λ•Œλ¬Έμ— λΆ€λͺ¨ 클래슀의 ν•¨μˆ˜μ— 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ˜ν•œ μ–Έμ œλ“ μ§€ μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€λ„ 될 수 μžˆλŠ” κ±°μ£ ! κ·Έλž˜μ„œ ν•œ κ°€μ§€μ˜ λ³€μˆ˜μ— 연산에 λ”°λ₯Έ λ‹€μ–‘ν•œ 클래슀λ₯Ό ν• λ‹Ήν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. calculateλΌλŠ” ν•¨μˆ˜λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜κ°€ λ˜μ–΄ λͺ¨λ“  μžμ‹ ν΄λž˜μŠ€κ°€ μ˜€λ²„λΌμ΄λ”©ν•œ ν•¨μˆ˜μ΄κΈ° λ•Œλ¬Έμ— calculator.calculate(firstNumber, secondNumber)λ₯Ό 해도 μ—λŸ¬κ°€ λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!

 

κ²°κ΅­ calculatorλΌλŠ” λ³€μˆ˜λŠ” λΆ€λͺ¨ 클래슀의 νƒ€μž…μ„ 가지고 μžˆμ§€λ§Œ μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€μΈκ±°μ£ .

 

class Calculator {

    var firstNumber: Int = 0
    var secondNumber: Int = 0
    
    init(firstNumber: Int, secondNumber: Int) {
        self.firstNumber = firstNumber
        self.secondNumber = secondNumber
    }
    
    func calculate(_ op: String) -> Double {

        // μΆ”μƒν™”λœ λΆ€λͺ¨ 클래슀λ₯Ό νƒ€μž…μœΌλ‘œ κ°€μ§€λŠ” λ³€μˆ˜
        var calculator: AbstractOperation
        
        // 연산에 λ”°λ₯Έ μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό ν• λ‹Ή
        switch op {
        case "+" :
            calculator = AddOperation()
        case "-" :
            calculator = SubtractOperation()
        case "/" :
            calculator = DivideOperation()
        case "*" :
            calculator = MultiplyOperation()
        case "%" :
            calculator = ModulusOperation()
        default :
            print("잘λͺ»λœ μ—°μ‚°μž…λ‹ˆλ‹€.")
            return 0.0
        }
        
        return calculator.calculate(firstNumber, secondNumber)
    }
}

 

 

μ΄λ ‡κ²Œ λ‹€μ‹œ ν’€μ—ˆμ–΄μš”!!

 

사싀 case λ§ˆλ‹€ breakλ₯Ό λΆ™μ—¬μ£Όμ—ˆμ—ˆλŠ”λ°, 였늘 switch λ¬Έμ—μ„œ μ•„μ£Ό μžμ„Έν•˜κ²Œ switchλ₯Ό λœ―μ–΄λ³΄κ³  λ³΅μŠ΅μ„ ν–ˆκ±°λ“ μš”?! κ·Έλž¬λ”λ‹ˆ μŠ€μœ„ν”„νŠΈμ—μ„œμ˜ switchλŠ” μžλ°”μ™€ νŒŒμ΄μ¬κ³ΌλŠ” 달리 μΌ€μ΄μŠ€λ§ˆλ‹€ breakλ₯Ό 해주지 μ•Šμ•„λ„ λœλ‹€κ³  ν•˜λ„€μš©! κ·Έλž˜μ„œ μ–Όλ₯Έ λ–Όλ²„λ Έμ–΄μš” γ…‹γ…‹γ…‹γ…‹

μ•„νœ΄.. 이제 두 닀리 λ»—κ³  잘 수 μžˆκ² λ„€μš”!

 


 

바이바이~!

이제 μ”»κ³  μžμ•Όκ² μ–΄μš”! γ…Žγ…Ž