[내일배움캠프 6일차] 2주차 계산기 만들기 Lv 1

NH·2025년 3월 10일

내일배움캠프

목록 보기
6/62
post-thumbnail

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

과제 내용: Swift 기본 문법을 사용하여 나만의 계산기 만들기


필수 기능 구현

Lv 1

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

Lv 2

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

Lv 3

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

도전 기능 구현: 선택 구현 기능 (힌트 : 추상화)

Lv 4

- [ ]  AbstractOperation라는 **추상화된** 프로토콜 만들기
- [ ]  기존에 구현한 AddOperation(더하기), SubtractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 클래스들과 관계를 맺고 Calculator 클래스의 내부 코드를 변경
- [ ]  스위프트의 어떤 문법을 이용하여 추상화할 수 있을지 생각해 봅시다
  • Lv3 와 비교해서 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
    • hint. 클래스간의 결합도, 의존성(의존성역전원칙)

Lv1 구현

목표

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

1. Calculator class 구현

class Calculator {
   // 더하기
   func add(_ num1: Int, _ num2: Int) {
       print("num1 + num2 = ", num1 + num2)
   }
   
   // 빼기
   func sub(_ num1: Int, _ num2: Int) {
       print("num1 - num2 = ", num1 - num2)
   }
   
   // 곱하기
   func mul(_ num1: Int, _ num2: Int) {
       print("num1 * num2 = ", num1 * num2)
   }
   
   // 나누기
   func div(_ num1: Int, _ num2: Int) {
       print("num1 / num2 = ", num1 / num2)
   }
}

2. 사칙연산 테스트

let calculator = Calculator() // 인스턴스 생성하여 변수에 할당

calculator.add(10, 5) // 10 + 5 =  15
calculator.sub(2, 7) // 2 - 7 =  -5
calculator.mul(3, 9) // 3 * 9 =  27
calculator.div(6, 4) // 6 / 4 =  1

위 코드로 인해 아래의 목표를 완료했다.

  • 더하기, 빼기, 나누기, 곱하기 연산을 수행할 수 있는 Calculator 클래스를 만들기
  • 생성한 클래스를 이용하여 연산을 진행하고 출력

예외 항목 찾기

나머지 목표를 완료하기 위해 예외처리 항목을 찾아보았다.

  • 나누기는 0으로 나눌 수 없다.
  • num2가 0일때의 예외 처리를 해야된다.
class Calculator {
    // 더하기
    func add(_ num1: Int, _ num2: Int) {
        print("\(num1) + \(num2) = ", num1 + num2)
    }
    
    // 빼기
    func sub(_ num1: Int, _ num2: Int) {
        print("\(num1) - \(num2) = ", num1 - num2)
    }
    
    // 곱하기
    func mul(_ num1: Int, _ num2: Int) {
        print("\(num1) * \(num2) = ", num1 * num2)
    }
    
    // 나누기
    func div(_ num1: Int, _ num2: Int) {
        // guard를 사용하여 예외처리
        guard num2 != 0 else {
            return print("Error : 0으로 나눌 수 없습니다.")
        }
        print("\(num1) / \(num2) = ", num1 / num2)
    }
}
// 예외처리 테스트
calculator.div(6, 0) // 실행 안 됨 (에러 메시지만 출력)

위 코드들을 사용해 모든 목표를 완료했다.

달성 목표

  • 더하기, 빼기, 나누기, 곱하기 연산을 수행할 수 있는 Calculator 클래스를 만들기
  • 생성한 클래스를 이용하여 연산을 진행하고 출력
  • 오류가 날 수 있는 ‘예외처리’ 상황에 대해 고민해보기

코드 수정

  • 작성한 코드에서 수정할 부분이 생겨 수정 진행

1️⃣ 메소드 print 방식 VS return 방식

🔹 장점

  • 단순하고 직관적이며, 결과를 바로 출력할 수 있음.
  • 사용자가 별도로 print()를 호출할 필요 없음.

🔸 단점

  • 유연성이 부족함 → 계산 결과를 저장하거나, 다른 곳에서 활용하기 어려움.
  • 함수의 역할이 모호해짐 → 계산 기능 + 출력 기능을 동시에 수행하고 있음.
    (→ 단일 책임 원칙(SRP) 위반 가능성이 있음)

return 방식

🔹 장점

  • 결과 값을 활용할 수 있음 → 단순 출력뿐만 아니라, 다른 연산에 활용 가능.
  • 함수의 역할이 명확함 → "계산"만 하고, "출력"은 호출하는 쪽에서 처리.
    (→ 단일 책임 원칙을 지킬 수 있음)
  • 테스트하기 쉬움 → 예를 들어 XCTest를 활용해 단위 테스트할 때 return이 있으면 검증이 쉬움.

🔸 단점

  • print()를 별도로 호출해야 하므로, 즉시 결과를 출력하는 게 아니라면 추가 코드가 필요함.

결론: 어떤 방식이 더 좋을까?

  • 확장성과 유지보수를 고려하면 return 방식이 더 좋음
    (계산과 출력이 분리되면, 결과를 저장하거나 다른 곳에서 활용 가능)
  • 실제 iOS 앱 개발에서는 return을 사용하는 것이 일반적
    (예: ViewController에서 연산 결과를 받아서 UI 업데이트하는 경우)

따라서 코드를 print 방식 -> return 방식으로 수정했다.

2️⃣ 오류 발생: 옵셔널 타입

  • return nil 구문에 오류가 발생했다.
  • 이유는 반환 타입이 Double인데 반환값에 nil이 있어서 그렇다.

오류 해결

  • 오류를 해소하기 위해 메소드의 반환 타입은 옵셔널 타입인 Double?이 되어야 된다.

3️⃣ 새로운 오류: 옵셔널 언래핑

  • 위 사진처럼 나누기 결과 쪽에 경고문이 생겼다.
  • 실행은 잘 되지만 결과 값에 Optional(3.0)으로 나온다.
  • 이유는 아까 처리한 옵셔널 타입 때문이다.

오류 해결

  • if let을 사용해 옵셔널 언래핑을 해주었다.

오늘의 회고

  • 간단한 계산기를 만드는데 여러가지를 배웠다.
  • 첫번째로는 메소드를 만들때 값을 return 하도록 해야 유지관리 및 확장성에 좋다는 것
  • 두번째로는 Swift의 옵셔널 처리 방법
    • 잘 몰라서 오랫동안 애먹었지만 if let을 이용해서 간단하게 언래핑 해주는 법도 익혔다.
profile
iOS 개발 블로그

0개의 댓글