Kotlin TIL(4) [Lv. 3 계산기]

jxxn_a·2023년 7월 20일
0

TIL

목록 보기
4/28

Kotlin으로 계산기를 만들어보자!

오늘은 드디어 3단계를 마무리지었다.
3단계를 진행하면서 있었던 오류들과 해결방안을 적어보고자한다!
(다음엔 꼭... 같은 실수를 반복하지 말자구!!!!)

◼ 3단계

3단계는 AddOperation(더하기), SubstractOperation(빼기),
MultiplyOperation(곱하기), DivideOperation(나누기)
연산 클래스를을 만든 후 클래스간의 관계를 고려하여
Calculator 클래스와 관계를 맺기

  • 관계를 맺은 후 필요하다면 Calculator 클래스의 내부코드를 변경하기
  • 나머지 연산자(%) 기능은 제외합니다.
  • Lv2 와 비교하여 어떠한 점이 개선 되었는지 스스로 생각해 봅니다.
  • hint. 클래스의 책임(단일책임원칙)

이렇게 제시되었다.

우선 AddOperation(더하기), SubstractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) class를 만들어준다.

클래스를 생성한 뒤 먼저 AddOperation 파일에 들어가서 예시로 들어주신 것을 넣어준다.

class AddOperation{
   fun operate(num1: Int, num2: Int): Double = (num1 + num2).toDouble()
}

또한 SubstractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 부분에도 class 이름만 바꿔서 동일하게 변경해준다.

그 다음 main을 완전 뒤집어야하는데 여기서 진짜 멘붕이왔다...

Lv. 1 / Lv. 2단계

package com.example.calculator

fun main() {
        val welcome = println("계산기를 실행했습니다.")
        val gate = println("==============================")

        val first = println("첫 번째 숫자를 작성해주세요.")
        var num1 = readLine()!!.toDouble()

        val second = println("연산 기호를 작성해주세요.")
        var operator = readLine()!!.toString()

        val last = println("두 번째 숫자를 작성해주세요.")
        var num2 = readLine()!!.toDouble()

        fun Operation() {
            if (operator == "+") {
                println("결과는 ${num1 + num2} 입니다.")
            } else if (operator == "-") {
               println("결과는 ${num1 - num2} 입니다.")
            } else if (operator == "*") {
                println("결과는 ${num1 * num2} 입니다.")
            } else if (operator == "/") {
                println("결과는 ${num1 / num2} 입니다.")
            } else if (operator == "%") {
               println("결과는 ${num1 % num2} 입니다.")
            } else {
                println("잘못된 부분이 있습니다. 다시 입력해주세요.")
            }
        }
    }

3단계
(+, -, *, /를 전부 선언을통해 나온 것이라 더 좋은 방법들도
많으니 이 부분은 참고만 하세요!!)

3단계를 보면 1, 2단계보다 추가 된 부분들과 삭제된 부분들이 많이 생겼는데

package com.example.Calculator

fun main(){
    val welcome = println("계산기를 실행했습니다.")
    val gate = println("==============================")

    val first = println("첫 번째 숫자를 작성해주세요.")
    val num1 = readLine()!!.toInt()

    val write = println("연산 기호를 작성해주세요.")
    val operator = readLine()!!.toString()

    val second = println("두 번째 숫자를 작성해주세요.")
    val num2 = readLine()!!.toInt()

    val addOperation = AddOperation()
    val result = addOperation.operate(num1, num2)
    val last = println("$num1 $operator $num2 의 값은 ${result}입니다.")

    val substractOperation = SubstractOperation()
    val result2 = substractOperation.operate(num1, num2)
    val lasta = println("$num1 $operator $num2 의 값은 ${result2}입니다.")

    val multiplyOperation = MultiplyOperation()
    val result3 = multiplyOperation.operate(num1, num2)
    val lastb = println("$num1 $operator $num2 의 값은 ${result3}입니다.")

    val divideOperation = DivideOperation()
    val result4 = divideOperation.operate(num1, num2)
    val lastc = println("$num1 $operator $num2 의 값은 ${result4}입니다.")

    if(operator == "$addOperation") {
        println("$last")
    } else if(operator == "$substractOperation") {
        println("$lasta")
    } else if(operator == "$multiplyOperation") {
        println("$lastb")
    } else if(operator == "$divideOperation") {
        println("$lastc")
    } else {
        println("잘못된 입력입니다. 다시 작성해주세요.")
    }
}


