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 란?
추상 메소드를 선언했다면 자식 클래스는 해당 메소드를 반드시 구현하도록 강제된다.
객체지향 설명해놓은 것 중 가장 괜찮은 것 같아서 첨부
💠 객체 지향 개념과 추상화 완벽 이해하기
객체 지향(OOP) 개념과 특징 객체 지향 프로그래밍 이란, 많은 객체(Objcet)들이 모여서 상호 협력하면서 데이터를 처리하는 방식의 프로그래밍 설계 방법을 일컫는다. 좀더 쉽게 말하면, 프로그램
inpa.tistory.com
객체지향 설계를 위한 원칙 다섯 가지
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 |