2주차 프로젝트 계산기 과제 정답 코드 리뷰

박미소·2023년 12월 8일
0

코틀린

목록 보기
3/44
  • AbstractOperation.kt
package com.example.abstract_calculatior

// 추상 클래스는 추상 함수의 매개변수와 자료형 명시만 보장해주면 됨.
// 나중에 자식 클래스들이 개성있게 쓸 수 있도록 형태만 만드는 것.
abstract class AbstractOperation {
    abstract fun operate(num1: Int, num2: Int): Double
}
  • AddOperation.kt
package com.example.abstract_calculatior

// 추상 클래스의 추상 메소드를 받으면 반드시 오버라이딩 해야됨.
class AddOperation: AbstractOperation() {
    override fun operate(num1: Int, num2: Int): Double {
        return (num1 + num2).toDouble()
    }
}
  • SubtractOperation.kt
package com.example.abstract_calculatior

// 추상 클래스의 추상 메소드를 받으면 반드시 오버라이딩 해야됨.
class SubtractOperation: AbstractOperation() {
    override fun operate(num1: Int, num2: Int): Double {
        return (num1 - num2).toDouble()
    }
}
  • MultiplyOprtation.kt
package com.example.abstract_calculatior

// 추상 클래스의 추상 메소드를 받으면 반드시 오버라이딩 해야됨.
class MultiplyOprtation: AbstractOperation() {
    override fun operate(num1: Int, num2: Int): Double {
        return (num1 * num2).toDouble()
    }
}
  • DivideOperation.kt
package com.example.abstract_calculatior

// 추상 클래스의 추상 메소드를 받으면 반드시 오버라이딩 해야됨.
class DivideOperation: AbstractOperation() {
    override fun operate(num1: Int, num2: Int): Double {
        return (num1 / num2).toDouble()
    }
}
  • Calculator.kt
package com.example.abstract_calculatior

// AbstractOperation을 상속 받는 Calculator는 AbstractOperation의 자식 클래스까지 상속 받는 것임. AddOpreration, SubstractOperation... 4개 클래스 모두 매개변수로 넘길 수 있다.
// main.kt에서
// var calcAdd = Calculator(AddOperation()) 
// var calcSub = Calculator(SubtractOperation())
// var calcMul = Calculator(MultiplyOprtation())
// var calcDiv = Calculator(DivideOperation())

class Calculator(private val operator: AbstractOperation) {
    fun operate(num1: Int, num2: Int): Double {
// 추상 클래스 AbstractOperation의 하위클래스 4개를 프라이빗(해당 클래스 내부에서만 사용 가능) 상수 operator에 받을 수 있다. main파일에서 새로 만든 객체(main.kt 내 var calcAdd = Calculator(AddOperation()))에 담을수 있는 것임.  
        //println(operator) // AbstractOperation의 하위 클래스 4개의 메모리주소가 출력됨. 
        // 골라서 전달 가능하다는 뜻.
        //com.example.abstract_calculatior.AddOperation@3b6eb2ec
        //com.example.abstract_calculatior.SubtractOperation@1e643faf
        //com.example.abstract_calculatior.MultiplyOprtation@6e8dacdf
        //com.example.abstract_calculatior.DivideOperation@7a79be86
        return operator.operate(num1, num2)
		
    }
}
  • main.kt
package com.example.abstract_calculatior

fun main() {
    var calcAdd = Calculator(AddOperation())
    var calcSub = Calculator(SubtractOperation())
    var calcMul = Calculator(MultiplyOprtation())
    var calcDiv = Calculator(DivideOperation())

    var addResult = calcAdd.operate(10,5)
    var subResult = calcSub.operate(50,100)
    var mulResult = calcMul.operate(3,5)
    var divResult = calcDiv.operate(19,4)

    println("덥셈 결과 : 10 + 5 = ${addResult}")
    println("뺼셈 결과 : 50 - 100 = ${subResult}")
    println("곱셈 결과 : 3 * 5 = ${mulResult}")
    println("나눗셈 결과 : 19 / 4 = ${divResult}")

}

// 덥셈 결과 : 10 + 5 = 15.0
// 뺼셈 결과 : 50 - 100 = -50.0
// 곱셈 결과 : 3 * 5 = 15.0
// 나눗셈 결과 : 19 / 4 = 4.0
  • 정답 코드 보고 나서 내 코드와 비교 리뷰:
    Lv 4에서 원했던건 상위 클래스 객체 추상화였다.
    AddOperation(),SubtractOperation(),MultiplyOprtation(),DivideOperation()을 자식 클래스로 둔 abstract class AbstractOperation이 상위 추상 클래스이다.
    내가 제출한 코드는 인터페이스를 이용해 오버라이딩으로 함수 추상화만 한 것.

  • 과제 코드를 짜다가 시간소요가 많이 됐던 부분:
    try-catch 예외처리를 inputSymbolInfo() 메소드 내에서 while문과 돌리고 있었다. 팀장님이 공유해주신 코드를 보고 main 메소드 안에서 해야한다는 것을 알았다.

0개의 댓글