Kotlin 문법을 배우고 적용해보기 위해 단순 계산을 하는 계산기를 만들어 보았다.
- Calculator 클래스를 생성
- 클래스 내 사칙연산을 수행하는 함수를 작성
- 메인 함수에서 Calculator 클래스의 인스턴스를 생성
- 사칙연산 함수를 하나씩 실행
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
}
'TIL(Today I Learned)' 카테고리의 다른 글
TIL - Kotlin에서 main 함수 실행 시 LinkageError 발생 (0) | 2024.04.29 |
---|---|
SQL - 날짜에 관한 group by 문제 (0) | 2024.04.25 |
두 번째 Kotlin 계산기 구현 - 객체지향에 대해 생각하기 (0) | 2024.04.24 |
TIL - ConcurrentModificationException 예외 발생 (0) | 2024.04.23 |
TIL - SQL 문제에서 가격 구간 구하는 데에 어려움을 겪음 (0) | 2024.04.15 |