🎯 Swift로 계산기 만들기
* 필수 구현기능(Lv1~Lv3)
Lv3
- 아래 각각의 클래스들을 만들고 클래스 간의 관계를 고려하여 Calculator 클래스와 관계 맺기
- AddOperation(더하기)
- SubtractOperation(빼기)
- MultiplyOperation(곱하기)
- DivideOperation(나누기)
- Calculator 클래스의 내부 코드를 변경
- 관계를 맺은 후 필요하다면 별도로 만든 연산 클래스의 인스턴스를 Calculator 내부에서 사용
- Lv2와 비교하여 어떠한 점이 개선되었는지 스스로 생각해 봅시다.
- hint. 클래스의 책임(단일 책임 원칙)
✅ 직접 구현해보기 - Lv3
class Calculator {
var num1: Double
var num2: Double
init(num1: Double, num2: Double) {
self.num1 = num1
self.num2 = num2
}
func result() -> Double? {
return nil
}
}
class AddOperation : Calculator {
override func result() -> Double? {
let result = num1 + num2
return result
}
}
class SubstractOperation : Calculator {
override func result() -> Double? {
let result = num1 - num2
return result
}
}
class MultiplyOperation : Calculator {
override func result() -> Double? {
let result = num1 * num2
return result
}
}
class DivideOperation : Calculator {
override func result() -> Double? {
if num1 == 0 || num2 == 0{
return nil
}
let result = num1 / num2
return result
}
}
class RemainderOperation : Calculator {
func resultMod() -> Int? {
if num1 == 0 || num2 == 0{
return nil
}
let result = Int(num1) % Int(num2)
return result
}
}
let add = AddOperation(num1: 2.3, num2: 3.2)
print(add.result()!)
let sub = SubstractOperation(num1: 4.5, num2: 3.0)
print(sub.result()!)
let mul = MultiplyOperation(num1: 10, num2: 4)
print(mul.result()!)
let div = DivideOperation(num1: 30, num2: 5)
print(div.result() ?? "0으로 나눌 수 없습니다.")
let div0 = DivideOperation(num1: 30, num2: 0) // 나누는 수가 0일 때 예외 처리 예시
print(div0.result() ?? "0으로 나눌 수 없습니다.")
let mod = RemainderOperation(num1: 10, num2: 3)
print(mod.resultMod() ?? "0으로 나눌 수 없습니다.")
let mod0 = RemainderOperation(num1: 10, num2: 0) // 나누는 수가 0일 때 예외 처리 예시
print(mod0.resultMod() ?? "0으로 나눌 수 없습니다.")
AddOperation(더하기) SubtractOperation(빼기) MultiplyOperation(곱하기) DivideOperation(나누기)
클래스를 만들었고, 나머지 연산을 수행하는 RemainderOperation(나머지) 클래스를 작성하였다.
관계를 맺은 후 필요하다면 별도로 만든 연산 클래스의 인스턴스를 Calculator 내부에서 사용
라는 조건이 있었는데 나는 시간이 부족하기도 하고 아직 Calculator 내부에서 인스턴스를 사용하는 방법을 잘 몰라서
Calculator 라는 부모 클래스를 만들고 나머지 5개의 자식 클래스에서 상속 받아 사용하는 방식으로 구현하였다.
추가로 mod 연산 시 0으로 나누지 못하게 예외처리를 추가하였다.
🎯 트러블 슈팅 1 - RemainderOperation 반환 타입
RemainderOperation 함수에서 동일하게 부모 class의 result 함수를 상속받아 사용하려고 했는데
나머지 연산의 결과를 Int형으로 출력하기 위해서는 함수의 반환 타입을 Int형으로 해야 하는데
부모 클래스의 result 함수의 반환타입은 Double로 선언해서 RemainderOperation 함수에서는 사용할 수 없었다.
그래서 생각한 방법은 result 함수를 상속받지 않고,
resultMod 함수를 새로 작성해서 사용하는 방법을 선택했다.
class Calculator { // 부모 클래스
var num1: Double
var num2: Double
init(num1: Double, num2: Double) {
self.num1 = num1
self.num2 = num2
}
func result() -> Double? {
return nil
}
}
class RemainderOperation : Calculator { // 자식 클래스 상속
func resultMod() -> Int? {
if num1 == 0 || num2 == 0{
return nil
}
let result = Int(num1) % Int(num2)
return result
}
}
✓ TIL
- 널 병합 연산자 사용
- 옵셔널 타입 이해하기
- 클래스 상속
'스파르타 코딩 클럽 - iOS 스타터 6기 > 본 캠프' 카테고리의 다른 글
15. 스파르타 코딩 클럽 - 옵셔널 언래핑 (0) | 2025.03.17 |
---|---|
14. 스파르타 코딩 클럽 - 옵셔널 (1) | 2025.03.17 |
12. 스파르타 코딩 클럽 - 열거형 (Enum) (1) | 2025.03.13 |
11. 스파르타 코딩 클럽 - 클로저 (Closure) (0) | 2025.03.12 |
10. 스파르타 코딩 클럽 - 프로그래밍 기초 주차 과제 Lv1, Lv2 (1) | 2025.03.12 |