https://teamsparta.notion.site/Ch-1-1292dc3ef514805fad4be1b113588fa7
- 프로그래밍 기초 주차 과제 - Swfit로 계산기 만들기
필수 구현 기능 Lv1 ~ 3.
< Lv 1 >
- 더하기, 빼기, 나누기, 곱하기 연산을 수행할 수 있는 Calculator 클래스를 만들기
- 생성한 클래스를 이용하여 연산을 진행하고 출력하기
- 오류가 날 수 있는 '예외처리' 상황에 대해 고민해보기
< Lv 2 >
- Lv1에서 만든 Calculator 클래스에 “나머지 연산”이 가능하도록 코드를 추가하고, 연산 진행 후 출력
- 오류가 날 수 있는 '예외처리' 상황 고민해보기 + 구현해보기
< Lv 3 >
- 아래 각각의 클래스들을 만들고 클래스간의 관계를 고려하여 Calculator 클래스와 관계 맺기
- AddOperation(더하기)
- SubstractOperation(빼기)
- MultiplyOperation(곱하기)
- DivideOperation(나누기) - Calculator 클래스의 내부코드를 변경하기
- 관계를 맺은 후 필요하다면 별도로 만든 연산 클래스의 인스턴스를 Calculator 내부에서 사용!
(Lv2 와 비교하여 어떠한 점이 개선 되었는지 스스로 생각해 보기 - hint. 클래스의 책임(단일책임원칙))
선택 구현 기능 (힌트: 추상화)
< Lv 4 >
- AbstractOperation라는 추상화된 프로토콜 만들기
- 기존에 구현한 AddOperation(더하기), SubtractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 클래스들과 관계를 맺고 Calculator 클래스의 내부 코드를 변경
- 스위프트의 어떤 문법을 이용하여 추상화할 수 있을지 생각해 봅시다
- Lv3 와 비교해서 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
- hint. 클래스간의 결합도, 의존성(의존성역전원칙)
< Lv 0 >
Github 연결하기
진행 내용 : 깃허브 레포지토리 생성 -> 소스트리 내 클론하여 폴더 생성 -> 계산기 플레이그라운드 파일 생성
https://github.com/bryjna07/calculator
< Lv 1 >
연산 가능한 클래스 만들기
진행 상황
https://github.com/bryjna07/calculator/commit/0132f97033c00672bdb5ff779cc65ba5abbadb48
class Calculator {
// Todo : 내부 구현하기
var firstNumber: Double
var secondNumber: Double
init(firstNumber: Double, secondNumber: Double) {
self.firstNumber = firstNumber
self.secondNumber = secondNumber
}
// 더하기
func add() -> Double {
return firstNumber + secondNumber
}
//빼기
func subtract() -> Double {
return firstNumber - secondNumber
}
//곱하기
func multiply() -> Double {
return firstNumber * secondNumber
}
//나누기
func divide() -> Double {
return firstNumber / secondNumber
}
}
let addition = Calculator(firstNumber: 3, secondNumber: 6)
print(addition.add())
1. 클래스와 연산 메소드를 구현하였으나 부족한 점이 많아보임.
- 인스턴스 변수명 num1, num2 로 간략하게 변경, opp (opperator) 추가
2. 부족한 것이 무엇인가 찾기 ⭐️
- 메소드의 리턴? 을 Double 로 할 시 nil 에 대한 대처가 안될 수도 있음 ? -> Double? 로 변경
- 1, 4 번 문제해결 3, 5 문제 고민중
3. 클래스 인스턴스 생성, 초기화 방법이 올바른 것인가 궁금함
- 프로퍼티 수정함(Lv3단계에서)
4. 여러개의 메소드는 문제가 없는 것인가
- 메소드 내 switch 문과 opp를 이용하여 중복되는 메소드를 축약시킴
5. %, 나머지 연산자는 어떻게 할 것인가
- 아직 고민중 (Lv2 에서 추가)
6, 예외 상황 처리 고민해보기 ( ex. 나누기의 경우 0으로 나눌 때는 어떻게 처리할 것인지 )
- 나누기의 경우 케이스 내에 guard 문을 통해 num2가 0이 아닌지 판별하여 나누기를 진행하고, 0일 시 나눌 수 없습니다 라는 멘트와 함께 nil 로 반환시킴
< Lv 2 >
나머지 연산자 추가, 예외처리
5. %, 나머지 연산자는 어떻게 할 것인가
나머지 연산자의 경우 num1, num2 두 수 모두 정수형일 경우에만 가능하다고 함.
- 해결방안
오류 내용을 살펴보면 truncatingRemainder 를 사용하라고 하는데 검색해 보면,
truncatingRemainder(dividingBy:) 이라는 메소드 라고 하고 Double 값의 나머지를 반환하는 함수라고 한다
< Lv 3 >
각각의 연산에 따른 클래스 생성 및 관계 맺기
각각의 연산마다 클래스를 새로 만들어 보았다.
- 위 클래스와의 관계를 고려한다는 것은 무엇일까?
- Caculaor 클래스의 코드를 어떻게 변경하면 좋을까?
기존프로퍼티 삭제 (사용시 깔끔, 편리함), 연산클래스 프로퍼티 추가, 생성자 추가
- 아래의 메소드를 위에 포함시켜서 사용하는 방법은 무엇일까?
( 깔끔하게 정리한다는것? ) -> Calculator().addOperation.calculator(x,y,"+") 로 사용이 가능하도록
- 객체지향 5대 원칙은 무엇인가?
https://youtube.com/playlist?list=PLDV-cCQnUlIZcWXE4PrxJx6U3qKfRTJcK
- 단일책임 원칙 SRP
하나의 객체에 너무 많은 책임이 물려있을 경우, 프로젝트에서 해당 객체의 의존성이 높아지게 된다.
이러한 현상은 객체지향의 주요 특징 중 하나인 캡슐화를 정면으로 부정한다.
그뿐만이 아니라, 각자의 코드가 서로 의존될 경우,
코드 수정에 따른 영향도 역시 높아지고, 범위 또한 넓어진다.
Calculator 클래스 내부에서 사용하려면?
-> 클래스에 프로퍼티 추가
Lv 4 는 추후에 ..
'내일배움캠프 iOS' 카테고리의 다른 글
iOS) TIL #11 프로토콜(Protocol) (4) | 2024.11.04 |
---|---|
iOS) TIL #10 확장 (extension) (0) | 2024.11.01 |
iOS) TIL #8 학습법 및 알고리즘 특강 (0) | 2024.10.30 |
iOS) TIL #7 swift 기본 문법 공부(상속,재정의) (1) | 2024.10.29 |
iOS) TIL #6 swift 기초+기본 문법 공부 (조건문, 클래스/구조체) (0) | 2024.10.28 |