본문 바로가기

개발 노트/Kotlin

프로그래밍 기초 과제 - 계산기

- 필수구현 기능

 

 

 

- 선택 구현 기능

 

 

LV4까지 진행해주었다

 

 

 

먼저 추상클래스를 만들어서 클래스를 추상화해준다

추상화는 클래스의 이름과 클래스 안에 있음직한 기능을 유추해서 메서드 이름으로만 먼저 나열하는것이다

그런다음 추상클래스를 상속받은 클래스에서는 오버라이딩을 통해 구현해줘야한다!!

 

// 추상메소드로 만들기
abstract class AbstractOperation {
    abstract fun calculator(x: Int, y: Int) : Int
}

AbstractOperation.kt

 

abstract 키워드를 사용해서 추상화를 시켜줬고,

입력값과 반환값이 Int인 간단한 추상메소드를 만들었다

 

 

 

class AddAbstractOperation: AbstractOperation() {

    override fun calculator (a: Int, b: Int) : Int {
        var answer = a + b

        return answer
    }
}

AddAbstractOperation.kt

 

이제 AddAbstractOperation클래스에서 아까만든 추상클래스인 AbstractOperation클래스를 상속받는다

그리고 추상화했던 calculator함수를 오버라이딩해서 a+b값을 리턴하는 함수를 구현해준다!

 

 

 

마찬가지로 뺄셈,곱셈,나눗셈,나머지 연산자와 관련된 클래스도 똑같이 추상클래스를 상속받고 오버라이딩해서 구현해준다!

class SubstractAbstractOperation: AbstractOperation() {

    override fun calculator (a: Int, b: Int): Int {
        var answer = a - b

        return answer
    }
}

SubstractAbstractOperation.kt

 

class MultiplyAbstractOperation: AbstractOperation() {

    override fun calculator (a: Int, b: Int): Int {
        var answer = a * b

        return answer
    }
}

MultiplyAbstractOperation.kt

 

class DivideAbstractOperation: AbstractOperation() {

    override fun calculator (a: Int, b: Int): Int {
        var answer = a / b

        return answer
    }
}

DivideAbstractOperation.kt

 

class RemainAbstractOperation: AbstractOperation() {

    override fun calculator (a: Int, b: Int) : Int {
        var answer = a % b

        return answer
    }
}

RemainAbstractOperation.kt

 

 

 

이제 메인함수에서 출력할 기능들을 구현해준다!

fun main() {

    println("계산기 시작!!!")
    println("------------")
    println("계산할 연산식을 입력해주세요. 연산종료는 -1을 눌러주세요")



    // 숫자1 입력
    var num1 = readLine()!!.toInt()         



    // 반복문이 true이면 무한대로 실행
    while (true) {

        // 연산자 입력받기
        var curcul = readLine()!!.toString()   


        // -1입력시에는 연산종료(빠져나옴)
        if (curcul == "-1"){
            println("연산종료")
            break
        }


        // 숫자2 입력받기
        var num2 = readLine()!!.toInt()        


            val a =

                when (curcul) {
                "+" -> AddAbstractOperation()
                "-" -> SubstractAbstractOperation()
                "*" -> MultiplyAbstractOperation()
                "/" -> DivideAbstractOperation()
                "%" -> RemainAbstractOperation()
                else -> {
                    println("적용되지 않는 연산자입니다. 다른 연산자를 입력해주세요")
                    continue
                }
            }


            // 계속 추가로 값을 누적해서 계산하도록
            num1 = a.calculator(num1,num2)
            println("= ${num1} 입니다!!!")
            println("추가로 더 연산해보세요")

    }

}

Main.kt

 

일단 최종적으로 구현한 코드는 숫자와 연산자를 직접 입력받고 연산을 무한대로 할수있게하고, -1을 누르면 프로그램을 아얘 종료하도록 구현하였다

 

그래서 readLine을 통해 첫번째 숫자를 입력받고

while(true)를 사용해서 무한 반복문을 돌면서 연산자와 숫자를 입력받은 후, when문을 사용해서 해당하는 연산자에 따라 아까 짰던 관련클래스를 실행하도록 해주었다

 

연산을 계속 입력하면 이전값에 연산한값이 누적되야되기 때문에

when문을 a라는 변수에 담아놓고 a.calculator(num1,num2)한 값을 num1에다 넣어 누적해서 연산하도록 해준다!!

이부분에서 코드짤때 헤맸었다..

 

 

 

# 결과 콘솔창

 

이런식으로 추가로 연산하면 누적되어 연산되는것을 확인할 수 있다

그리고 -1을 누르면 연산이 종료되는것까지 볼수있다