[과제]계산기 lv4

Anna·2024년 6월 10일

[TIL]Android

목록 보기
5/34
post-thumbnail

Lv4: 추상화 적용하기

목표
AddOperation, SubtractOperation, MultiplyOperation, DivideOperation 연산 클래스들을 AbstractOperation라는 추상 클래스로 만들어 사용하고, Calculator 클래스의 내부 코드를 변경한다.

설명
AbstractOperation이라는 추상 클래스를 만든다.
개별 연산 클래스들이 이 추상 클래스를 상속받도록 한다.
Calculator 클래스는 이 추상 클래스를 사용하여 연산을 수행한다.

개선점
코드의 결합도를 낮추고, 의존성역전원칙(Dependency Inversion Principle)을 적용하여 코드의 유연성을 높인다. 추상 클래스에 의존함으로써, 새로운 연산 클래스를 쉽게 추가할 수 있다.

class AbstractOperation

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

class AddOperation 하위 클래스

class AddOperation : AbstractOperation()
{
    override fun operate(num1: Double, num2: Double): Double
    {
        return num1 + num2
    }
}

class Calculator_lv4, main

class Calculator_lv4
{
    fun operation(input : Int, num1 : Double, num2 : Double) : Double = when(input)
    {
        1 -> AddOperation().operate(num1, num2)
        2 -> SubtractOperation().operate(num1, num2)
        3 -> MultiplyOperation().operate(num1, num2)
        4 -> DivideOperation().operate(num1, num2)
        else -> 0.0
    }
}

fun main()
{
    val calculator = Calculator_lv4()
    while(true)
    {
        println("아래 메뉴에서 선택해주세요.")
        println("[1] 더하기 연산 [2] 빼기 연산 [3] 곱하기 연산 [4] 나누기 연산 ")
        println("주의 : -1입력시 계산기 바로 종료됩니다.")

        val input = readLine()!!.toInt()
        if (input == -1)
        {
            println("계산기 종료하겠습니다.")
            break
        } else if (input !in 1..4)
        {
            println("잘못된 선택입니다, 다시 입력해주세요\n")
            continue
        }

        println("첫번 째 숫자를 입력해주세요.")
        val num1 = readLine()!!.toDouble()
        if (num1 == -1.0)
        {
            println("계산기 종료하겠습니다.")
            break
        }

        println("두번 째 숫자를 입력해주세요.")
        val num2 = readLine()!!.toDouble()
        if (num2 == -1.0)
        {
            println("계산기 종료하겠습니다.")
            break
        }
        val result = calculator.operation(input, num1, num2)
        println("결과 : ${result}\n")
    }
}

0개의 댓글