다른 클래스 파일을 연결을 어떻게 해야할지 정말 모르겠어서 튜터님께 여쭤보았는데 main에서 AddOperation 클래스를 생성해야한다고 하셨다.

그래서 class NewClass {}
val newClass = NewClass()를 AddOperationd으로 나타내면 어떻게 나올 것 같냐고 여쭤보셔서 순간적으로 멈칫했지만 그래도 잘 대답했다(?) 잘 했겠지?...
이렇게 class를 생성한 뒤에 .operate를 붙여주고 첫 번째, 두 번째 숫자의 변수명을 작성해주었다.
그 다음 결과를 출력해주는 부분까지 완성해주었다.

다른 클래스들도 동일한 방법으로 새롭게 클래스를 main에서 생성해주고 진행주었다.

val addOperation = AddOperation()
    val result = addOperation.operate(num1, num2)
    val last = "$num1 $operator $num2 의 값은 ${result}입니다."

그러고나서 이제 if문을 사용해서 마무리 지어주면 되는데 if문은 잘 작성해두었는데 결과가 계속 걸러지지 않고 전부 다 출력이 되는 그 와중에 맨 마지막에 Kotlin.unit이 같이 출력되어 구글링하다가 답이 너무 안 나와서 튜터님께 찾아갔다.

알고보니...

val last, val lasta, val lastb, val lastc에 println을 전부 적어두어서 if문이 소용이 없었던 것이다... ㅋㅋㅋㅋ 하... 진짜 튜터님이 말씀해주시자마자 이마를 짚었다...

그렇게 최종적으로 수정하고 run을 해보니 내가 원하는 출력값을 얻을 수 있었다.

그 와중에 android studio에서 if에 노란색 줄을 그어두길래 확인해봤더니 when문으로 바꾸라고 해서 when문으로 좀 더 깔끔하게 바꿔주었다!!

3단계 최종!!

package com.example.Calculator

import com.example.myapplication.AddOperation
import com.example.myapplication.DivideOperation
import com.example.myapplication.MultiplyOperation
import com.example.myapplication.SubstractOperation

fun main() {
    val welcome = println("계산기를 실행합니다.")
    val gate = println("==============================")

    val first = println("첫 번째 숫자를 작성해주세요.")
    val num1 = readLine()!!.toInt()

    val write = println("연산 기호를 작성해주세요.")
    val operator = readLine()!!.toString()

    val second = println("두 번째 숫자를 작성해주세요.")
    val num2 = readLine()!!.toInt()

    val addOperation = AddOperation()
    val result = addOperation.operate(num1, num2)
    val last = "$num1 $operator $num2 의 값은 ${result}입니다."

    val substractOperation = SubstractOperation()
    val result2 = substractOperation.operate(num1, num2)
    val lasta = "$num1 $operator $num2 의 값은 ${result2}입니다."

    val multiplyOperation = MultiplyOperation()
    val result3 = multiplyOperation.operate(num1, num2)
    val lastb = "$num1 $operator $num2 의 값은 ${result3}입니다."

    val divideOperation = DivideOperation()
    val result4 = divideOperation.operate(num1, num2)
    val lastc = "$num1 $operator $num2 의 값은 ${result4}입니다."

    when (operator) {
        "+" -> {
            println("$last")
        }
        "-" -> {
            println("$lasta")
        }
        "*" -> {
            println("$lastb")
        }
        "/" -> {
            println("$lastc")
        }
    }
}


AddOperation

SubstractOperation

MultiplyOperation

DivideOperation

2개의 댓글

comment-user-thumbnail
2023년 7월 20일

항상 좋은 글 감사합니다.

1개의 답글