[내일배움캠프 7일차] 2주차 계산기 만들기 Lv 2, Lv3

NH·2025년 3월 11일

내일배움캠프

목록 보기
7/62
post-thumbnail

🧮 2주차 과제: Swift를 사용하여 계산기 만들기

🟠 필수 구현 기능

Lv1

  • 더하기, 빼기, 나누기, 곱하기 연산을 수행할 수 있는 Calculator 클래스를 만들기
  • 생성한 클래스를 이용하여 연산을 진행하고 출력
  • 오류가 날 수 있는 ‘예외처리’ 상황에 대해 고민해보기
    • 구현을 할 수 없어도 괜찮아요! 다음 단계를 밟아가면서 준비하는 단계입니다.

Lv2

  • Lv1에서 만든 Calculator 클래스에 “나머지 연산”이 가능하도록 코드를 추가하고, 연산 진행 후 출력
  • ex) 나머지 연산 예시 : 6을 3으로 나눈 나머지는 0 / 5를 3으로 나눈 나머지는 2
  • 오류가 날 수 있는 ‘예외처리’ 상황에 대해 고민해보기 + 구현하기

Lv3 03/12 까지

  • 아래 각각의 클래스들을 만들고 클래스간의 관계를 고려하여 Calculator 클래스와 관계 맺기
    • AddOperation(더하기)
    • SubstractOperation(빼기)
    • MultiplyOperation(곱하기)
    • DivideOperation(나누기)
  • Calculator 클래스의 내부코드를 변경
    • 관계를 맺은 후 필요하다면 별도로 만든 연산 클래스의 인스턴스를 Calculator 내부에서 사용
  • Lv2 와 비교하여 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
    • hint. 클래스의 책임(단일책임원칙)

🟠 Lv2 구현

class Calculator {
    // 더하기
    func add(_ num1: Double, _ num2: Double) -> Double{
        return num1 + num2
    }
    
    // 빼기
    func sub(_ num1: Double, _ num2: Double) -> Double{
        return num1 - num2
    }
    
    // 곱하기
    func mul(_ num1: Double, _ num2: Double) -> Double{
        return num1 * num2
    }
    
    // 나누기
    func div(_ num1: Double, _ num2: Double) -> Double? {
        // guard 구문을 사용하여 0일때 예외처리
        guard num2 != 0 else {
            print("Error : 0으로 나눌 수 없습니다.")
            return nil
        }
        return num1 / num2
    }
    
    // Lv2 나머지 연산 추가
    func remainder(_ num1: Int, _ num2: Int) -> Int? {
        // guard 구문을 사용하여 0일때 예외처리
        guard num2 != 0 else {
            print("Error : 0으로 나머지 연산을 수행할 수 없습니다.")
            return nil
        }
        return num1 % num2
    }
}

🔹 나머지 연산 기능 추가

  • 메소드 remainder 추가하여 나머지 연간 기능 구현
    func remainder(_ num1: Int, _ num2: Int) -> Int? {
           // guard 구문을 사용하여 0일때 예외처리
           guard num2 != 0 else {
               print("Error : 0으로 나머지 연산을 수행할 수 없습니다.")
               return nil
           }
           return num1 % num2
       }

🔹 예외처리 구현하기

  • guard 문을 사용하여 예외처리 구현
  • 나눗셈과 마찬가지로 나머지 연산도 0으로 나눌 수 없기 때문에 예외 처리
    func remainder(_ num1: Int, _ num2: Int) -> Int? {
           // guard 구문을 사용하여 0일때 예외처리
           guard num2 != 0 else {
               print("Error : 0으로 나머지 연산을 수행할 수 없습니다.")
               return nil
           }
           return num1 % num2
       }

🔹 어려웠던 점

  • 나머지 연산은 Double 타입에서 되지 않았다

  • Int 타입으로 변경하여 처리 했다.


🟠 Lv3 구현

class Calculator {
   // Lv3 클래스 관계 맺기
   let addOperation: AddOperation = AddOperation()
   let substractOperation: SubstractOperation = SubstractOperation()
   let multiplyOperation: MultiplyOperation = MultiplyOperation()
   let divideOperation: DivideOperation = DivideOperation()

   
   // Lv2 나머지 연산 추가
   func remainder(_ num1: Int, _ num2: Int) -> Int? {
       guard num2 != 0 else {
           print("Error : 0으로 나머지 연산을 수행할 수 없습니다.")
           return nil
       }
       return num1 % num2
   }
}

