
목표
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")
}
}