본문 바로가기
STUDY/Kotlin

Kotlin / 계산기 만들기

by HR_J 2024. 4. 22.

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