2024. 3. 8. 17:47, ๐ฑAndroid Study
๋ฐ์ํ
1. ๊ฐ๋จํ ์ฌ์น์ฐ์ฐ ๊ตฌํ
package com.limheejin.calculator
class Calculator {
fun main() {
println("=============๊ณ์ฐ๊ธฐ=============")
println("์๋
ํ์ธ์! ์ฌ์น์ฐ์ฐ ๊ณ์ฐ๊ธฐ์
๋๋ค.")
println("๊ณ์ฐ์ ์ํ์๋ ์ ์ ๋ ๊ฐ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์. ")
var num1 = Integer.parseInt(readLine())
var num2 = Integer.parseInt(readLine())
println("์ํ์๋ ์ฐ์ฐ์ ๊ธฐํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ (+, -, *, / )")
val operator = readLine()
val result =
when (operator) {
"+" -> num1 + num2
"-" -> num1 - num2
"*" -> num1 * num2
"/" -> num1 / num2
else -> throw Exception("์๋ชป๋ ์ฐ์ฐ์์
๋๋ค. ๊ณ์ฐ๊ธฐ๋ฅผ ๋ค์ ์ผ์ฃผ์ธ์.")
}
println("${num1} ${operator} ${num2} = ${result} ์
๋๋ค.")
println("๋ค์ ์งํํ์๊ฒ ์ต๋๊น? ๋ค: 1 / ์๋์ค, ๋๋ด๊ฒ ์ต๋๋ค: -1 ")
var isExit = readLine()!!.toInt()
when (isExit){
1 -> main()
-1 -> println("๊ณ์ฐ์ ์ข
๋ฃํ๊ฒ ์ต๋๋ค. ์ด์ฉํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.")
else -> throw Exception("์๋ชป๋ ์ฐ์ฐ์์
๋๋ค. ๊ณ์ฐ๊ธฐ๋ฅผ ๋ค์ ์ผ์ฃผ์ธ์.")
}
}
}
- ๋จ์ผ ํด๋์ค ๋ด์์ main ๋ฉ์๋๋ง์ ์ด์ฉํด ๊ตฌํํ ๊ฐ๋จํ ์ฝ๋๋ค.
- ๊ฐ๋จํ ์ฌ์น์ฐ์ฐ, 1์ ์ ๋ ฅํ ์ ๊ณ์ฐ ๋ฐ๋ณต, -1์ ์ ๋ ฅํ ์ ์ข ๋ฃ๋ฉ์์ง ์ถ๋ ฅ ์ ๋์ ๊ธฐ๋ฅ์ด ์๋ค.
- ์๋ชป๋ ์ซ์๋ฅผ ์ ๋ ฅํ์ ๋์ ์์ธ์ฒ๋ฆฌ๋ ์๊ณ , ์ ์๊ฐ ์๋ ์ค์ ๊ณ์ฐ๋ ๋ชปํ๋ค.
- throw Exception์์ Try catch Finally ์ฒ๋ฆฌ๋ ์๋ค.
๋๋ณด๊ธฐ
์ค์ ๊ตฌํ
Main.kt
fun main() {
val calculator = Calculator()
while(true) { //while์ ํ๋ผ๋ฏธํฐ๋ฅผ true๋ก ๋ฌ์ ๋ฌดํ ๋ฃจํ
val select = readLine()!!.toInt()
println("[1]๋ง์
, [2]๋บ์
, [3]๊ณฑ์
, [4]๋๋์
, [5]๋๋จธ์ง, [-1]์ข
๋ฃ")
val num1 = readLine()!!.toInt()
println("์ฒซ ๋ฒ์งธ ์ซ์ ์
๋ ฅ")
val num2 = readLine()!!.toInt()
println("๋ ๋ฒ์งธ ์ซ์ ์
๋ ฅ")
if(select == 1) {
calculator.addOperation(num1, num2)
} else if(select == 2) {
calculator.minusOperation(num2, num1)
} else if(select == 3) {
calculator.multipleOperation(num1, num2)
} else if(select == 4) {
calculator.divideOperation(num2, num1)
} else if(select == 5) {
calculator.restOperation(num2, num1)
} else {
break
}
}
println("์ข
๋ฃ")
}
Calculator.kt
class Calculator {
fun addOperation(num1: Int, num2: Int) {
val result = num1 + num2
println("๊ฒฐ๊ณผ๊ฐ์: ${result}์
๋๋ค. ")
}
fun minusOperation(num1: Int, num2: Int) {
val result = num2 - num1
println("๊ฒฐ๊ณผ๊ฐ์: ${result}์
๋๋ค. ")
}
fun multipleOperation(num1: Int, num2: Int) {
val result = num1 * num2
println("๊ฒฐ๊ณผ๊ฐ์: ${result}์
๋๋ค. ")
}
fun divideOperation(num1: Int, num2: Int) {
val result = num2 / num1
println("๊ฒฐ๊ณผ๊ฐ์: ${result}์
๋๋ค. ")
}
fun restOperation(num1: Int, num2: Int) {
val result = num2 % num1
println("๊ฒฐ๊ณผ๊ฐ์: ${result}์
๋๋ค. ")
}
}
2. ํด๋์ค์ ๋ถ๋ฆฌ์ ๋จ์ผ ์ฑ ์ ์์น
Main.kt
fun main() {
val addCalc = AddOperation()
val minusCalc = SubstractOperation()
val multipleCalc = MultiplyOperation()
val divideCalc = DivideOperation()
addCalc.addOperation(10, 20)
minusCalc.minusOperation(20, 10)
multipleCalc.multiplyOperation(10, 20)
divideCalc.divideOperation(20, 10)
}
Calculator.kt
open class Calculator {
open fun operate(num1: Int, num2: Int)
}
AddOperation.kt
class AddOperation: Calculator() {
override fun operate(num1: Int, num2: Int) {
val result = num1 + num2
println("๊ฒฐ๊ณผ๊ฐ์: ${result}์
๋๋ค. ")
}
}
SubstractOperation.kt
class SubstractOperation: Calculator() {
override fun operate(num1: Int, num2: Int) {
val result = num2 - num2
println("๊ฒฐ๊ณผ๊ฐ์: ${result}์
๋๋ค. ")
}
}
MultiplyOperation.kt
class MultiplyOperation: Calculator() {
override fun operate(num1: Int, num2: Int) {
val result = num1 * num2
println("๊ฒฐ๊ณผ๊ฐ์: ${result}์
๋๋ค. ")
}
}
DivideOperation.kt
class DivideOperation: Calculator() {
override fun operate(num1: Int, num2: Int) {
val result = num2 / num1
println("๊ฒฐ๊ณผ๊ฐ์: ${result}์
๋๋ค. ")
}
}
- ๊ฐ ๊ธฐ๋ฅ์ ๋ง๊ฒ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ๊ณ , Calculator ํด๋์ค๋ ๋ฃ์ด์ค๋ค.
- ๋ชจ๋ ํด๋์ค๊ฐ 2๊ฐ์ ๊ฐ์ ์ ๋ ฅ ๋ฐ๋๋ค๋ ๊ฒ์ ๊ณตํต์ ์ด๋ฏ๋ก, Calculator ํด๋์ค์์๋ ๋ ๊ฐ์ ๊ฐ์ ๋ฐ๋ ๋ฉ์๋๋ฅผ ๋ง๋ ๋ค. ๋ํ ์์์ ํ ์ ์๊ฒ ํด๋์ค์ ํจ์์ open ํค์๋๋ฅผ ๋ฃ์ด์ค๋ค.
- ๊ฐ๊ฐ์ ์ฌ์น์ฐ์ฐ ํด๋์ค์์ Calculator ํด๋์ค๋ฅผ ์์๋ฐ๊ณ operate ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ค.
- ๊ฐ์ฒด์งํฅ 5์์น(SOLID) ์ค SRP๋ ํ๋์ ๊ฐ์ฒด๋ ๋ฐ๋์ ํ๋์ ๋์๋ง์ ์ฑ ์์ ๊ฐ๋๋ค๋ ์์น์ด๋ค.
- ๊ฐ์ฒด๊ฐ ๋ด๋นํ๋ ๋์(์ฑ ์)์ด ๋ง์์ง์๋ก ํด๋น ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์ํฅ๋์ ์๊ณผ ๋ฒ์๊ฐ ๋งค์ฐ ์ปค์ง๋ค. ๋จ์ผ ์ฑ ์ ์์น์ ํน์ ๊ฐ์ฒด์ ์ฑ ์ ์์กด์ฑ ๊ณผ์ค์ ์ต๋ํ ์ง์ํ๊ธฐ ์ํ ์์น์ด๋ค.
3. ์ถ์ํ, ํด๋์ค ๊ฐ์ ๊ฒฐํฉ๋, ์์กด์ฑ(์์กด์ฑ ์ญ์ ์์น)
Main.kt
fun main() {
val addCalc = Calculator(AddOperation())
println("10๋ํ๊ธฐ 20 ๊ฒฐ๊ณผ๋ : ${addCalc.operate(10, 20)} ์
๋๋ค")
val minusCalc = Calculator(SubstractOperation())
println("20๋นผ๊ธฐ 10 ๊ฒฐ๊ณผ๋ : ${minusCalc.operate(20, 10)} ์
๋๋ค")
val multipleCalc = Calculator(MultiplyOperation())
println("10๊ณฑํ๊ธฐ 20 ๊ฒฐ๊ณผ๋ : ${multipleCalc.operate(10, 20)} ์
๋๋ค")
val divideCalc = Calculator(DivideOperation())
println("20๋๋๊ธฐ 10 ๊ฒฐ๊ณผ๋ : ${divideCalc.operate(20, 10)} ์
๋๋ค")
}
Calculator.kt
class Calculator(private val operator: AbstractOperation) {
fun operate(num1: Int, num2: Int): Double {
return operator.operate(num1, num2)
}
}
AbstractOperation.kt
abstract class AbstractOperation {
abstract fun operate(num1: Int, num2: Int): Double
}
AddOperation.kt
class AddOperation: AbstractOperation() {
override fun operate(num1: Int, num2: Int): Double = (num1 + num2).toDouble()
}
SubstractOperation.kt
class SubstractOperation: AbstractOperation() {
override fun operate(num1: Int, num2: Int): Double = (num1 - num2).toDouble()
}
MultiplyOperation.kt
class MultiplyOperation: AbstractOperation() {
override fun operate(num1: Int, num2: Int): Double = (num1 * num2).toDouble()
}
DivideOperation.kt
class DivideOperation: AbstractOperation() {
override fun operate(num1: Int, num2: Int): Double {
require(num2 != 0) {
ArithmeticException("Divide by Zero")
}
return (num1 / num2).toDouble()
}
}
- open class: ์ผ๋ฐ์ ์ธ ํด๋์ค, ๋จ๋
์ผ๋ก ๊ฐ์ฒด๊ฐ ๋์ด ์ฌ์ฉํ ์ ์์
abstract class: ์ถ์ ํด๋์ค, ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ์ ์์. ๊ตฌํ ์์ด ์ ์ธ๋ง ๋์ด ์์ด, ์์ ๋ฐ ์ฌ์ ์๋ง ๊ฐ๋ฅ - ๊ฐ์ฒด์งํฅ 5์์น(SOLID) ์ค DIP๋ "์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์ ๋๋ค" ๋ ์์น์ด๋ค.
- ์์ ๋ณด๋ค ๋ณํํ๊ธฐ ์ฌ์ด ๊ฒ์ ์์กดํด์๋ ์ ๋๊ณ , ๊ฑฐ์ ๋ณํ๊ฐ ์๋ ๊ฐ๋ ์ ์์กดํด์ผ ํ๋ค
- ์ถ์ํ๋ฅผ ์ํด AbstractOperation์ด๋ผ๋ ์ถ์ํด๋์ค ์์ฑ ํ operate ์ถ์๋ฉ์๋ ์์ฑ
- ๊ธฐ๋ฅ ํด๋์ค์์ ์ถ์ํด๋์ค๋ฅผ ์์ํ๊ณ ์ค๋ฒ๋ผ์ด๋ฉ
- Divide์์ ๋๋๊ธฐ 0์ด ๋ถ๊ฐ๋ฅํ ์์ธ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฒ๋ฆฌ
- (์ดํด ์ ๋จ) Calculator ํด๋์ค๋ ์์ฑ์๋ฅผ ํตํด operator๋ผ๋ ์ด๋ฆ์ AbstractOperation ํ์
๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋๋ค.
์ด ๋งค๊ฐ๋ณ์๋ Calculator์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์ ๊ณต๋๋ ์ฐ์ฐ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ธ๋ค.
operate ํจ์๋ ๋ ๊ฐ์ ์ ์๋ฅผ ๋ฐ์๋ค์ด๊ณ , operator๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ฐ์ฐ์ ์ํํ ๋ค Double ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
์ฌ๊ธฐ์ operator ๊ฐ์ฒด์ ์ค์ ๋์์ AbstractOperation ํด๋์ค๋ฅผ ๊ตฌํํ ํ์ ํด๋์ค์ ์ํด ๊ฒฐ์ ๋๋ค. - ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ง์ ๊ณ์ฐ๊ธฐ, ๋บ์ ๊ณ์ฐ๊ธฐ, ๊ณฑ์ ๊ณ์ฐ๊ธฐ๋ฅผ ์ผ์ผํ ๋ถ๋ฌ์ค๋ ๊ฒ ์๋๋ผ ๋ค ๊ฐ์ด ๊ณ์ฐ๊ธฐ๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋๋ค.
4. ๊ธฐ๋ฅ ์ถ๊ฐ (3๊ฐ ์ด์์ ์ ์ฐ์ฐ ์ ๋ถํธ ์ฐ์ ์์, ๊ดํธ ์ฌ์ฉ ์ ์ฐ์ ์์ ๋ฑ)
๋๋ณด๊ธฐ
Main.kt
fun main() {
val addCalc = Calculator(AddOperation())
println("10๋ํ๊ธฐ 20 ๊ฒฐ๊ณผ๋ : ${addCalc.operate(10, 20)} ์
๋๋ค")
val minusCalc = Calculator(SubstractOperation())
println("20๋นผ๊ธฐ 10 ๊ฒฐ๊ณผ๋ : ${minusCalc.operate(20, 10)} ์
๋๋ค")
val multipleCalc = Calculator(MultiplyOperation())
println("10๊ณฑํ๊ธฐ 20 ๊ฒฐ๊ณผ๋ : ${multipleCalc.operate(10, 20)} ์
๋๋ค")
val divideCalc = Calculator(DivideOperation())
println("20๋๋๊ธฐ 10 ๊ฒฐ๊ณผ๋ : ${divideCalc.operate(20, 10)} ์
๋๋ค")
val myStack = MyStack()
val calResult = myStack.getPostFixExpressionOperation("(2 + 4) * 4 / 2 * 12")
println("๊ฒฐ๊ณผ: ${calResult}์
๋๋ค")
}
Calculator.kt, ๊ธฐ๋ฅOperation.kt ๋ชจ๋ ์์ 3๋ฒ๊ณผ ๋์ผ
MyStack.kt
class MyStack {
fun getPostFixExpressionOperation(originalExpression: String): Int {
val stack = Stack<String>()
val arr = strToArr(originalExpression)
var result = ""
for(e in arr) {
when(e) {
"+", "-", "*", "/" -> {
while(!stack.isEmpty() && precedence(stack.peek()) >= precedence(e)) {
result += stack.pop() + " "
}
stack.push(e)
}
"(" -> {
stack.push(e)
}
")" -> {
while(stack.peek() != "(") {
result += stack.pop() + " "
}
stack.pop() // "(" ์ ๊ฑฐ
}
else -> {
result += "$e "
}
}
}
while(!stack.isEmpty()) {
result += stack.pop() + " "
}
println("---์ต์ข
---")
println("ํ์ํ๊ธฐ๋ฒ: $result")
val realResult = finalCalc(result)
println("๊ฒฐ๊ณผ: $realResult")
return realResult
}
fun finalCalc(result: String): Int {
val stack = Stack<String>()
val calResult = result.split(" ")
var result = 0
for(e in calResult) {
when(e) {
"+" -> {
result = stack.pop().toInt() + stack.pop().toInt()
stack.push(result.toString())
}
"-" -> {
result = -stack.pop().toInt() + stack.pop().toInt()
stack.push(result.toString())
}
"*" -> {
result = stack.pop().toInt() * stack.pop().toInt()
stack.push(result.toString())
}
"/" -> {
val num2 = stack.pop().toInt()
val num1 = stack.pop().toInt()
result = num1 / num2
stack.push(result.toString())
}
else -> {
stack.push(e)
}
}
}
return result
}
fun strToArr(str: String): Array<String> {
var tempStr = str.replace("(", "( ")
tempStr = tempStr.replace(")", " )")
return tempStr.split(" ").toTypedArray()
}
fun precedence(operator: String): Int {
return when(operator) {
"+", "-" -> 1
"*", "/" -> 2
else -> 0
}
}
}
- ์ฐ์ ์์ ์ฒ๋ฆฌ๋ฅผ ์ํด Stack๊ณผ ํ์ ์ฐ์ฐ์ ๊ฐ๋ ์ ์์์ผ ํ๋ค.
- ์ฐ์ฐ์ ์ฐ์ ์์
(1) ( )
(2) * / %
(4) + - - ๋ฌธ๋ฒ ๊ณต๋ถ๋ฅผ ๋ค ํ๋ค 3์ 15์ผ์ ๋ค์ ๋์์ค์
๋ฐ์ํ
๐ฌ C O M M E N T