[250313] 계산기 만들기

ON&OFF·2025년 3월 14일

iOS TIL

목록 보기
4/18

1. 오늘 배운 것

계산기 과제 만들기를 진행했다.
lv1, 2까진 기본 문법들을 활용하여 큰 문제 없이 진행했다.

  • Lv1.

    • 더하기, 빼기, 나누기, 곱하기 연산을 수행할 수 있는 Calculator 클래스를 만들기
    • 생성한 클래스를 이용하여 연산을 진행하고 출력
class Calculator { // 계산기 과제        
    func add(a: Int, b: Int) -> Int { // 덧셈 함수
        return a+b
    }  
    func sub(a: Int, b: Int) -> Int { // 뺄셈 함수
        return a-b
    }    
    func mul(a: Int, b: Int) -> Int { // 곰셈 함수 
        return a*b
    }    
    func div(a: Int, b: Int) -> Int { // 나눗셈 함수
        return a/b
    }
}
let calculator = Calculator() // Calculator 클래스 타입의 인스턴스 생성
let addResult = calculator.add(a: 2, b: 5) // 생성된 인스턴스로 클래스의 함수를 호출하여 상수에 저장
let subResult = calculator.sub(a: 3, b: 1)
let mulResult = calculator.mul(a: 5, b: 3)
let divResult = calculator.div(a: 6, b: 2)
print("덧셈 결과 : \(addResult)") // 결과 출력
print("뺄셈 결과 : \(subResult)")
print("곱셈 결과 : \(mulResult)")
print("나눗셈 결과 : \(divResult)")
  • Lv2

    • Lv1에서 만든 Calculator 클래스에 “나머지 연산”이 가능하도록 코드를 추가하고, 연산 진행 후 출력
    • ex) 나머지 연산 예시 : 6을 3으로 나눈 나머지는 0 / 5를 3으로 나눈 나머지는 2
    • 오류가 날 수 있는 ‘예외처리’ 상황에 대해 고민해보기 + 구현하기
      class Calculator { // 계산기 과제
        func add(a: Int, b: Int) -> Int { // 덧셈 함수
            return a+b
        }    
        func sub(a: Int, b: Int) -> Int { // 뺄셈 함수
            return a-b
        }    
        func mul(a: Int, b: Int) -> Int { // 곰셈 함수
            return a*b
        }    
        func div(a: Int, b: Int) -> Int? { // 나눗셈 함수      
            if b == 0 { // 0으로 나눴을 경우 예외 처리
                print("0으로 나눌 수 없습니다.")
                return nil
            }
            return a/b
        }  
        func rem(a: Int, b: Int) -> Int? { // 나머지 값 연산 함수      
            if b == 0 { // 0으로 나눴을 경우 예외 처리
                print("0으로 나눌 수 없습니다.")
                return nil
            }
            return a%b
        }
      }
      let calculator = Calculator() // Calculator 클래스 타입의 인스턴스 생성
      let addResult = calculator.add(a: 2, b: 5) // 생성된 인스턴스로 클래스의 함수를 호출하여 상수에 저장
      let subResult = calculator.sub(a: 3, b: 1)
      let mulResult = calculator.mul(a: 5, b: 3)
      let divResult = calculator.div(a: 6, b: 2)
      let remResult = calculator.rem(a: 5, b: 3)
      print("덧셈 결과 : \(addResult)") // 결과 출력
      print("뺄셈 결과 : \(subResult)")
      print("곱셈 결과 : \(mulResult)")
      print("나눗셈 결과 : \(divResult)")
      print("나머지 연산 결과 : \(remResult)")

2. 배우며 겪은 문제점

