내일배움캠프 iOS

iOS) TIL #9 2주차 과제 - 계산기 코드 구현하기

yjuni22 2024. 10. 31. 14:29

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

 

GitHub - bryjna07/calculator

Contribute to bryjna07/calculator development by creating an account on GitHub.

github.com


< Lv 1 >

연산 가능한 클래스 만들기

진행 상황

https://github.com/bryjna07/calculator/commit/0132f97033c00672bdb5ff779cc65ba5abbadb48

 

[feat] 계산기 만들기 · bryjna07/calculator@0132f97

Youngjin committed Oct 30, 2024

github.com

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 는 추후에 ..