You will be fine

<Kotlin> 1. 코틀린 공부하기 전에 간단한 예제 만들기

by BFine
반응형

가.  공부하기전에..

 a.  개요

   -  계속 이론만 공부하면 재미없으니 두개의 숫자만 받아서 더하기 뺴기만 계산하는 다소 멍청한(?) 계산기를 만들어 봐야겠다.

   -  아직 코틀린을 공부 중이라 코틀린을 자바같이(?) 쓰는 것 일지도 모르겠다..

 

나.  계산기 구현 하기

 a.  더하기 빼기

  -  먼저 더하기 기능을 위해 테스트 코드를 먼저 작성해보자

  -  이제 인텔리제이의 기능을 이용해 Calculator 클래스와 .add 메서드를 자동 생성하여 만들어주자

  -  인텔이제이는 역시 최고다 .. 이제 테스트 코드를 살펴보면 오류도 사려졌고 실행해보면 당연히 통과한다.

  -  똑같이 빼기 기능도 복붙해서 만들자 (add 대신 plus를 쓴다는 구글링 결과에 따라서 메서드 이름을 바꿔보았다..)

 

나.  입력 구현하기

 a.  숫자 두개 입력받기

  -  입력 받는 여러 방법이 있는 듯 한데 자바 처음 배울때 하듯이 Scanner를 사용해서 입력을 받아보았다. 

  -  자바에서는 상상할 수 없는 코틀린의 재미난 키워드인 with를 사용하여 간단하게 만들 수가 있다. (나중에 키워드 정리해야할 것 같다..)

fun main(args: Array<String>) = with(Scanner(System.`in`)) {
    println("숫자 두개를 입력하세요")
    val num1 = nextInt()
    val num2 = nextInt();
    println("첫번째숫자 = $num1")
    println("두번째숫자 = $num2")
}

 

 b.  연결하기

  -  위에서 만든 Calculator로 더하기 빼기에 대한 결과를 출력해보자. 자바에 비해 코드가 간결하다

fun main(args: Array<String>) = with(Scanner(System.`in`)) {
    val calculator = Calculator()

    println("숫자 두개를 입력하세요")
    val num1 : Int = nextInt()
    val num2 : Int = nextInt()

    println("\n=== 결과 ====")
    println("$num1 + $num2 = ${calculator.plus(num1, num2)}")
    println("$num1 - $num2 = ${calculator.minus(num1, num2)}")
}

 

다.  리팩토링

 a.  예외처리

  -  다소 멍청한(?) 계산기를 구현해보았다. 그런데 뭔가 입력에 대한 예외처리가 없어서 아쉬운 느낌이 든다..

  -  사용자가 잘못 입력 했을때 저렇게 예외가 발생한다. 예외처리를 해보자

fun main(args: Array<String>) = with(Scanner(System.`in`)) {
    val calculator = Calculator()
    val num1 : Int
    val num2 : Int
    println("숫자 두개를 입력하세요")

    try {
        num1 = nextInt()
        num2 = nextInt()
    } catch (e : InputMismatchException){
        println("[ERROR] 입력에 오류가 있습니다. [${e}]")
        return;
    }

    println("\n=== 결과 ====")
    println("$num1 + $num2 = ${calculator.plus(num1, num2)}")
    println("$num1 - $num2 = ${calculator.minus(num1, num2)}")

}

 

 b.  고민해보기

  -  위에서 메인에서 입력 값에 대한 예외처리 해보았다 뭔가 좀 지저분한 느낌과 이상한 느낌이 든다. 좀 더 생각을 해보자

  -  먼저 입력 값의 타입을 살펴보면 Int로 지정을 했는데 입력하는 사람이 숫자만 입력할 것 이라는 보장이 없을 것 같다.

  -  두번째로 메인에서 예외처리를 하는 것 보다는 입력값을 포장해서 검증하는게 나을 것 같기도 하다.

 

 c.  입력 값 포장하기

  -  먼저 입력값을 String 으로 받는 InputNumber 라는 클래스의 테스트 코드를 만들어보자

  -  이제 인텔리제이의 힘을 빌려서.. InputNumber 를 만들어 보면

import java.lang.IllegalArgumentException

class InputNumber(input: String) {

    val num : Int

    init {
        try {
            this.num = input.toInt();
        } catch (e : NumberFormatException){
            throw IllegalArgumentException("[ERROR] 숫자만 입력해주세요")
        }
    }

}

 - 간단하게 init 블록을 활용해서 생성자에서 입력 값을 int로 파싱할때 예외처리를 할 수 있도록 해보았다. 요걸 자바 코드로 디컴파일 해보면..

  -  이런 모양이 된다 그리고 테스트 코드를 실행해보면.. 모두 잘 통과하는 것을 볼수 있다.

  -  Calculator 메서드들의 파라미터도 InputNumber로 바꿔보자

class Calculator {
    fun plus(inputNumber1: InputNumber, InputNumber2: InputNumber): Int {
        return inputNumber1.num + InputNumber2.num
    }

    fun minus(inputNumber1: InputNumber, InputNumber2: InputNumber): Int {
        return inputNumber1.num - InputNumber2.num
    }
}

또는

class Calculator {
    fun plus(inputNumber1: InputNumber, InputNumber2: InputNumber): Int = inputNumber1.num + InputNumber2.num
    fun minus(inputNumber1: InputNumber, InputNumber2: InputNumber): Int = inputNumber1.num - InputNumber2.num
}

  -  먼저 테스트 코드를 바꾸고 내부 로직을 변경했다. 이제 전체 테스트를 해보면  모두 통과하는 것을 볼 수 있다.

  

 d.  메인 바꾸기

fun main(args: Array<String>) = with(Scanner(System.`in`)) {
    val calculator = Calculator()

    println("숫자 두개를 입력하세요")
    val inputNumber1 = InputNumber(nextLine())
    val inputNumber2 = InputNumber(nextLine())

    println("\n=== 결과 ====")
    println("${inputNumber1.num} + ${inputNumber2.num} = ${calculator.plus(inputNumber1, inputNumber2)}")
    println("${inputNumber1.num} - ${inputNumber2.num} = ${calculator.minus(inputNumber1, inputNumber2)}")
    
}

  -  이전 보다 메인이 깔끔해진 것 같고 예외처리에 대한 책임도 클래스로 분리가 잘된 것 같다.

     => 테스트 코드를 더 추가하거나 다른 방향으로 바꿔볼 수도 있을 것 같지만 중요한건 가볍게 코틀린으로 만들어보는 것이 목표라 여기까지만 해보았다.

  -  코틀린이 여러모로 자바와의 코드 스타일 차이가 꽤 있는 것 같다. 책 같은 것을 참고해서 좀 더 공부하면서 맞춰나가 봐야겠다.!

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기