TIL(Today I Learned)

Kotlin으로 만드는 단순 계산기

Happy._. 2024. 4. 22. 20:30

Kotlin 문법을 배우고 적용해보기 위해 단순 계산을 하는 계산기를 만들어 보았다.

 

  1. Calculator 클래스를 생성
  2. 클래스 내 사칙연산을 수행하는 함수를 작성
  3. 메인 함수에서 Calculator 클래스의 인스턴스를 생성
  4. 사칙연산 함수를 하나씩 실행
class Calculator {
    val add: (Int, Int) -> Int = { a, b -> a + b }
    val sub: (Int, Int) -> Int = { a, b -> a - b }
    val mul: (Int, Int) -> Int = { a, b -> a * b }
    val div: (Int, Int) -> Int = { a, b -> a / b }
}

 

fun main() {
    val calculator = Calculator()

    println(calculator.add(2, 3)) // 5
    println(calculator.sub(7, 3)) // 4
    println(calculator.mul(5, 6)) // 30
    println(calculator.div(12, 3)) // 4
}

 

 

나눗셈의 경우 몫만 알 수 있으므로 나머지를 구하는 함수도 추가한다.

class Calculator {
    // ...
    val mod: (Int, Int) -> Int = { a, b -> a % b }
}
fun main() {
    // ...
    println(calculator.mod(9, 5)) // 4
}

 

 

이번에는 하나의 클래스에 모든 함수를 정의하는 대신 추상 클래스의 메서드를 상속 받아서 각각의 클래스를 만들어서 구현하는 방법으로 변경해 본다.

abstract class Calculator<T> {
    abstract fun operate(firstNumber: T, secondNumber: T): T
}
class AddOperation : Calculator<Int>() {
    override fun operate(firstNumber: Int, secondNumber: Int) = firstNumber + secondNumber
}
class SubstractOperation: Calculator<Int>() {
    override fun operate(firstNumber: Int, secondNumber: Int) = firstNumber - secondNumber
}
class MultiplyOperation: Calculator<Int>() {
    override fun operate(firstNumber: Int, secondNumber: Int) = firstNumber * secondNumber
}
class DivideOperation : Calculator<Double>() {
    override fun operate(firstNumber: Double, secondNumber: Double): Double = firstNumber / secondNumber
}
fun main() {
    val add = AddOperation()
    println(add.operate(2, 3)) // 5

    val sub = SubstractOperation()
    println(sub.operate(5, 3)) // 2

    val mul = MultiplyOperation()
    println(mul.operate(6, 6)) // 36

    val div = DivideOperation()
    println(div.operate(6.0, 2.5)) // 2.4
}

 

 

클래스는 단일 상속만 가능하므로 인터페이스로 다중 구현이 가능하게 만들어 본다.

인터페이스는 추상 메서드를 포함할 수 있으며 abstract 키워드를 생략할 수 있다. (컴파일 된 코드를 보면 abstract가 붙어 있음)

인터페이스를 구현하는 코드는 상속받는 클래스들의 슈퍼 클래스명 옆에 ()만 제거하면 된다. (override 하는 것은 동일)

interface Calculator<T> {
    fun operate(firstNumber: T, secondNumber: T): T
}