과제/계산기

Calculator lv4 추상클래스 설계

crablo 2024. 3. 7. 20:05
728x90

Calculator 과제를 수행하면서 lv4가 가장 어려웠다.

lv3까지는 lv1의 내용을 복붙해서 기능만 나눴기때문에 파일만 추가해주고 끝이었었다.

하지만 아직도 추상클래스에대한 사용법이 미숙해서 어려웠던것 같다.

원해 파일구성은 6파일이었으나,

계산을수행하는 파일의 코드가 길어져서 RunningCalculate.kt파일과 Calculator.kt파일로 나눴다.

 

 

[AbstractOperation.kt]

package com.ellycrab.calculatorlv4

open abstract class AbstractOperation {
   

//자식에게서만 사용할 수 있도록 protected로 설정함, 모든 연산에서 형변환은 공통임
    protected fun convertToDouble(str: String?): Double? {
        return str?.toDoubleOrNull()
    }

    //연산은 모두 공통임(+,-,*,%  ->연산형태만 다를뿐)
    open abstract fun operate(num1: String?, num2: String?): Double?
}

AbstractOperation.kt파일에서는 + - * / 4칙 연산의 공통 부분을 수행하는 메서드만 작성했다. 

그 이유는 각각의 사칙연산 파일에서 override해서 2 메서드를 사용하면 되기 때문이다.

만약, override를 하지 않는다면, 각 파일에서 일일이 메서드명을 다르게 설정해야한다.

Calculator.kt

 

Calculator.kt파일은 원래 Main에 있었으나 코드가 길어져서 분리한 파일이다.

Main의 역할 그대로 계산하는 로직을 담당하고 있다.

[RunningCalculate.kt]

package com.ellycrab.calculatorlv4
import java.lang.Exception


fun main() {
    val operations = listOf(
        AddOperation(),
        SubtractOperation(),
        MultiplyOperation(),
        DivideOperation()
    )

    val calculator = Calculator(operations)

    while (true) {
        println("숫자1을 입력해주세요.")
        val num1 = readLine()

        println("숫자2을 입력해주세요")
        val num2 = readLine()

        println("연산을 선택해주세요.")
        println("1번 +, 2번 -, 3번 *, 4번 / ")

        val op = readLine()

        val opResult = op?.toIntOrNull()

        if (opResult != null && opResult in 1..4) {
            val result = calculator.calculate(num1, num2, opResult)

            if (result != null) {
                println("결과: $result")
            } else {
                println("연산이 불가능합니다.")
            }
        } else if (opResult == -1) {
            println("-1을 입력하여 종료합니다. 바이바이")
            break
        } else {
            println("올바른 연산기호가 아닙니다.")
        }
    }
}

 

메인 파일에서 operations변수에 리스트 형태로 4개의 클래스를 담는다. 그 후 Calculator클래스에 operations를 넘긴다.

4개 파일은 AbstractOperation 파일을 상속받은 애들이고 안에서 기능을 재정의하고있다.

그래서 제너릭의 타입은 AbstractOperation이 되고 4개의 결과를 리턴해줘야하기때문에 List<AbstractOperation>으로 타입 설정을 해준다.

메인에서 숫자1,2를 입력 받은 후 연산을 선택할때,  

 

val result = calculator.calculate(num1, num2, opResult)

calculator객체를 통해 function calculate로 접근하고 숫자 2개와 연산자를 넘겨준다.

그 후 받은 result를 통해서 결과를 도출한다.

728x90

'과제 > 계산기' 카테고리의 다른 글

Calculator lv5 stack클래스 이용  (0) 2024.03.12
Calculator lv1~lv4  (0) 2024.03.07