본문 바로가기

카테고리 없음

23.12.08계산기 보완

계산기의 정답 영상이 올라왔는데, 내가 했던 방식인 클래스는 연결만 해두고 메인파일에서 계산을 하는건 깔끔하지 못하고 불안정한 방식이였다. 

 

깔끔하게 하려면 

fun main() {


    val addCalc = Calculator(AddOperation())
    println("10 더하기 20 결과는 : ${addCalc.operate(10,20)} 입니다")

    val subCalc = Calculator(SubstractOperation())
    println("10 빼기 20 결과는 : ${subCalc.operate(10, 20)} 입니다")

    val mulCalc = Calculator(MultiplyOperation())
    println("10 곱하기 20 결과는 : ${mulCalc.operate(10, 20)} 입니다")

    val divCalc = Calculator(DivideOperation())
    println("10 나누기 20 결과는 : ${divCalc.operate(10, 20)} 입니다")
}

메인은 이렇게 출력만 하도록 내버려두고, 클래스랑 연결만 한다.

 

abstract class AbstractOperation {
    abstract fun operate(num1: Int, num2: Int): Double
}

그리고 클래스들을 아우르는 부모를 만들고,

class SubstractOperation: AbstractOperation() {
    override fun operate(num1: Int, num2: Int): Double = (num1 - num2).toDouble()
}

각 서브클래스들은 이렇게 부모와 연결하고 계산도 떠맡는다.

class DivideOperation : AbstractOperation() {
    @Throws(ArithmeticException::class)
    override fun operate(num1: Int, num2: Int): Double {
        require(num2 != 0) {
            ArithmeticException( "Divide by Zero")
        }
        return (num1 / num2).toDouble()
    }
}

나누기만 복잡한데, 그 이유는 0으로 나누는게 불가능해서 그걸 막는 수식을 집어넣기 때문이다.

 

그러면 이제 addCalc.operate(10,20)에서 숫자만 바꾸는 계산기의 완성이라고 한다.

 

내가 했던 버전은 클래스를 만들긴 했지만, 계산을 메인에서 했기 때문에 확실히 클래스의 의미가 별로 없었다.

클래스를 의미있게 하려면, 클래스에서 계산을 직접해야 한다는 어찌보면 당연한 사실을 생각조차 못하고 있었다.

 

메인파일은 깨끗하게, 부모 클래스를 만들어 자식 클래스들에 모든 부담을 밀어넣기! 꼭 기억하자.