ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] 간단한 계산기 피드백 적용
    안드로이드 2024. 3. 11. 17:05

    ✏️ TIL(Today I Learned)

    추상화를 사용하였으니, num1, num2 또한 추상화하면 좋을 것 같다고 피드백을 받아서 적용해봤다.

     

    우선 아래와 같이 AbstractOperation부터 수정을 하였고

    // 수정 전
    abstract class AbstractOperation {
        abstract fun operate(num1: Double, num2: Double): Double
    }
    
    // 수정 후
    abstract class AbstractOperation {
        abstract val num1: Double
        abstract val num2: Double
        abstract fun operate(num1: Double, num2: Double): Double
    }

     

    상속을 받은 클래스들을 수정했다.

    // 수정 전
    class Calculator {
        fun calculate(operation: AbstractOperation, operand1: Double, operand2: Double): Double {
            return operation.operate(operand1, operand2)
        }
    }
    
    // 수정 후
    class Calculator {
        fun calculate(operation: AbstractOperation): Double {
            return operation.operate(operation.num1, operation.num2)
        }
    }

     

    그러면서 예외를 throw하는 대신 require()을 사용했다.

    // 수정 전
    class DivideOperation(override val num1: Double, override val num2: Double) : AbstractOperation() {
        override fun operate(num1: Double, num2: Double): Double {
            if (num2 == 0.0) {
                throw IllegalArgumentException("0으로 나눌 수 없습니다.")
            }
            return num1 / num2
        }
    }
    
    // 수정 후
    class DivideOperation(override val num1: Double, override val num2: Double) : AbstractOperation() {
        override fun operate(num1: Double, num2: Double): Double {
            // 0.0보다 크지 않을 경우 메세지를 이용하여 익셉션을 던진다
            require(num2>0.0) { "0으로 나눌 수 없습니다." }
            return num1 / num2
        }
    }

     

    매개변수에 추상화를 적용했으니까, 객체 생성하는 코드도 수정했다. 그러면서 named parameter을 사용했다. 

    // 수정 전
    "+" -> Calculator.calculate(num1, num2, AddOperation())
    "-" -> Calculator.calculate(num1, num2, SubtractOperation())
    
    // 수정 후
    val calculator by lazy { Calculator() } 
    // lazy를 사용함으로써 초기화를 필요로 하는 시점까지 객체를 생성X
    // calculator 변수를 이용하게 될 경우 Calculator 인스턴스 생성O
    
    "+" -> calculator.calculate(AddOperation(num1=num1, num2=num2)) // 이 때, calculator 속성 초기화
    "-" -> calculator.calculate(SubtractOperation(num1=num1, num2=num2)) // named parameter을 사용

     

    📝 공부한 Kotlin 요약 정리

    require(): 코틀린에서 주어진 조건이 충족되지 않으면 예외를 발생시키는 역할을 한다.
    이 함수는 주로 사전조건을 검증하거나 함수의 입력 매개변수 등에서 특정 조건이 만족되는지 확인할 때 사용한다.

    // 예시) 만약 require() 조건이 충족되지 않으면, IllegalArgumentException 발생
    fun divide(a: Int, b: Int) {
        require(b != 0) { "Divider 'b' should not be zero." }
    
        val result = a / b
        println("Result: $result")
    }
    
    fun main() {
        divide(10, 2)  // 정상 동작
        divide(10, 0)  // IllegalArgumentException이 발생
    }

     

    named parameter: 함수 호출 시에 파라미터의 이름을 명시적으로 지정하여 인자를 전달하는 방식이다.
    함수 혹은 생성자를 호출하면서 argument를 파라미터에 넘길때는 항상 named parameter를 사용하는 것이 코드를 명확하게 만들 수 있다.

    class Person(val name: String, val age: Int)
    
    val person = Person("Law", 26) 
    val person = Person(name = "John", age = 30) // 훨씬 명확하다.
Designed by Tistory.