<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)}")
}
- 이전 보다 메인이 깔끔해진 것 같고 예외처리에 대한 책임도 클래스로 분리가 잘된 것 같다.
=> 테스트 코드를 더 추가하거나 다른 방향으로 바꿔볼 수도 있을 것 같지만 중요한건 가볍게 코틀린으로 만들어보는 것이 목표라 여기까지만 해보았다.
- 코틀린이 여러모로 자바와의 코드 스타일 차이가 꽤 있는 것 같다. 책 같은 것을 참고해서 좀 더 공부하면서 맞춰나가 봐야겠다.!
'공부 > Kotlin' 카테고리의 다른 글
<Kotlin> 2. 코틀린 vs 자바 클래스 스타일 비교 (0) | 2022.12.28 |
---|---|
<Kotlin> 0. 코틀린 프로젝트 셋팅하기 (2) | 2022.10.03 |
블로그의 정보
57개월 BackEnd
BFine