드디어 계산기 lv3까지 했다.
kgdrjsen/myCalcul (github.com)
Mcal이 일단 완료한 파일이다.
- Lv3 : AddOperation(더하기), SubstractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스를을 만든 후 클래스간의 관계를 고려하여 Calculator 클래스와 관계를 맺기
- 관계를 맺은 후 필요하다면 Calculator 클래스의 내부코드를 변경하기
- 나머지 연산자(%) 기능은 제외합니다.
- Lv2 와 비교하여 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
- hint. 클래스의 책임(단일책임원칙)
- 관계를 맺은 후 필요하다면 Calculator 클래스의 내부코드를 변경하기
lv3의 달성 조건이다.
우선 다른 operation들을 따로 만들어 주고
이렇게 각 연사자별 클래스를 만들어줬다.
- 빼기
class MinusOperation {
fun operate(num1:Int, num2:Int) : Double = (num1-num2).toDouble()
}
- 더하기
class AddOperation {
fun operate(num1:Int, num2:Int) : Double = (num1+num2).toDouble()
}
- 곱하기
class MultipeOperation {
fun operate(num1:Int, num2:Int) : Double = (num1*num2).toDouble()
}
- 나누기
class DivideOperation {
fun operate(num1:Int, num2:Int) : Double = (num1/num2).toDouble()
}
그리고 이것을 계산해주는 class도 따로 만들었다.
class Calculator {
fun addOperation (operation: AddOperation, num1: Int, num2: Int) : Double {
return operation.operate(num1,num2)
}
fun minusOperation (operation: MinusOperation, num1: Int,num2: Int) : Double {
return operation.operate(num1,num2)
}
fun multipleOperation (operation: MultipeOperation, num1: Int, num2: Int) : Double {
return operation.operate(num1,num2)
}
fun divideOperation (operation: DivideOperation, num1: Int, num2: Int) : Double {
return operation.operate(num1,num2)
}
}
이제 얘네들을 main에 연결시켜 주자.
//println("1 더하기 2 결과는 : ${calc.addOperation(AddOperation(),1,2)}입니다")
//println("1 빼기 2 결과는 : ${calc.minusOperation(MinusOperation(),1,2)}입니다")
//println("1 곱하기 2 결과는 : ${calc.multipleOperation(MultipeOperation(),1,2)}입니다")
//println("1 나누기 2 결과는 : ${calc.divideOperation(DivideOperation(),1,2)}입니다")
이거는 힌트로 나와있던거다. 맨위 더하기만 존재했는데 일단 4가지 경우의 수가 다 있어야 하니 일단 밑에 세개를 더 써놓고 전에 만들었던 lv2에 대입을 좀 해보았다.
fun main() {
println("계산기")
println("숫자를 입력하시오")
var num1 = readLine()!!.toInt()
println("연산자를 입력하시오")
var oper = readLine()!!.toString()
println("숫자를 입력하시오")
var num2 = readLine()!!.toInt()
val calc = Calculator()
var result =0.0
if (oper == "+") {
result = calc.addOperation(AddOperation(),num1,num2)
println("$num1 더하기 $num2 결과는 : $result 입니다")
} else if (oper == "-") {
result = calc.minusOperation(MinusOperation(),num1,num2)
println("$num1 빼기 $num2 결과는 : $result 입니다")
} else if (oper == "*") {
result = calc.multipleOperation(MultipeOperation(),num1,num2)
println("$num1 곱하기 $num2 결과는 : $result 입니다")
} else if (oper == "/") {
result = calc.divideOperation(DivideOperation(),num1,num2)
println("$num1 나누기 $num2 결과는 : $result 입니다")
}else {
println("다시 적으시오")
}
while (true) {
println("여기서 더 계산 하시려면 [1]번을, 종료하시려면 다른 키를 누르시오.")
var num3 = readLine()!!.toInt()
if (num3 == 1) {
println("연산자를 입력하시오")
} else {
println("종료합니다.")
break
}
var opp2 = readLine()!!.toString()
println("숫자를 입력하시오")
var num4 = readLine()!!.toInt()
var num5 = result.toInt()
if (opp2 == "+") {
result = calc.addOperation(AddOperation(),num5,num4)
println("$num5 더하기 $num4 결과는 : $result 입니다")
} else if (opp2 == "-") {
result = calc.minusOperation(MinusOperation(),num5,num4)
println("$num5 빼기 $num4 결과는 : $result 입니다")
} else if (opp2 == "*") {
result = calc.multipleOperation(MultipeOperation(),num5,num4)
println("$num5 곱하기 $num4 결과는 : $result 입니다")
} else if (opp2 == "/") {
result = calc.divideOperation(DivideOperation(),num5,num4)
println("$num5 나누기 $num4 결과는 : $result 입니다")
}else {
println("다시 적으시오")
}
continue
}
}
힌트로 얻었던건 if문에 다 대입해서 넣어보았다.
그리고 다시 계속 계산이 되어야 하기 때문에 while문까지 넣고 계산기는 이렇게 마무리 하였다. lv4까지 해보려 했으나...
매쏘드를 없애고 추상클래스에서 관리하기인데 오전 실시간 강의때 추상클래스에 대해 좀 쉽게 듣긴 했는데, 좀 애매하고 빨간 에러만 많아서 우선 다시 영상이 올라오고나서 그걸보고 다시 해보거나 튜터님을 찾아가봐야겠다.
우선 계산기는 lv3까지 진짜 lv3의 목표에 부합하는지는 지금 모르겠으나 이번주 과제인 키오스크 초안을 좀 잡아보았다.
여기도 각 속성별 클래스를 만들고 호출하는 방식까지 해놓았다.
1,2,3,4번 속성 클래스를 불러오게끔 만들어두고 0을 누르면 break를 걸어서 종료되게끔 해두었다. 그리고 추가적으로 이외에 다른 버튼을 누르면 다시 처음으로 돌아가게끔 return main()을 넣어두었다.
어차피 속성별로 printIn(" ")의 내용만 다르니 맥주 클래스만 찍은건데 저기 들어가는 1~5번의 메뉴 모두 진짜 인터넷에서 검색하여 찾은 메뉴들이다. 가격과 상품설명도 같이 찾아서 넣어두었다.
main에서 4번을 누르면 Beer클래스의 bee1이라는 함수를 가져오도록 해두었다. 그럼 이제 바로 맥주 종류가 뜨면서 다시 고르게 하는데 여기에 들어가는 변수는 bee2로 넣고 그것을 고를수 있도록 해두었다. 또 뒤로가기 기능을 위해 main에서 다시 입력하게 하기 위해 썼던 return main()을 다시 집어넣고 다시 main으로 돌아갈 수 있게 해두었다.
일단은 오늘 lv0~1까지의 뼈대를 잡아두었으니 내일 lv2를 목표로 해보아야겠다.