나만의 계산기 만들기 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
'iOS 앱 개발자 프로젝트 > 개인 프로젝트' 카테고리의 다른 글
[Project] 숫자 야구 게임 만들기 (Lv1) (0) | 2024.03.12 |
---|---|
[Project] 숫자 야구 게임 만들기(Lv1-6) (0) | 2024.03.11 |
[Project] #3 나만의 계산기 만들기(Lv2) (0) | 2024.03.06 |
[Project] #2 나만의 계산기 만들기(Lv1) (2) | 2024.03.05 |
[Project] #1 나만의 계산기 만들기(Lv1-4) (0) | 2024.03.05 |