개발하는 뚝딱이

[ios] 계산기 만들기 D+2 본문

iOS 개발일지

[ios] 계산기 만들기 D+2

개발자뚝딱이 2020. 3. 6. 16:27

 

iOS 계산기 만들기 개발 2일차

 

 


깃 허브 저장소 주소 ⤦

https://github.com/TheSongOfSongs/Calculator

 

 

 

구현 목표

소수 연산 해결하기

 

해결 방안 목록

1. 버튼을 통해 입력된 값 printNum 자체를 처음부터 Int가 아닌 String으로 선언한다. printNum이 "."을 갖고 있으면 Double로 타입 캐스팅, 갖고 있지 않으면 Int로 타입캐스팅을 한다.

 

장점) 버튼 클릭할 때는 단순히 문자열에 새로운 문자를 추가하는 작업만 하면 된다

단점) 각 피연산자마다 타입 캐스팅을 해야 하고, Double과 Int 모두 쓰이게 되므로 임시변수를 선언한다고 하더라도 Double, Int 둘 다 쓰이게 된다. 또한 Doubler과 Int는 연산이 안되므로 Int는 다시 Double로 타입캐스팅을 해야 하며 불필요한 작업들이 늘어난다.

 

2. 버튼을 통해 입력된 값 printNum을 Int가 아닌 Double로 선언하고 정수임을 확인하면 출력 시, ".0"을 지운다.

 

장점) 불필요한 타입캐스팅을 줄일 수 있다

단점) 매번 소수점 자리에 값이 있는지 확인해야 한다

 

 

구현 내용

2번을 택하여 코딩하였다.

 

1. "."을 눌렀을 때

@IBAction func dot(_ sender: Any) {
    howManyDecimal += 1
    self.result.text = removePoint(num: printNum) + "."
}

 func resultChange(_ newNum: Double) {
    var fraction = newNum
    if howManyDecimal > 0 {
        for _ in 0..<howManyDecimal {
            fraction *= 0.1
        }
        howManyDecimal += 1
        printNum += fraction
    }
    else {
        printNum = printNum * 10 + newNum
    }
    self.result.text = removePoint(num: printNum)
}

func dot(_ sender: Any)를 통해 버튼을 클릭하여 소수점이 선택되면, howManyDecimal을 1만큼 증가시킨다. 이는 숫자로 계산될 때, 소숫점 아래 숫자를 증가시키기 위해 0.1을 곱할지 정하기 위해서이다. 함수 ResultChange에서 버튼을 통해 입력한 소수가 숫자로 변환되는 과정을 보여준다. howManyDecimal이 0보다 크면 소수라고 생각하며, 값만큼 0.1을 곱한다. 

 

2. 정수일 경우, ".0" 제거

func removePoint(num: Double) -> String {
        var floatNumString = String(num)
        
        if num == floor(num) {
            for _ in 0..<floatNumString.count {
                if floatNumString.last == "." {
                    floatNumString.removeLast()
                    break
                }
                else {
                    floatNumString.removeLast()
                }
            }
        }
        
        return floatNumString
}

원래의 수와 내림한 수가 같을 경우, "." 소수점이 나올 때까지 마지막 글자를 없애도록 구현하였다. 지금 돌이켜 보니, howManyDecimal이 0보다 클 때와 같은 조건이므로 if의 조건문은 howManyDecimal == 0으로 변경하는게 좋을 것 같다. num == floor(num)은 비교와 내림 연산 두 번을 시행하니, 이보다 조금 더 효율적일 것이다.

 

3. 리팩토링

사소하지만 사소하지 않은 리팩토링을 진행하였다. 결과값을 출력하는 함수가 print()로 되어 있어, 콘솔 창에서 print()가 실행되지 않았던 것이다. 그러한 이유로 함수 이름을 @IBAction func printResult(_ sender: Any)로 이름 지었다. 

 

 

 

해결해야 할 과제

1. 테스트하면서 오류가 발생했다. 5-5.9 = -0.9000000000000004 로 출력된다. 플레이그라운드로 실행해보니 같은 결과. 이유를 확인해봐야 한다

2. 이제 괄호 기능을 구현해야 한다

3. 기능이 목적이지만, 디자인이 예쁘지 않다. 이왕이면 완성된 앱을 만들고 싶은데 고민이다

 

 

 

'iOS 개발일지' 카테고리의 다른 글

[iOS] 계산기만들기 D+5  (0) 2020.03.26
[iOS] 환율계산기1  (0) 2020.03.24
[iOS] 계산기만들기 D+4  (0) 2020.03.12
[iOS] 계산기 만들기 D+3  (0) 2020.03.10
[iOS] 계산기 만들기 D+1  (0) 2020.03.05