TODO
1단계 / 덧셈, 뺄셈, 곱셈, 나눗셈 기능을 수행할 수 있는 Calculator 클래스 만들기.
2단계 / 위에서 작성한 Calculator 클래스에 나머지 연산 추가하기.
3단계 / Add, Substract, Muliply, Divide 클래스 구현 후, Calculator 클래스와 관계 맺기(상속)
4단계 / AbstractOperation 클래스 명으로 만들어 사용하여 추상화하고 Calculator 클래스의 내부 코드 변경
강의 듣고 내 입맛대로 코드 짜기 시작...
훗..
1단계 + 2단계
우선 기본 계산기 클래스 만들기
Class Calculator{
val num1 :Double
val num2 :Double
fun add(num1:Double,num2:Double):Double = num1+num2
fun sub(num1:Double,num2:Double):Double = num1-num2
fun mul(num1:Double,num2:Double):Double = num1*num2
fun div(num1:Double,num2:Double):Double {
if (num2 == 0.0) {
throw IllegalArgumentException("Cannot divide by zero")
}
}
fun mod(num1:Double,num2:Double):Double = num1%num2
}
어, 생각해보니 double형태가 아니여도...괜찮지 않나..? Int 타입으로 수정을 해야할까(내일 코드 전체적으로 수정하면서 한번 확인해보기)
여기서 포인트. 나눗셈일경우, 0으로 나눌 수 없다.
흠, 일단 메인 함수에서 돌아가는지 확인해봐야겠다.
>> 테스트용 메인 함수
fun main() {
print("첫번째 수 입력: ")
val num1 = readLine()!!.toDouble()
print("연산자 입력: ")
val op = readLine()!!.toString()
print("두번째 수 입력: ")
val num2 = readLine()!!.toDouble()
var result: Double = 0.toDouble()
when (op) {
"+" -> {
result = Calculator().add(num1,num2)
}
"-" -> {
result = Calculator().sub(num1,num2)
}
"*" -> {
result = Calculator().mul(num1,num2)
}
"/" -> {
result = Calculator().div(num1,num2)
}
"%" -> {
result = Calculator().mod(num1,num2)
}
else -> {
println("Invalid operator")
}
}
println("result : ${num1} ${op} ${num2} = ${result}")
}
사실 마지막 단계까지 다 만들어두고, 하나씩 기억을 더듬어가며 다시 작성중이다.. 코드는 제대로 작동 하라.(좋은말로할때)
3단계
Add, Substract, Muliply, Divide 클래스 구현 후, Calculator 클래스와 관계 맺기(상속)
class Calculator{
fun addOperator(num1:Double, num2:Double):Double = AddOperator().add(num1,num2)
fun subOperator(num1:Double, num2:Double):Double = SubOperator().sub(num1,num2)
fun mulOperator(num1:Double, num2:Double):Double = MulOperator().mul(num1,num2)
fun divOperator(num1:Double, num2:Double):Double = DivOperator().div(num1,num2)
fun modOperator(num1:Double, num2:Double):Double = ModOperator().mod(num1,num2)
}
사실 이부분이 아리까리하다, 내가 작성한 코드는 과연 옳은 코드일까...
class AddOperation{
fun add(num1,num2):Double = num1+num2
}
class SubOperation{
fun sub(num1,num2):Double = num1-num2
}
class MulOperation{
fun mul(num1,num2):Double = num1*num2
}
class DivOperation{
fun div(num1,num2):Double {
if(num2==0.0){
throw IllegalArgumentException("Cannot divide by zero")
}
}
}
class ModOperation{
fun mod(num1,num2):Double = num1%num2
}
4단계
AbstractOperation클래스명으로 만들어 사용하여 추상화 하고 Calculator클래스의 내부코드 변경.
class Calculator(private val operation: AbstractOperation) {
fun operation(num1: Double, num2: Double): Double {
return operation.operation(num1, num2)
}
}
abstract class AbstractOperation {
abstract fun operation(num1:Double, num2:Double):Double
}
class AddOperation:AbstractOperation(){
override fun operation(num1: Double, num2: Double): Double = num1 + num2
}
class SubtractOperation:AbstractOperation() {
override fun operation(num1: Double, num2: Double): Double = num1 - num2
}
class MultiplyOperation:AbstractOperation(){
override fun operation(num1: Double, num2: Double): Double = num1 * num2
}
class DivideOperation:AbstractOperation(){
override fun operation(num1: Double, num2: Double): Double = num1 / num2
}
class ModOperation:AbstractOperation(){
override fun operation(num1: Double, num2: Double): Double = num1 % num2
}
import myoperator.*
fun main() {
print("첫번째 수 입력: ")
val num1 = readLine()!!.toDouble()
print("연산자 입력: ")
val op = readLine()!!.toString()
print("두번째 수 입력: ")
val num2 = readLine()!!.toDouble()
var result: Double = 0.toDouble()
val add = AddOperation()
val sub = SubtractOperation()
val mul = MultiplyOperation()
val div = DivideOperation()
val mod = ModOperation()
val addOperator = Calculator(add)
val subOperator = Calculator(sub)
val mulOperator = Calculator(mul)
val divOperator = Calculator(div)
val modOperator = Calculator(mod)
when (op) {
"+" -> {
result = addOperator.operation(num1, num2)
}
"-" -> {
result = subOperator.operation(num1, num2)
}
"*" -> {
result = mulOperator.operation(num1, num2)
}
"/" -> {
result = divOperator.operation(num1, num2)
}
"%" -> {
result = modOperator.operation(num1, num2)
}
}
println("result : ${num1} ${op} ${num2} = ${result}")
}
Github Link : https://github.com/DEVxMOON/Calculator
일단 작성해두고 후에 에러 핸들링 및, 추가적으로 넣어야 하는 상황
수정시 깃에 먼저 올리고, 추후에 주석을 넣을 것.
이번주 금요일까지 작업하면 되는거니, 나머지 강의를 다 들어보고 내 입맛대로 다시 수정해야겠다..!!
'STUDY > Kotlin' 카테고리의 다른 글
Kotlin / Scope Function - 범위 지정 함수 (0) | 2024.05.31 |
---|---|
Kotlin / Conditions and Loops (If, When, For, While) (0) | 2024.04.30 |
Kotlin / 숫자 야구 게임 (0) | 2024.04.30 |
Kotlin / 고차함수와 람다 (0) | 2024.04.25 |
Kotlin / 고차함수 (0) | 2024.04.24 |