나만의 계산기 만들기
계산기 기능을 구현하는 문법 기초 과제를 진행하며 지금까지 배웠던 swift 문법을 응용해서 만들어보았다.
Lv1~Lv4까지 단계 별로 기능을 추가하며 만들어야 한다.
아래는 레벨별로 구현해야 하는 기능이다.
☑️ Lv1
- 더하기, 빼기, 나누기, 곱하기 연산을 수행할 수 있는 Calculator 클래스를 만들기
- 생성한 클래스를 이용하여 연산을 진행하고 출력
☑️ Lv2
- Lv1에서 만든 Calculator 클래스에 “나머지 연산”이 가능하도록 코드를 추가하고, 연산 진행 후 출력
- ex) 나머지 연산 예시 : 6을 3으로 나눈 나머지는 0 / 5를 3으로 나눈 나머지는 2
☑️ Lv3
- 각각의 클래스들을 만들고 클래스간의 관계를 고려하여 Calculator 클래스와 관계 맺기
- AddOperation(더하기)
- SubstractOperation(빼기)
- MultiplyOperation(곱하기)
- DivideOperation(나누기)
- Calculator 클래스의 내부코드를 변경
- 관계를 맺은 후 필요하다면 별도로 만든 연산 클래스의 인스턴스를 Calculator 내부에서 사용
- Lv2와 비교하여 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
- hint. 클래스의 책임(단일책임원칙)
☑️ Lv4: (선택 구현 기능 (힌트 : 추상 클래스 패턴, 인터페이스 활용)
- AbstractOperation라는 추상화된 클래스를 만들기
- 기존에 구현한 AddOperation(더하기), SubtractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 클래스들과 관계를 맺고 Calculator 클래스의 내부 코드를 변경
- 스위프트의 어떤 문법을 이용하여 추상화할 수 있을지 생각해 봅시다
- Lv3 와 비교해서 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
- hint. 클래스간의 결합도, 의존성(의존성역전원칙)
🧑🏻🏫 튜터님 피드백
🔧 수정한 부분
- 입력 Parameter Type ➡️ Int로 변경
- DivideOperation ➡️ 0으로 나눌 때 예외 처리
- Class의 상속 ➡️Protocol 사용
🫡 회고
요구사항이 정해져 있어서 코드 구성에 있어 어려움을 느끼진 않았다.
인턴경험을 하면서 계산기 과제를 진행한 적이 있었는데 그때 고민했던 경험이 이번 과제에도 도움이 되었다.
또한 생각 못했던 수정사항들을 업데이트해서 Commit하여 다시 올렸다! 강의 듣는 것보다 과제를 진행하며 혼자 문제 해결하는 게 공부에 더 도움이 많이 되는 것 같다.
⚙️ 전체 코드
Calculator
import UIKit
// MARK: - Swift 문법 기초 과제 - 계산기 Lv4
// 힌트 : 추상화
class Calculator {
// 하나의 프로퍼티를 갖도록 초기화
var operation: AbstractOperation?
// 옵셔널 타입이기 때문에 자동으로 nil로 초기화
// 프로퍼티의 값을 변경하는 함수 구현
func setOperation(_ operation: AbstractOperation) {
self.operation = operation
}
func calculate(_ firstNumber: Int, _ secondNumber: Int) -> Double? {
guard let operation = operation else {
return nil
}
return operation.calculate(firstNumber, secondNumber)
}
}
Opearation
// 프로토콜 사용
protocol AbstractOperation {
// 연산을 수행하는 함수
func calculate(_ firstNumber: Int,_ secondNumber: Int) -> Double
}
class AddOperation: AbstractOperation {
// 함수 override
func calculate(_ firstNumber: Int, _ secondNumber: Int) -> Double {
Double(firstNumber + secondNumber)
}
}
class SubtractOperation: AbstractOperation {
/**
- parameters:
- firstNumber: 빼기 연산자의 왼쪽에 오는 수
- secondNumber: 빼기 연산자의 오른쪽에 오는 수
*/
// 함수 override
func calculate(_ firstNumber: Int, _ secondNumber: Int) -> Double {
Double(firstNumber - secondNumber)
}
}
class MultiplyOperation: AbstractOperation {
// 함수 override
func calculate(_ firstNumber: Int, _ secondNumber: Int) -> Double {
Double(firstNumber * secondNumber)
}
}
class DivideOperation: AbstractOperation {
// 함수 override
func calculate(_ firstNumber: Int, _ secondNumber: Int) -> Double {
// 예외처리
guard secondNumber != 0 else { return 0 }
return Double(firstNumber) / Double(secondNumber)
}
}
Test(Main)
func testLv4() {
let calculator = Calculator() // (덧셈 기능하도록 초기화)
calculator.setOperation(AddOperation())
let addResult = calculator.calculate(3, 5)
print("addResult : \(addResult)")
// calculator에 뺄셈 기능하도록 프로퍼티 변경함수 호출
calculator.setOperation(SubtractOperation())
let subtractResult = calculator.calculate(3, 5) // 뺄셈 연산
print("subtractResult : \(subtractResult)")
// calculator에 곱셈 기능하도록 프로퍼티 변경함수 호출
calculator.setOperation(MultiplyOperation())
let multiplyResult = calculator.calculate(3, 5) // 곱셈 연산
print("multiplyResult : \(multiplyResult)")
// calculator에 나눗셈 기능하도록 프로퍼티 변경함수 호출
calculator.setOperation(DivideOperation())
let divideResult = calculator.calculate(1, 3) // 나눗셈 연산
print("divideResult : \(divideResult)")
}
testLv4()
'TIL✏️' 카테고리의 다른 글
[iOS] Swift로 TodoList App 만들기 (4) | 2024.03.26 |
---|---|
[Swift] 숫자 야구 게임 (1) | 2024.03.18 |
[WIL] 스린이들 - KPT회고 (2) | 2024.03.06 |
[TIL] 스린이들 - 개발 진행 기록(1) (2) | 2024.02.27 |
[내일배움캠프] iOS 앱 트랙 과정 참여 (3) | 2024.01.25 |