[TIL]Kotlin 계산기 구현하기 1

지혜·2023년 11월 29일

Android_TIL

목록 보기
7/70

✏231129 수요일 TIL(Today I learned) 오늘 배운 것

📖Lv1. 사칙연산을 수행하는 Calculator 클래스

package com.example.mycalculator

class Calculator {
    var num1 : Double =0.0
    var num2 : Double =0.0
    var operator : String = ""

    fun addOperation(num1 : Double,num2 : Double) = num1 + num2

    fun subtractOperation(num1: Double, num2: Double) = num1 - num2

    fun multiplyOperation(num1: Double, num2: Double) = num1 * num2

    fun divideOperation(num1: Double, num2: Double) = num1/num2

}
package com.example.mycalculator

fun main() {

    println("첫번째 수를 입력하세요.")
    var num1 : Double = readLine()!!.toDouble()

    println("수행할 연산자를 고르세요 : +  -  *  /")
    var operator : String = readLine()!!

    println("두번째 수를 입력하세요.")
    var num2 : Double = readLine()!!.toDouble()

    var calc : Double = 0.0

    when(operator) {
        "+" -> {
             calc = Calculator().addOperation(num1,num2)
        }

        "-" -> {
             calc = Calculator().subtractOperation(num1,num2)
        }

        "*" -> {
             calc = Calculator().multiplyOperation(num1,num2)
        }

        "/" -> {
             calc = Calculator().divideOperation(num1,num2)
        }
    }

    println("${num1} ${operator} ${num2} =  ${calc} 입니다.")

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

  • 계산기이기 때문에 일단 더블형으로 숫자를 받도록 설정했다. 나누기 같은것들은 특히 int형으로 받으면 소수점 없이 반환되기 때문에 더블형을 선택했다.
  • 연산자가 4개 밖에 없기 때문에 if 대신 when을 사용하여 조건문을 썼다.
  • 출력문을 when조건문 밖으로 빼 불필요한 중복이 없도록 했다.

📖Lv1.발생 문제 및 해결 및 느낀점

  • 패키지만드는 것부터 처음으로 혼자 아무것도 없이 시작하려니까 막막했다. 특히, main메서드를 불러오는 것부터 버벅였는데, 하던 관성이 있어서 그런가 클래스 파일 안에 main()을 선언했더니 run버튼 자체가 활성화가 되지 않아서 곤란했다. 맨날 따라쳤을 때는 감싸는 모양이 어떤지보다는 그 안에 기능들이 중요했었어서 직접해보니까 이런 곳부터 막히는게 조금 자괴감이 들기는 한다..
  • 여튼 찾아보니까, 코틀린에서는 static이 없기 때문에 Top-level function 이라는 것이 있다는데, 자바의 단점을 극복한 것으로, 모든 코드를 클래스의 메소드로 작성할 필요없이 한 클래스에 포함시키기 어려운 코드도 최상위에 정의할 수 있게 만들었다고 한다.
    => 지금은 그렇구나 하고 넘어가지만 나중에 더 깊이 공부해서 보충해야겠다.
  • 나머지는 기본 산술 연산자를 활용한 간단한 계산이였기 때문에 금방 할 수 있었다. 코틀린은 확실히 readline()도 그렇고 자바보다 훨씬 간결해진것을 느낄 수 있는데, 그래서 좋기도하고, 이렇게 공부할때는 많이 생략된 감이 있어서 조금 당혹스럽기도 하다.

📖Lv2. Lv1에 이어서 추가 연산 가능하게 하기

//class Calculator는 Lv1과 동일.

package com.example.mycalculator

fun main() {

    var select : Int
    var calc : Double = 0.0
    var num1 : Double = 0.0
    var operator : String = ""
    var num2 : Double = 0.0

    do {
        println("")
        println("원하는 계산을 선택하세요")
        println("[1] 새로 계산하기 [2] 이어서 계산하기 [3] 그만두기 ")
        select = readLine()!!.toInt()

        if(select == 1) {
            println("첫번째 수를 입력하세요.")
            num1 = readLine()!!.toDouble()
            println("수행할 연산자를 고르세요 : +  -  *  /")
        
        } else if (select == 2) {
            num1 = calc
            println("")
            println("첫번째 수는 $calc 입니다.")
            println("")
            println("추가로 수행할 연산자를 고르세요 : +  -  *  /")
        
        } else if (select ==3) {
            println("계산기를 종료합니다.")
            break
        }
        
        operator = readLine()!!

        println("두번째 수를 입력하세요.")
        num2 = readLine()!!.toDouble()

        when(operator) {
            "+" -> {
                calc = Calculator().addOperation(num1,num2)
            }

            "-" -> {
                calc = Calculator().subtractOperation(num1,num2)
            }

            "*" -> {
                calc = Calculator().multiplyOperation(num1,num2)
            }

            "/" -> {
                if(num2 == 0.0) {
                    println("0으로 나눠지지 않습니다.")
                } else {
                    calc = Calculator().divideOperation(num1, num2)
                }
            }
        }

        println("${num1} ${operator} ${num2} =  ${calc} 입니다.")

    } while (select != 3)
}
  • Lv2 : Lv1에서 만든 Calculator 클래스에 출력 이후 추가 연산을 가능하도록 코드를 추가하고, 연산 진행 후 출력하기

  • 추가 연산이 가능해야하기 때문에 반복문을 사용했다. 그 중에서도 do..while문을 사용하여 원하는만큼 반복할 수 있도록 만들었다.
  • if문으로 새로 계산할지, 이어서 계산할지 선택할 수 있도록 했다. 첫번째수를 새로 받을것인지, 이어서 받을것인지만 차이를 두고 나머지는 공통부분이라서 if문 밖에서 작동할 수 있도록 했다.
  • 3번 그만두기를 선택했을 때 break를 사용하여 반복문에서 빠져나가고, 코드가 종료되도록 작성했다.

📖Lv2.발생 문제 및 해결 및 느낀점

  1. 추가 연산을 위해 calc 값을 받아오는 것 자체에서 당혹감을 느꼈다. 반복문을 사용하면 되는 건 알겠는데 막상 반복문을 적용하려고 하니까 어느 부분을 어디까지 반복해야할지 상당히 난감했다.
    => 반복문 배운거라곤 for, while, do..while 밖에 없어서 다행이라고 해야할지.. 사실 for랑 while만 생각하고는 적용방법이 마땅치 않아 당황했는데, do..while문을 떠올리고는 금방 작성했다. 바보같이 if(select == 1)안에 when까지 전부다 집어넣어서 else if(select ==2) 에도 또 when을 쓸 뻔 했지만, 정신차리고 중복코드는 잘 if문 밖으로 빼서 작동하도록 했다.

  2. while에 (select !=3)만 써놓고 else if(select == 3)을 안해줬었다. 솔직히.. 필요없을 줄 알았다. 그런데 끝도 없이 run 동작하고 exit를 안하는 문제가 발생했다.
    =>그래서 else if(select == 3)를 만들고 break로 반복문을 빠져나오게 해서 실행종료하도록 만들었다.

  3. 팀원들과 마무리시간에 이야기 나누는 시간이 있었는데..! 현업에서는 do while을 사용하지 않는다고 한다..ㅎㅎ while이랑 똑같기 때문에 바꾸는데 어렵지 않으실거라고 하셔서 lv3에는 그냥 while문으로 구현할 수 있도록 해봐야겠다.
    =>그냥.. while을 위로 올리고 do를 빼면 되는 아주 간단한 일이었다.
    lv3코드를 올릴 때 같이 올리도록 하겠다.

profile
파이팅!

0개의 댓글