Project

Kotlin 문법 기초 과제 - 계산기

wlsds00_ 2023. 12. 19. 20:37

레벨 1

더하기, 빼기, 나누기, 곱하기 연산을 수행할 수 있는 Calculator 클래스를 만들고, 클래스를 이용하여 연산을 진행하고 출력하기

 

레벨 1은 비교적 쉽게 했다. 이때는 반복되는 코드가 나쁘다는 것도 몰랐고, 그냥 쓰면 쓰는대로 기능이 만들어지는게 신기해서 즐겁게 짰던 것 같다. 조금 아쉬운건 레벨 1부터 만들었던 코드들을 백업해뒀더라면 내가 어떻게 진행해왔는지 더 자세하게 볼 수 있었을텐데 바로 수정해 버려서 원본이 남지 않았단 점이다.

 

레벨 2

Lv1에서 만든 Calculator 클래스에 나머지 연산을 가능하도록 코드를 추가하고, 연산 진행 후 출력하기

 

크게 어려운 게 없었다. 위에서 나머지 연산을 한 줄 추가했다.

 

레벨 3

AddOperation(더하기), SubstractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스를을 만든 후 클래스간의 관계를 고려하여 Calculator 클래스와 관계를 맺기

 

나머지 연산만 추가하면 되어서 2까지 완성하고 한번 튜터님께 컨펌을 받았던 것 같다.

이때는 연산 기호를 직접 입력하는게 아니라 아마 숫자를 붙여서 그걸 누르면 연산이 되게끔 짰었던 기억이 있다. 그리고 숫자 입력을 else if마다 매번 새로 받게 readLine() 두줄을 입력해놨었다. 

 

수정해야 할 곳이나 방법을 알게 된 건 좋았으나 그걸 적용하기에 내가 기초가 없어서 너무 힘들었었다. 특히 이때 튜터님이 연산자를 바로 입력하게 수정하라는 부분을 잘못 이해하고 (아마 자료형에 대한 이해가 없었던 탓도 있을 것 같다.) String을 Int 자료형에 집어넣어 보겠다고 새벽까지 고생하다가 슬랙으로 재 피드백을 받았었다.

 

결과적으로 피드백을 주신 덕분에 이전보다 훨씬 깔끔하게 완성되었다. 우선 더하기 빼기 등의 수식을 다른 클래스 파일로 나누어서 Calculator 파일에 전부 연결하고 메인이 그걸 호출하도록 했다.

 

수정사항 : 반복되는 코드를 정리해서 최소한만 남겨도 돌아가게 하기, 숫자가 아니라 연산기호를 직접 입력하게 하기.

 

레벨 4

AddOperation(더하기), SubtractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스들을 AbstractOperation라는 클래스명으로 만들어 사용하여 추상화하고 Calculator 클래스의 내부 코드를 변경합니다.

 

이 부분에서 제일 아쉬운 점이라면 상속과 추상화 개념을 제대로 정리하지 못하고 넘어갔단 것이다. 다른 분들 결과물이나 피드백을 참고해서 4를 완성하긴 했지만 반쪽짜리 공부 같다는 느낌을 계속 받아서 호텔까지 해보게 됐던 것 같다.

 

그래도 다행인 점은, 이때 자료형에 대해서 어느정도 이해를 했고 클래스끼리 연결하는 방법도 어렴풋이 알게 되었다. 

아래는 최종 완성 코드다.

 

Main

fun main(args: Array<String>) {

    println("숫자를 입력해주세요.")
    var num1 = readLine()!!.toDouble()

    println("연산자를 넣어주세요(+, -, /, *)")
    val operate = readLine()!!.toString()

    println("숫자를 입력해주세요.")
    var num2 = readLine()!!.toDouble()

    val AbstractOperation : AbstractOperation = when (operate) {
        "+" -> AddOperation()
        "-" -> SubstractOperation()
        "*" -> MultiplyOperation()
        "/" -> DivideOperation()
        else -> throw IllegalArgumentException("잘못된 입력입니다. 연산자만 넣어주세요.")
    }

    val calc = Calculator(AbstractOperation)
    val result = calc.operate(num1, num2)

    println("정답은 ${result}입니다.")
}

 

Calculator

class Calculator (
    private val operation: AbstractOperation
) {
    fun operate(num1: Double, num2: Double): Double {
        return operation.operate(num1, num2)
    }
}

 

AbstractOperation

abstract class AbstractOperation {
    abstract fun operate(num1: Double, num2: Double): Double
}

 

AddOperation / SubstractOperation / MultiplyOperation / DivideOperation

// 더하기
class AddOperation: AbstractOperation() {
    override fun operate(num1: Double, num2: Double): Double {
        return (num1 + num2).toDouble()
    }
}

// 빼기
class SubstractOperation: AbstractOperation() {
    override fun operate(num1: Double, num2: Double): Double {
        return (num1 - num2).toDouble()
    }
}

// 곱하기
class MultiplyOperation: AbstractOperation() {
    override fun operate(num1: Double, num2: Double): Double {
        return (num1 * num2).toDouble()
    }
}

// 나누기
class DivideOperation: AbstractOperation() {
    override fun operate(num1: Double, num2: Double): Double {
        return (num1 / num2).toDouble()
    }
}

 

마무리

과정 합류 이후 처음으로 하게 된 개인과제였기 때문에 좋은 결과를 내고 싶어서 많이 고심했었다.

아직 기초 개념이 다 이해되지 않은 상황에서 무턱대고 아는 부분만 가지고 만들어 보겠다고 코드부터 짰었다.

지금 생각하면 이 덕분에 첫 줄을 쓰는걸 무서워하지 않게 되었지만, 이때 제대로 쌓지 못한 상속에 대한 개념이해 부족이 아직도 발목을 잡는 느낌이기도 하다.