[Project] 계산기 만들기①

JJOOEE__·2024년 6월 4일
0

Today I Learned....

목록 보기
4/19
post-thumbnail

🔴 나만의 계산기 만들기

🍎 Lv. 1

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


Missnig argument labels 'operator,firstNumber,seondNumber'in call 에러 발생

구글링, 네이버 검색했지만 답을 찾을 수 없어서 팀원들한테 도움요청!!!
바로 해결! 역시 팀원님들 짱짱!!

이걸 계기로 함수 선언 및 함수호출에대해 다시한번 공부함!!
기초부터..튼튼히!!

🔧아래는 수정된 코드
let 함수에서 calculate() ()내부에 Argument Lavel없이 사용하기 위해서는 함수선언시 Argument Lavel앞에 _를 사용해서 생략해서 사용해야 했음!!!

그것이 아니라면 일일히 Argument Lavel라벨을 기록해서 해야했는데... 값만 기록했으니 계속 오류가 발생했던것!!!

class Calculator {
    func calculate(_ operator: Character, _ firstNumber: Double, _ secondNumber: Double) -> Double {

        switch `operator`{
        case "+":
            return firstNumber + secondNumber
        case "-":
            return firstNumber - secondNumber
        case "*":
            return firstNumber * secondNumber
        case "/":
            return firstNumber / secondNumber
        default:
            return 0
        }
    }
}

let calculator = Calculator()
let addResult = calculator.calculate("+", 6, 3)
let subResult = calculator.calculate("-", 6, 3)
let multiplyResult = calculator.calculate("*", 6, 3)
let dividedResult = calculator.calculate("5", 6, 3)

🍎 Lv. 2

  • Lv1에서 만든 Calculator 클래스에 “나머지 연산”이 가능하도록 코드를 추가하고, 연산 진행 후 출력
  • ex) 나머지 연산 예시 : 6을 3으로 나눈 나머지는 0 / 5를 3으로 나눈 나머지는 2
class Calculator {
    func calculate(_ operator: Character, _ firstNumber: Double, _ secondNumber: Double) -> Double {

        switch `operator`{
        case "+":
            return firstNumber + secondNumber
        case "-":
            return firstNumber - secondNumber
        case "*":
            return firstNumber * secondNumber
        case "/":
            return firstNumber / secondNumber
        case "%":
            return firstNumber.truncatingRemainder(dividingBy: secondNumber)

        default:
            return 0
        }
    }
}

class AddOperation {
    func operate(firstNumber:Double, secondNumber: Double) -> Double {
        return Double(firstNumber + secondNumber)
    }
}

class SubtractOperation {
    func operate(firstNumber: Double, secondNumber: Double) -> Double {
        return Double(firstNumber - secondNumber)
    }
}

class MultiplyOPeration {
    func operate(firstNumber: Double, secondNumber: Double) -> Double {
       return Double(firstNumber * secondNumber)
    }
}

class DiviedeOperation {
    func operate(firstNumber: Double, secondNumber: Double) -> Double {
        return Double(firstNumber / secondNumber)
    }
}


let calculator = Calculator()
let addResult = calculator.calculate("+", 6, 3)
let subResult = calculator.calculate("-", 6, 3)
let multiplyResult = calculator.calculate("*", 6, 3)
let dividedResult = calculator.calculate("/", 6, 3)
let remainderResult = calculator.calculate("%", 5, 3)

print("addResult : \(addResult)")
print("subResult : \(subResult)")
print("multiplyResult : \(multiplyResult)")
print("divideResult : \(dividedResult)")
print("remainderResult: \(remainderResult)")


나머지 구하는 연산에서 나머지 연산자 사용이 안되서 잠시 당황했지만
firstNumber, secondNumber을 Double로 해두어서 Int에서만 사용가능한 나머지 연산자가 사용이 안 되었던것!!

truncatingRemainder 메서드 사용해서 해결

메서드 호출 방법

메서드는 해당 객체 또는 타입에 대해 호출 됩니다!

myObject.increment()

와 같이 객체 또는 타입 인스턴스 뒤에 메서드 이름을 호출합니다!

