오늘 하루의 느낀점

230720 Today I Learned!

조예_ 2023. 7. 21. 12:23

Kotlin Code Calculrator

지금까지 배운 Kotlin문법을 응용해서 나만의 계산기를 만들어보자.


Lv3 : AddOperation(더하기), SubstractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스를을 만든 후 클래스간의 관계를 고려하여 Calculator 클래스와 관계를 맺기

 

각각의 class를 만들어서 해당 수식에 맞는 메소드값을 넣어주었고 

(처음에는 내가 직접 코드를 작성하였는데, 가독성도 너무 떨어지고 지저분해보여서 힌트를 살짝 보았다 ㅎㅎ..)

DevideOperation의 실제 계산값과 다른 부분을 보았다

10 / 3 의 값은 코드상으로는 3이 나오지만 실제 계산값은 3.33333이 나오기 때문이다.

그냥 10%3을 하게되면 1의 값이 나오기 때문에 이 값에 한번 더 나누기를 해주었다.

(현재 값은 Int값이기에 나누더라도 0이란 수가 나오지만, .toDouble()해주게 되면 소수점까지 잘 나오게 된다)

너무 소수점이 긴 경우 보기 안좋기 때문에 소수점 2번째 자리에서 반올림을 해주었다

 

처음 "%.2f".format(result)에 대한 피드백을 얻었지만 String으로 인식?하기 때문에 

round()를 사용하여 Double값에 대한 반올림을 해주게 되었다

 

package com.example.layout.calculator


fun main() {
    println("계산기 ON")
    println("첫번째 숫자, 수식, 두번째 숫자를 순서대로 입력해주세요")
    val calc = Calculator()
    val number1 = calc.num1
    val operation = calc.operation
    val number2 = calc.num2

    if (calc.calculator() == null) {

        println("수식이 잘못 입력되었습니다")

    } else {

        println("$number1 $operation $number2 = ${calc.calculator()} 입니다")

    }

    println("계산기 OFF")

}

class Calculator {

    val num1 = readLine()!!.toInt()
    val operation = readLine()!!.toString()
    val num2 = readLine()!!.toInt()

    fun calculator(): Any? {

        return when (operation) {
            "+" -> {

                return AddOperation().operate(num1, num2)

            }

            "-" -> {

                return SubtractOperation().operate(num1, num2)

            }

            "*" -> {

                return MultiplyOperation().operate(num1, num2)

            }

            "/" -> {

                return DivideOperation().operate(num1, num2)
                //소수점 2번째 자리까지 반올림으로 표현

            }

            else -> {
                return null
            }
        }
    }
}
AddOperation.kt

class AddOperation{
    fun operate(num1: Int, num2: Int): Int = num1 + num2
}

----------------------------------------------------------------------

SubtractOperation.kt

class SubtractOperation{
    fun operate(num1: Int, num2: Int): Int = num1 - num2
}

----------------------------------------------------------------------

MultiplyOperation.kt

class MultiplyOperation{
    fun operate(num1: Int, num2: Int): Int = num1 * num2
}
----------------------------------------------------------------------

DivideOperation.kt

class DivideOperation {
    fun operate(num1: Int, num2: Int): Double {
        val share = (num1 / num2)

        val remainder = ((num1 % num2) / num2.toDouble())

        val result = share + remainder

        return (round(result*100)/100)
    }
}

 


Lv4 : AddOperation(더하기), SubtractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스들을 AbstractOperation라는 클래스명으로 만들어 사용하여 추상화하고 Calculator 클래스의 내부 코드를 변경합니다.

 

중복된 코드는 추상클래스로 만들어서 overriding시켜주었다.

점점 코드는 짧아지고 보기 좋게 바뀌었지만

본인 스스로가 추상클래스와 open의 개념이 다르다 라는 생각이 인지되지 않아 왜 이럴까?라는 생각이 많이 들었다.

좀더 공부 해봐야 겠다!

 

Calculator.kt

fun main() {
    println("계산기 ON")
    println("첫번째 숫자, 수식, 두번째 숫자를 순서대로 입력해주세요")
    val calc = Calculator()
    val number1 = calc.num1
    val operation = calc.operation
    val number2 = calc.num2

    if (calc.calculator() == null) {

        println("수식이 잘못 입력되었습니다")

    } else {

        println("$number1 $operation $number2 = ${calc.calculator()} 입니다")

    }

    println("계산기 OFF")

}

class Calculator {

    val num1 = readLine()!!.toInt()
    val operation = readLine()!!.toString()
    val num2 = readLine()!!.toInt()

    fun calculator(): Any? {

        return when (operation) {
            "+" -> {

                AddOperation().operate(num1, num2)

            }

            "-" -> {

                SubtractOperation().operate(num1, num2)

            }

            "*" -> {

                MultiplyOperation().operate(num1, num2)

            }

            "/" -> {

                DivideOperation().operate(num1, num2)
                //소수점 2번째 자리까지 반올림으로 표현

            }

            else -> {
                null
            }
        }
    }
}

 

AbstractOperation.kt

abstract class AbstractOperation {
    open fun operate(num1: Int, num2: Int): Any {

        return ""

    }
}

------------------------------------------------------------------

AddOperation.kt

package com.example.layout.calculator


class AddOperation : AbstractOperation() {
    override fun operate(num1: Int, num2: Int): Any = num1 + num2
}

------------------------------------------------------------------

SubtractOperation.kt

class SubtractOperation : AbstractOperation() {
    override fun operate(num1: Int, num2: Int): Any = num1 - num2
}


------------------------------------------------------------------

MultiplyOperation.kt

class MultiplyOperation : AbstractOperation() {
    override fun operate(num1: Int, num2: Int): Any = num1 * num2

}
------------------------------------------------------------------

DivideOperation.kt

class DivideOperation : AbstractOperation() {
    override fun operate(num1: Int, num2: Int): Any {
        val share = (num1 / num2)

        val remainder = ((num1 % num2) / num2.toDouble())

        val result = share + remainder

        return (round(result * 100) / 100)
    }
}