Kotlin 으로 Calculator 만들기
Lv1, 2
Lv1 : 더하기, 빼기, 나누기, 곱하기 연산을 수행할 수 있는 Calculator 클래스를 만들고, 클래스를 이용하여 연산을 진행하고 출력하기
Lv2 : Lv1에서 만든 Calculator 클래스에 나머지 연산을 가능하도록 코드를 추가하고, 연산 진행 후 출력하기
각각 연산자의 클래스를 만드는건가?
그럼 그 클래스들과 메인 calculator 는 무슨 관계지?
아니면 클래스 하나에서 네가지 연산을 다 할 수도 있나?
어제 한 Bird class 를 참고해서 class 안에서 다섯가지 연산을 할 수 있게 만들어봤다.
fun main() {
println("계산할 첫번째 값을 넣으세요")
var num1 = readLine()!!.toInt()
println("계산할 두번째 값을 넣으세요")
var num2 = readLine()!!.toInt()
println("${num1}과 ${num2}을 계산할 연산자를 입력하세요.")
var operator = readLine()!!
var answer = Calculator(num1, num2, operator).operation()
println(answer)
}
open class Calculator(num1:Int, num2:Int, operator:String) {
var num1:Int = 0
var num2:Int =0
var operator:String = ""
init {
this.num1 = num1
this.num2 = num2
this.operator = operator
}
val result = when(operator){
"+" -> num1 + num2
"-" -> num1 - num2
"*" -> num1 * num2
"/" -> num1 / num2
else -> num1 % num2
}
fun operation() {
println("${num1}과 ${num2}를 이용한 연산결과는 ${result}입니다.")
}
}
결과가 잘 나온다.
이제 각각의 연산자들 을 별개의 class 로 만들고 calsulator 를 부모 class 로 상속받게 만들어야 한다.
안드로이드 스튜디오 너무 낯설다 저장경로 때문에 많이 헤매고 있다
Lv.3
Lv3 : AddOperation(더하기), SubstractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스를을 만든 후 클래스간의 관계를 고려하여 Calculator 클래스와 관계를 맺기
-관계를 맺은 후 필요하다면 Calculator 클래스의 내부코드를 변경하기
-나머지 연산자(%) 기능은 제외합니다.
-Lv2 와 비교하여 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
--hint. 클래스의 책임(단일책임원칙)
1. 첫번째 시도
fun main 에서 숫자와 연산자를 받고
calculator 클래스를 통해 각각의 자식 클래스로 넘어가도록 했는데
자식이 부모를 상속할 때 받아오는 파라미터가 calculator 는 세 개를 받아오다보니 세 개를 무조건 넣어야 했다....
이게 아니고 더 간단하게 하는 방법이 있을텐데
2. 두번째 시도
main 에서 입력받은 연산자에 따라서 바로 자식 클래스로 넘겨서 함수를 결과값으로 가지도록 만들고
자식 클래스에서 override 한 함수는 부모 클래스의 함수와 타입이 같도록 했다.(부모 자식 함수의 타입이 다르다고 오류가 뜨더라)
결과
잘 된다.
Lv2 와 비교하여 어떠한 점이 개선 되었는가
Calculator class 가 책임지는 영역이 줄어들었다.
연산자별로 파일을 나누어서 보기에 편하다.
override를 통해 각각의 연산클래스들의 결과값을 다르게 도출해낼 수 있다.
단일책임원칙
어떤 클래스를 변경하는 원인은 딱 하나여야 한다
= 하나의 클래스가 하나의 기능을 갖도록 설계
여기서 끝??
아니다. 기능구현은 완성됐는데 뭔가 코드가 되게 많아보이지 않나?! 아니면 말고가 아니고
더 효율적인 방법은 없나? 더 줄일 수 없나?
Lv.4
Lv4 : AddOperation(더하기), SubtractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스들을 AbstractOperation라는 클래스명으로 만들어 사용하여 추상화하고 Calculator 클래스의 내부 코드를 변경합니다.
Lv3 와 비교해서 어떠한 점이 개선 되었는지 스스로 생각해 봅니다. hint. 클래스간의 결합도, 의존성(의존성역전원칙)
계산에 필요한 값들을 입력받을 main.kt 와 class 다섯 개다.
calculator class > abstract class > addoperation class, substract class, multiply class, divide operation
클래스 계층 구조를 이렇게 만들어놓고
calculator 클래스가 하던 일 :
1 인자를 변수에 대입
2 연산자에 따라 각각의 연산 클래스로 넘김
3 operation 함수 상속
이 역할을 추상 클래스와 나눈다?
사칙연산 calss 들이 공통적으로 하는 점 = operation fun 실행 -> 추상클래스가 가지고 override 함
역할 수정
main.kt : 입력받은 연산자에 따라 각각의 연산 클래스로 넘김
calculator 클래스 : 입력받은 인자를 변수에 지정
abstractoperation 클래스 : operation()함수를 만들어놓음
사칙연산 클래스 : 연산수행, 값 return
완성
main.kt
Calculator class
AbstractOperation class
연산 class
Int 를 Double 로 수정함
추상화
알고는 있지만 정확하게 표현하긴 어려운 것, 핵심적인 개념 또는 기능을 간추려내는
->불필요한 것들을 생략하고 중요한 것들만 중점을 두어 개략
Abstract Class 란?
추상 메소드를 선언했다면 자식 클래스는 해당 메소드를 반드시 구현하도록 강제된다.
객체지향 설명해놓은 것 중 가장 괜찮은 것 같아서 첨부
객체지향 설계를 위한 원칙 다섯 가지
Kotlin 의 ?? 와 !!
readLine() 과 readln()
마구잡이로 하니까 오류가 뜨는건 당연한 일,,,,
레벨 4에서 자꾸 막혀서 추상화 클래스에 대해 더 검색해보고 알맞게 적용하니깐 작동 된다.
'왕초보일지' 카테고리의 다른 글
231207 TIL (0) | 2023.12.07 |
---|---|
231206 TIL kotlin 접근제한자 지연초기화 예외처리 등등 (1) | 2023.12.06 |
231204 TIL (0) | 2023.12.04 |
231201 TIL (0) | 2023.12.01 |
231130 TIL (0) | 2023.11.30 |