와 뿌듯... 이제 문제가 생겨도 찾아보고 해결할 수 있다니... 왕뿌듯...
아무것도 아니지만 왕뿌듯....왕초보니까 그러려니 해주세요

🍎 Lv. 3

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

class Calculator {
    func calculate(_ operator: Character, _ firstNumber: Double, _ secondNumber: Double) -> Double {

        switch `operator`{
        case "+":
            return firstNumber + secondNumber
        case "-":
            return firstNumber - secondNumber
        case "*":
            return firstNumber * secondNumber
        case "/":
            return firstNumber / secondNumber
        case "%":
            return firstNumber.truncatingRemainder(dividingBy: secondNumber)

        default:
            return 0
        }
    }
}

class AddOperation {
    func operate(firstNumber:Double, secondNumber: Double) -> Double {
        return Double(firstNumber + secondNumber)
    }
}

class SubtractOperation {
    func operate(firstNumber: Double, secondNumber: Double) -> Double {
        return Double(firstNumber - secondNumber)
    }
}

class MultiplyOPeration {
    func operate(firstNumber: Double, secondNumber: Double) -> Double {
       return Double(firstNumber * secondNumber)
    }
}

class DiviedeOperation {
    func operate(firstNumber: Double, secondNumber: Double) -> Double {
        return Double(firstNumber / secondNumber)
    }
}

let calculator = Calculator()
let addResult = calculator.calculate("+", 6, 3)
let subResult = calculator.calculate("-", 6, 3)
let multiplyResult = calculator.calculate("*", 6, 3)
let dividedResult = calculator.calculate("/", 6, 3)
let remainderResult = calculator.calculate("%", 5, 3)

print("addResult : \(addResult)")
print("subResult : \(subResult)")
print("multiplyResult : \(multiplyResult)")
print("divideResult : \(dividedResult)")
print("remainderResult: \(remainderResult)")
  • Calculator 클래스의 내부코드를 변경
    • 관계를 맺은 후 필요하다면 별도로 만든 연산 클래스의 인스턴스를 Calculator 내부에서 사용
    • Lv2 와 비교하여 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
      • hint. 클래스의 책임(단일책임원칙)

이 부분 해결을 위해 무엇을 해야 할 지 고민하는 시간.......
++ 정확한 oprator가 전달되지 않을시 0을 리턴해야 함.. 이 메소드도 추가해야함!!!

🍎 다시 한 번 Lv. 1

코드 많이 쳐보는게 우선 도움이 될 것 같아서 복습 겸 놓치고 있는 부분은 없는지 복습하기 위해 다시 코드 작성해보기로 결심

웬걸...틀린 부분이 바로 발견됨..
1. 0으로 나눴을 때 값이 나오지 않게 하는 부분!
(생각보다 오류가 많이 뜬다고 한다!!)
2. 알 수 없는 연산자 입력시 0으로 출력되게 하는 부분!

추가로 연습하면서 Argument Lavel생략해서 작성했던 부분을 다시 추가해서 작성했다. 추후에 Lv3~4 단계를 하면서 수정해 나갈예정이다!

🔧 아래는 수정된 코드

class Calculator {
    func calculate(operator: Character, firstNumber: Double, secondNumber: Double) -> Double{

        switch `operator`{
        case "+":
            return firstNumber + secondNumber
        case "-":
            return firstNumber - secondNumber
        case "*":
            return firstNumber * secondNumber
        case "/":
            if secondNumber != 0{
                return firstNumber / secondNumber
            }else { print ("Error : Division by zero")
                return 0
            }
        default: print("Error : Uknown operator")
            return 0
        }
    }
}

let calculator = Calculator()
let addResult = calculator.calculate(operator: "+", firstNumber: 6, secondNumber: 3)
let subResult = calculator.calculate(operator: "-", firstNumber: 6, secondNumber: 3)
let multiplyResult = calculator.calculate(operator: "*", firstNumber: 6, secondNumber: 3)
let dividedResult = calculator.calculate(operator: "/", firstNumber: 6, secondNumber: 3)

print("addResult : \(addResult)")
print("subResult : \(subResult)")
print("multplyResult : \(multiplyResult)")
print("dividedResult : \(dividedResult)")
profile
개발이 어려운 나를 위한... 개발노트

0개의 댓글