본문 바로가기

iOS 앱 개발자 프로젝트/개인 프로젝트

[Project] #4 나만의 계산기 만들기(Lv3)

나만의 계산기 만들기 Level 3

Level 2와 비교하여 개선된 점을 생각해 보도록 합니다.

 

( 앞서 진행한 Lv 2 보기 >> Lv2 에서 만든 Calculator )


 

Level 3 : 아래 각각의 클래스를 만들고, Calculator 클래스와 관계를 맺고 내부 코드를 변경해 보기

 

class Calculator {
    var firstNumber : Double
    var secondNumber : Double
    
    init(firstNumber: Double, secondNumber: Double) {
        self.firstNumber = firstNumber
        self.secondNumber = secondNumber
    }
    
    func calculate (op : String) -> Double{
        
        switch op {
        case "+":
            let add = AddOperation()
            return add.operate(self.firstNumber, self.secondNumber)
        case "-":
            let add = SubtractOperation()
            return add.operate(self.firstNumber, self.secondNumber)
        case "*":
            let add = MultiplyOperation()
            return add.operate(self.firstNumber, self.secondNumber)
        case "/":
            let add = DivideOperation()
            return add.operate(self.firstNumber, self.secondNumber)
        default:
            return 0
        }
    }
}

class AddOperation {
    func operate(_ firstNumber: Double, _ secondNumber: Double ) -> Double {
        return Double(firstNumber + secondNumber)
    }
}

class SubtractOperation {
    func operate(_ firstNumber: Double, _ secondNumber: Double ) -> Double {
        return Double(firstNumber - secondNumber)
    }
}

class MultiplyOperation {
    func operate(_ firstNumber: Double, _ secondNumber: Double ) -> Double {
        return Double(firstNumber * secondNumber)
    }
}

class DivideOperation {
    func operate(_ firstNumber: Double, _ secondNumber: Double ) -> Double {
        return Double(firstNumber / secondNumber)
    }
}

let calculator = Calculator(firstNumber: 10, secondNumber: 10)
let addResult = calculator.calculate(op: "+")
let subtractResult = calculator.calculate(op: "-")
let multiplyResult = calculator.calculate(op: "*")
let divideResult = calculator.calculate(op: "/")

 

 

1. Calculator 클래스는 firstNumber와 secondNumber라는 두 개의 속성(변수)을 가지고 있으며. 이 속성(변수)들은 계산에 사용될 숫자들을 저장하는 역할을 한다.

 

2. calculate 메서드 내부에서는 switch 문을 사용하여 연산자를 판별하고, 해당 연산을 수행하는 객체를 생성한다. 예를 들어, + 연산자일 경우 AddOperation 객체를 생성하여 덧셈 연산을 수행힌다. 이렇게 생성된 객체의 operate 메서드를 호출하여 실제 연산을 수행하고, 그 결과를 반환한다.

 

3. 각 연산을 수행하는 객체(AddOperation, SubtractOperation, MultiplyOperation, DivideOperation)는 operate라는 메서드를 가지고 있다. 이 메서드는 두 개의 숫자를 매개변수로 받아와서 해당 연산을 수행한 결과를 반환한다.

 

4. 마지막으로, 코드의 마지막 부분에서는 Calculator 클래스의 인스턴스를 생성하고, calculate 메서드를 호출하여 사칙 연산을 수행한 결과를 변수에 저장한다.

 

 

 

↓ 위의 코드 제출 후 받은 피드백

 

- Lv3에서 let add = AddOperation(), let add = SubtractOperation() 등의 인스턴스가 있는데 이름이 모두 add인거 알고 계셨나요? 각각의 이름을 설정해주시면 좋을거 같아요. - let add = AddOperation(), let add = SubtractOperation() 은 calculate 함수가 호출될 때 마다 다시 만들어지고 있어요. 인스턴스를 초기화 하는 (var firstNumber: Double)으로 이동해도 좋을거 같아요. - 나누기나 나머지연산에서 부모나 분자의 값이 0일 때 예외처리가 있으면 좋을거 같아요.

 

↓ 튜터님의 풀이 예시 코드

class AddOperation {
  func add(_ number1: Int, _ number2: Int) -> Double {
    Double(number1 + number2)
  }
}

class SubstractOperation {
  /// https://developer.apple.com/library/archive/documentation/Xcode/Reference/xcode_markup_formatting_ref/
  /**
    - parameters:
    - number1: 빼기 연산자의 왼쪽에 오는 수
    - number2: 빼기 연산자의 오른쪽에 오는 수
   */
  func minus(_ number1: Int, _ number2: Int) -> Double {
    Double(number1 - number2)
  }
}

class MultiplyOperation {
  func multiply(_ number1: Int, _ number2: Int) -> Double {
    Double(number1 * number2)
  }
}

class DivideOperation {
  func divide(_ number1: Int, _ number2: Int) -> Double {
    
    guard number2 != 0 else {
      return 0.0
    }
    
    return Double(number1) / Double(number2)
  }
}

class Calculator {
  let addOperation = AddOperation()
  let substractOperation = SubstractOperation()
  let multiplyOperation = MultiplyOperation()
  let divideOperation = DivideOperation()
  
  func operate(_ operator: OperatorType, _ number1: Int, _ number2: Int) -> Double {
    switch `operator` {
    case .add:
      return addOperation.add(number1, number2)
    case .substract:
      return substractOperation.minus(number1, number2)
    case .multiply:
      return multiplyOperation.multiply(number1, number2)
    case .divide:
      return divideOperation.divide(number1, number2)
    }
  }
}

enum OperatorType {
  case add
  case substract
  case multiply
  case divide
}

let calculator = Calculator() // 인스턴스 생성하여 변수에 할당

calculator.operate(.add, 1, 2)           // 3
calculator.operate(.substract, 1, 2)     // -1
calculator.operate(.multiply, 3, 5)      // 15
calculator.operate(.divide, 1, 3)        // 0.333333