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

[Calculator] 계산기 만들기 lv.4

by 키윤 2023. 11. 30.
  • Lv4 : AddOperation(더하기), SubtractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스들을 AbstractOperation라는 클래스명으로 만들어 사용하여 추상화하고 Calculator 클래스의 내부 코드를 변경합니다.
    • Lv3 와 비교해서 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
      • hint. 클래스간의 결합도, 의존성(의존성역전원칙)

lv3를 하면서 상속이랑 클래스 개념을 제대로 익혀서 그런지 상대적으로 시간이 덜 걸렸다.
간단한 추상 클래스 예제를 정독하고 문제를 풀어줬다!
아래 링크 예제 정독만 하면 바로 풀 수 있다 !!
https://velog.io/@k906506/Kotlin-%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4-VS-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

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()


    // 객체 인스턴스화해주기
    var addOperation = AddOperation(number1, number2)
    var subtractOperation = SubtractOperation(number1, number2)
    var multiplyOperation = MultiplyOperation(number1, number2)
    var divideOperation = DivideOperation(number1, number2)

    when (operator) {
        in "+" -> println(addOperation.operation(number1, number2))
        in "-" -> println(subtractOperation.operation(number1, number2))
        in "/" -> println(divideOperation.operation(number1, number2))
        in "*" -> println(multiplyOperation.operation(number1, number2))
    }
}

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

lv3와 비교해서 개선된점.

- 전에는 addoperation에 addoperation안에 있는 함수 addition을 호출해서 결과값을 가져왔다. 그런데 이제 abstract클래스를 통해서 addoperation을 하면서 공통적인 operation함수를 호출해서 결과값을 가져올 수 있어서 코드가 더 깔끔해지고 가독성도 높아지고 이해하기 쉬워지고 수정하기도 편해진다. 아래 링크 정독해보면 도움 될듯..
https://devroach.tistory.com/58

 

응집도와 결합도

응집도와 결합도는 소프트웨어 품질을 결정 짓는 요소이다. 대다수의 사람들은 코드를 작성할때 "응집도" 와 "결합도" 를 생각하지 않은채 관성적으로 코드를 적고는 한다. 응집도와 결합도는

devroach.tistory.com

https://velog.io/@harinnnnn/OOP-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-5%EB%8C%80-%EC%9B%90%EC%B9%99SOLID-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%97%AD%EC%A0%84-%EC%9B%90%EC%B9%99-DIP

 

[OOP] 객체지향 5대 원칙(SOLID) - 의존성 역전 원칙 (DIP)

이번 글에서는 객체지향의 5대 원칙 중, 의존성 역전 원칙(DIP)에 대해 알아봅니다!

velog.io