package com.example.abstract_calculatior
// 추상 클래스는 추상 함수의 매개변수와 자료형 명시만 보장해주면 됨.
// 나중에 자식 클래스들이 개성있게 쓸 수 있도록 형태만 만드는 것.
abstract class AbstractOperation {
abstract fun operate(num1: Int, num2: Int): Double
}
package com.example.abstract_calculatior
// 추상 클래스의 추상 메소드를 받으면 반드시 오버라이딩 해야됨.
class AddOperation: AbstractOperation() {
override fun operate(num1: Int, num2: Int): Double {
return (num1 + num2).toDouble()
}
}
package com.example.abstract_calculatior
// 추상 클래스의 추상 메소드를 받으면 반드시 오버라이딩 해야됨.
class SubtractOperation: AbstractOperation() {
override fun operate(num1: Int, num2: Int): Double {
return (num1 - num2).toDouble()
}
}
package com.example.abstract_calculatior
// 추상 클래스의 추상 메소드를 받으면 반드시 오버라이딩 해야됨.
class MultiplyOprtation: AbstractOperation() {
override fun operate(num1: Int, num2: Int): Double {
return (num1 * num2).toDouble()
}
}
package com.example.abstract_calculatior
// 추상 클래스의 추상 메소드를 받으면 반드시 오버라이딩 해야됨.
class DivideOperation: AbstractOperation() {
override fun operate(num1: Int, num2: Int): Double {
return (num1 / num2).toDouble()
}
}
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)
}
}
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 메소드 안에서 해야한다는 것을 알았다.