// Lv3 클래스 추가
class AddOperation {
   func add(_ num1: Double, _ num2: Double) -> Double{
       return num1 + num2
   }
}

class SubstractOperation {
   func sub(_ num1: Double, _ num2: Double) -> Double{
       return num1 - num2
   }
}

class MultiplyOperation {
   func mul(_ num1: Double, _ num2: Double) -> Double{
       return num1 * num2
   }
}

class DivideOperation {
   func div(_ num1: Double, _ num2: Double) -> Double? {
       // guard 구문을 사용하여 0일때 예외처리
       guard num2 != 0 else {
           print("Error : 0으로 나눌 수 없습니다.")
           return nil
       }
       return num1 / num2
   }
}


let calculator = Calculator()

print("1. 사직연산 결과")

let sumReult = calculator.addOperation.add(11.2, 9.8)
print(" 더하기 결과:", sumReult) //  더하기 결과: 21.0

let differenceResult = calculator.substractOperation.sub(1.4, 8.5)
print(" 빼기 결과:", differenceResult) // 빼기 결과: -7.1

let productResult = calculator.multiplyOperation.mul(3.3, 5.6)
print(" 곱하기 결과:", productResult) // 곱하기 결과: 18.479999999999997

if let quotientResult1 = calculator.divideOperation.div(96.4, 22) {
   print(" 나누기 결과:", quotientResult1) // 나누기 결과: 4.381818181818182
}

// Lv1 예외 상황: num2가 0일 때
print("\n2. 나눗셈 예외상황 처리 확인")

if let quotientResult2 = calculator.divideOperation.div(10, 0) {
   print(" 나누기 결과:", quotientResult2) // 실행 안 됨 (에러 메시지만 출력)
}


// Lv2 나머지 연산 테스트
print("\n3. 나머지 연산 테스트")

if let result = calculator.remainder(6, 3) {
   print(" > 나머지 연산: \(result)") // 0
}

if let result = calculator.remainder(5, 3) {
   print(" > 나머지 연산: \(result)") // 2
}

// Lv2 예외처리 테스트
print("\n4. 나머지 연산 예외상황 처리 확인")

if let result = calculator.remainder(6, 0) {
   print(" > 나머지 연산: \(result)") // 실행되지 않음 (에러 메시지 출력)
}

🔹 연산 기능을 각각의 Class로 분리

class AddOperation {
   func add(_ num1: Double, _ num2: Double) -> Double{
       return num1 + num2
   }
}

class SubstractOperation {
   func sub(_ num1: Double, _ num2: Double) -> Double{
       return num1 - num2
   }
}

class MultiplyOperation {
   func mul(_ num1: Double, _ num2: Double) -> Double{
       return num1 * num2
   }
}

class DivideOperation {
   func div(_ num1: Double, _ num2: Double) -> Double? {
       // guard 구문을 사용하여 0일때 예외처리
       guard num2 != 0 else {
           print("Error : 0으로 나눌 수 없습니다.")
           return nil
       }
       return num1 / num2
   }
}

🔹 클래스간의 관계를 고려하여 Calculator 클래스와 관계 맺기

class Calculator {
    // Lv3 클래스 관계 맺기
    let addOperation: AddOperation = AddOperation()
    let substractOperation: SubstractOperation = SubstractOperation()
    let multiplyOperation: MultiplyOperation = MultiplyOperation()
    let divideOperation: DivideOperation = DivideOperation()

    
    // Lv2 나머지 연산 추가
    func remainder(_ num1: Int, _ num2: Int) -> Int? {
        guard num2 != 0 else {
            print("Error : 0으로 나머지 연산을 수행할 수 없습니다.")
            return nil
        }
        return num1 % num2
    }
}
  • Calculator 클래스의 내부코드를 변경
    • 관계를 맺은 후 필요하다면 별도로 만든 연산 클래스의 인스턴스를 Calculator 내부에서 사용

🔹 Lv2 와 비교하여 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.

🤔 hint. 클래스의 책임(단일책임원칙)

  • Lv3에서 연산 기능에 대해 각각의 class로 분리
    • 연산 추가 시 Calculator Class 변경 없이 별도의 Class 추가하면 됨
    • 연산 수정 시, 해당 Class 수정하면 됨
  • 💡 Lv2에 비해서 유지보수확장성이 용이해짐
profile
iOS 개발 블로그

0개의 댓글