그런데 Lv3에서 클래스를 분리하라는 문제에서 막혔다.
계산기 클래스는 계산만, 실제 연산은 연산 클래스를 별도로 만들어 진행해야 한다는 개념은 자바에서 공부한 적이 있어 알고 있었지만 어떻게 구현해야 하는지 문법이 아직 생소해서 생각처럼 잘 되지 않았다.
구글링과 강의의 도움을 받아 완성할 수 있게 되었다.

  • Lv3

    • 아래 각각의 클래스들을 만들고 클래스간의 관계를 고려하여 Calculator 클래스와 관계 맺기
      • AddOperation(더하기)
      • SubtractOperation(빼기)
      • MultiplyOperation(곱하기)
      • DivideOperation(나누기)
    • Calculator 클래스의 내부코드를 변경
      • 관계를 맺은 후 필요하다면 별도로 만든 연산 클래스의 인스턴스를 Calculator 내부에서 사용
    • Lv2 와 비교하여 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
      • hint. 클래스의 책임(단일책임원칙)
    class Calculator { // 계산기 과제
    let addOperation = AddOperation() // 덧셈 클래스 타입으로 인스턴스 생성
    let substractOperation = SubstractOperation() // 뺄셈 클래스 타입으로 인스턴스 생성
    let multiplyOperation = MultiplyOperation() // 곱셈 클래스 타입으로 인스턴스 생성
    let divideOperation = DivideOperation() // 나눗셈 클래스 타입으로 인스턴스 생성
    let remainderOperation = RemainderOperation() // 나머지 연산 클래스 타입으로 인스턴스 생성   
    func add(a: Int, b: Int) -> Int { // 덧셈 클래스 타입의 인스턴스를 사용하여 덧셈 연산 처리
        return addOperation.add(a: a, b: b)
    }
    func sub(a: Int, b: Int) -> Int { // 뺄셈 클래스 타입의 인스턴스를 사용하여 뺼셈 연산 처리
        return substractOperation.sub(a: a, b: b)
    }    
    func mul(a: Int, b: Int) -> Int { // 곱셈 클래스 타입의 인스턴스를 사용하여 곱셈 연산 처리
        return multiplyOperation.mul(a: a, b: b)
    }    
    func div(a: Int, b: Int) -> Int? { // 나눗셈 클래스 타입의 인스턴스를 사용하여 나눗셈 연산 처리
        return divideOperation.div(a: a, b: b)
    }   
    func rem(a: Int, b: Int) -> Int? { // 나머지 연산 클래스 타입의 인스턴스를 사용하여 나머지 연산 처리
        return remainderOperation.rem(a: a, b: b)
    }    
}
class AddOperation { // 덧셈 클래스
    func add(a: Int, b: Int) -> Int { // 덧셈 함수
        return a+b
    }
}
class SubstractOperation { // 뺄셈 클래스
    func sub(a: Int, b: Int) -> Int { // 뺄셈 함수
        return a-b
    }
}
class MultiplyOperation { // 곱셈 클래스
    func mul(a: Int, b: Int) -> Int { // 곰셈 함수
        return a*b
    }
}
class DivideOperation { // 나눗셈 클래스
    func div(a: Int, b: Int) -> Int? { // 나눗셈 함수        
        if b == 0 { // 0으로 나눴을 경우 예외 처리
            print("0으로 나눌 수 없습니다.")
            return nil
        }
        return a/b
    }
}
class RemainderOperation { // 나머지 연산 클래스
    func rem(a: Int, b: Int) -> Int? { // 나머지 값 연산 함수       
        if b == 0 { // 0으로 나눴을 경우 예외 처리
            print("0으로 나눌 수 없습니다.")
            return nil
        }
        return a%b
    }
}
let calculator = Calculator() // Calculator 클래스 타입의 인스턴스 생성
let addResult = calculator.add(a: 2, b: 5) // 생성된 인스턴스로 클래스의 함수를 호출하여 상수에 저장
let subResult = calculator.sub(a: 3, b: 1)
let mulResult = calculator.mul(a: 5, b: 3)
let divResult = calculator.div(a: 6, b: 2)
let remResult = calculator.rem(a: 5, b: 3)
print("덧셈 결과 : \(addResult)") // 결과 출력
print("뺄셈 결과 : \(subResult)")
print("곱셈 결과 : \(mulResult)")
print("나눗셈 결과 : \(divResult)")
print("나머지 연산 결과 : \(remResult)")

3. 느낀 점

  • 역시 기초 문법이 중요하다는 걸 다시금 느꼈고 강의를 진행하며 알게 된 옵셔널, 클로저 같은 타 언어와 비슷하지만 새로운 문법들이 아직 낯설기 때문에 더 확실하게 공부해야겠다는 생각이 들었다.

4. 다음에 진행할 것

  • 기존 문법 복습과 새로운 강의들을 듣고 개념을 정리할 계획이다.
profile
안 되면 될 때까지

0개의 댓글