본문 바로가기
Android (Kotlin)/mini projects

[Calculator] 계산기 만들기 lv4.1

by 키윤 2023. 12. 4.

수정한 부분

  1. 추상클래스의 주생성자를 이용해야한다는 피드백을 받았다. 추상클래스에 주생성자를 추가하긴 했지만 그 안에 추상 함수에 매개변수를 또 작성해서 장황하게 코드를 작성했었다. 또 전 코드에서는 추상클래스를 통해서 메인 함수에 추상함수를 불러오는게 아닌 추상함수를 바로 호출했었다. 추상클래스를 사용하면서 단일책임원칙을 지키지 않았던 것 같다. 지난번에 마무리하면서 메인 함수 내부에 들어가는 코드가 조금 아쉽다는 생각이 계속 들었었는데 이번에 제대로 수정한 것 같다.  장황하게 적혀져있던 메개 변수들도 전부 지울 수 있어서 코드가 매우 깔끔해졌다.
package com.example.mycalculator

//- Lv4 : AddOperation(더하기), SubtractOperation(빼기), MultiplyOperation(곱하기),
// DivideOperation(나누기) 연산 클래스들을 AbstractOperation라는 클래스명으로 만들어 사용하여 추상화하고
// Calculator 클래스의 내부 코드를 변경합니다.
//- Lv3 와 비교해서 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
//- hint. 클래스간의 결합도, 의존성(의존성역전원칙)
fun main() {
    // 입력 값
    print("숫자를 입력하세요 : ")
    var number1 = readLine()!!.toDouble()
    print("연산자를 입력하세요 : ")
    var operator = readLine()!!
    print("숫자를 입력하세요 : ")
    var number2 = readLine()!!.toDouble()


    when (operator) {
        in "+" -> println(AddOperation(number1, number2).operation())
        in "-" -> println(SubtractOperation(number1, number2).operation())
        in "/" -> println(DivideOperation(number1, number2).operation())
        in "*" -> println(MultiplyOperation(number1, number2).operation())
    }
}

class AddOperation(number1: Double, number2: Double) : AbstractOperation(number1, number2) {
    override fun operation(): Double = number1 + number2
}
class SubtractOperation(number1: Double, number2: Double) : AbstractOperation(number1, number2) {
    override fun operation(): Double = number1 - number2
}
class MultiplyOperation(number1: Double, number2: Double) : AbstractOperation(number1, number2) {
    override fun operation(): Double = number1 * number2
}
class DivideOperation(number1: Double, number2: Double) : AbstractOperation(number1, number2) {
    override fun operation(): Double = number1 / number2
}
abstract class AbstractOperation(val number1: Double, val number2: Double) {
    abstract fun operation(): Double
}