1. 개요
간단한 계산기 앱을 구현하게 되었다.
세가지 단계로 나뉘어 있었지만, 결국 종합해보면 다음과 같았다.
조건은 아래와 같다.
- 더하기 빼기 곱하기 나누기 등 연산을 구현할 수 있는 Calculator class를 만들어서 결과 출력
- 그리고 더하기 빼기 등등의 연산을 따로 class로 빼서 Calculator class와 관계맺기
- 결국 계산을 하는 Calculator클래스와 각각의 연산을 담당하는 부분을 별도의 class로 분리함
- 프로토콜을 사용하여 추상화 하기
먼저 완성된 전체 코드를 보자
// 추상화
protocol Operation {
func result(num1: Double, num2: Double) -> Double
}
// 덧셈 연산
class AddOperation: Operation {
func result(num1: Double, num2: Double) -> Double {
let addResult = num1 + num2
return addResult
}
}
// 뺄셈 연산
class SubstractOperation: Operation {
func result(num1: Double, num2: Double) -> Double {
let minusResult = num1 - num2
return minusResult
}
}
// 곱셈 연산
class MultiplyOperation: Operation {
func result(num1: Double, num2: Double) -> Double {
let multiplyResult = num1 * num2
return multiplyResult
}
}
// 나눗셈 연산
class DivisionOperation: Operation {
func result(num1: Double, num2: Double) -> Double {
let divisionResult = num1 / num2
return divisionResult
}
}
// 나머지 연산
// 예외처리로 if문 사용함
class ModulusOperation {
func result(num1: Double, num2: Double) -> Double {
if num2 == 0 {
print("0은 나머지를 구할 수 없습니다.")
}
let modulusResult = num1.truncatingRemainder(dividingBy: num2)
//타입이 Double이라 %대신 truncatingRemainder사용.
return modulusResult
}
}
// 위의 연산들을 사용한 계산기
class Calculator {
let addOperation = AddOperation()
let substractOperation = SubstractOperation()
let multiplyOperation = MultiplyOperation()
let divisionOperation = DivisionOperation()
let modulusOperation = ModulusOperation()
func add(num1: Double, num2: Double) -> Double {
return addOperation.result(num1: num1, num2: num2)
}
func minus(num1: Double, num2: Double) -> Double {
return substractOperation.result(num1: num1, num2: num2)
}
func multiply(num1: Double, num2: Double) -> Double {
return multiplyOperation.result(num1: num1, num2: num2)
}
func division(num1: Double, num2: Double) -> Double {
return divisionOperation.result(num1: num1, num2: num2)
}
func modulus(num1: Double, num2: Double) -> Double {
return modulusOperation.result(num1: num1, num2: num2)
}
}
let calculator = Calculator()
print(calculator.add(num1: 10, num2: 20))
print(calculator.minus(num1: 10, num2: 20))
print(calculator.multiply(num1: 10, num2: 20))
print(calculator.division(num1: 20, num2: 10))
print(calculator.modulus(num1: 10, num2: 7))
2. 트러블슈팅
한가지의 문제와 한가지의 고민이 있었다.
2.1 한가지의 문제
나머지 연산을 구현할때 나머지 연산자(%)를 사용해도 구현이 되지 않았고 오류가 발생했다.
2.2 전개
나머지를 구하고자 할 때, 데이터 타입이 Int라면 단순히 나머지 연산자(%)만으로 구현이 가능하지만,
Double 타입으로 구현할때는, truncatingRemainder 문법을 사용해야 한다는 것을 알게되었음.
2.3 해결
값1.truncatingRemainder(dividingBy: 값2)
let num1:Double = 10
let num2:Double = 7
print(num1.truncatingRemainder(dividingBy: num2))
// Int
func intType(num1: Int, num2:Int) -> Int {
let intTypeResult = num1 % num2
return intTypeResult
}
print(intType(num1: 10, num2: 7)) //3
//Double
func doubleType(num1: Double, num2: Double) -> Double {
let doubleTypeResult = num1.truncatingRemainder(dividingBy: num2)
return doubleTypeResult
}
print(doubleType(num1: 10, num2: 7)) //3
Double 타입일 경우 나머지를 구하는 방법은 아래글에 자세히 나와있다.
truncatingRemainder문법을 사용하여 Double 타입에서도 나머지를 구할 수 있게 되었다.
3. 한가지의 고민
코드를 구현하던 중, 두가지의 방식이 떠올랐고, 그 차이점에 대해서 고민하고, 튜터님의 조언또한 참고하였다.
고민했던 코드는 아래와 같다.
// 1.
func result(num1: Double, num2: Double) -> Double {
return = num1 + num2
}
// 2.
func result(num1: Double, num2: Double) -> Double {
let addResult = num1 + num2
return addResult
}
3.1 해결 및 결론
1번을 선택한다면,
장점
- 상수를 따로 선언해서 값을 저장하고 리턴하는 2번의 코드와 다르게 메모리를 차지한다.
- 코드가 짧고 간결하다
단점
- 만약 수식이나 와야할 코드가 길다면 오히려 가독성이 떨어진다
- 가독성이 떨어짐으로 인해 다른 사람들이 내 코드를 볼때 이해하기 어렵다.
2번을 선택한다면,
장점
- 다른 사람들이 내 코드를 볼때 좀 더 이해하기 쉽다. 리턴값으로 무엇이 오는지 간결하게 알아볼 수 있다.
- 수식이나 와야할 코드가 짧다면, 좀 더 깔끔한 코드를 작성할 . 수있다.
단점
- 상수가 하나 늘어나므로 메모리를 상대적으로 조금 더 차지한다.
(다만 함수에 사용할 경우, 같은 경우 함수가 실행될때만 메모리를 차지하고 종료되기때문에 별 영향이 없다.)
- 위와같이 굉장히 짧은 코드가 올때는 오히려 가독성이 상대적으로 조금 떨어질 수도 있다.
결론
처음부터 읽기 좋은 코드를 작성하는 습관을 들이기 위해, 그리고 좀 더 정돈된 코드를 작성하기 위해 2번을 선택하였음.
'개발일지' 카테고리의 다른 글
깃허브와 PR, 목적지 경로 설정 (0) | 2024.11.25 |
---|---|
코드로 계산기 UI 만들기 (0) | 2024.11.22 |
첫번째 프로젝트 회고 (3) | 2024.10.25 |
Storyboard 에러해결 (Entry Point 없음) (1) | 2024.10.24 |
깃 사용법 배우다 (1) - 로컬 저장소 연결 (작성중) (0) | 2024.10.23 |
살아남는 iOS 개발자가 되기 위해 끊임없이 노력하고 있습니다.