오늘은 이번주에 학습해야하는 내용인 지급받은 강의를 모두 들었다. 오늘 들은 내용은 처음보는 내용이 많았는데 흥미로운 내용이어서 집중해서 잘 들을 수 있었다.
그리고 이번주까지 수행해야하는 과제인 계산기 만들기 과제를 완성해보았다. 그 과정 전체를 정리하는 것은 너무 양이 많아질 것 같아서 계산기를 만들면서 활용해본 부분들 일부를 정리해보았다.
완성한 계산기 링크
https://github.com/Moo-moo-11/Calculator
GitHub - Moo-moo-11/Calculator
Contribute to Moo-moo-11/Calculator development by creating an account on GitHub.
github.com
1. 계산기 만들기
1-1. 계산기의 전체 구조
처음에는 간단하게 계산기 구조를 글로 정리해보려고했다. 그런데 찾아보니 순서도 작성 툴이 있길래 간단하게 순서도를그려봤다.
간단한 계산기이기 때문에 그리 복잡하지 않다.
아래는 여러차례 수정을 거쳐 최종으로 완성한 계산기의 순서도이다.
사실 위의 순서도에서 빠진 부분이 있긴 하다. 입력을 받는 곳에서 입력이 유효하지않으면 경고문을 띄우고 다시 입력을 받게된다. 입력을 받는 부분 3곳 모두 그렇게 되어있다. 순서도에 포함하면 복잡해질 것 같아 포함하지 않았다.
1-2. 스마트 캐스팅 사용해보기
스마트 캐스팅은 학습하면서도 다소 헷갈리는 개념이었는데 이번 계산기 만들기 과제를 하면서 활용해보고 이해해볼 수 있어서 좋았다.
입력을 readln()으로 받았을 때 문자열이 반환되기 때문에 정수형으로 변환을 시켜줘야한다. 이때 toIntOrNull()을 이용하면 정수형으로 변환할 수 있는 문자열은 정수로 변환되어 반환되고, 그렇지 못하면 null로 반환된다. 따라서 아래 사진에서 보이는 firstNumbInput의 타입은 Int?가 될 것이다.
나는 정수형으로 변환 불가능한 문자열이 들어왔을 경우에는 경고문을 띄우고 다시 입력을 받도록 코드를 작성하고 싶었다. (아래 사진에 보이는 코드가 해당 코드이다.)
따라서 firstNumbInput이 null일때를 if문으로 걸러주고 경고문이 출력되도록 만들었다. 그렇게 null을 거르고 나면 firstNumbInput은 Int타입으로 스마트 캐스팅이 된다.
스마트 캐스팅이 된 것을 인텔리제이에서는 아래처럼 친절하게 알려준다.(스마트 캐스팅이 된 부분은 배경색이 변한다.)
null 허용 정수(Int?)에서는 연산을 그냥 사용할 수 없다. 아래 사진처럼 오류가 발생한다.
스마트 캐스트를 이용하면 if문을 이용해 쉽게 null을 허용하지 않는 타입으로 변환할 수 있어 편리하다.
아래는 첫 번째 숫자를 입력받는 부분에 해당하는 코드 전체이다.
println("숫자는 -2147483648 ~ 2147483647 사이의 정수만 입력가능합니다.")
var validFirstNumb = false
var firstNumb = 0
println("첫 번째 숫자를 입력해주세요")
while (!validFirstNumb) {
val firstNumbInput = readln().toIntOrNull()
if (firstNumbInput == null) {
println("잘못 입력하셨습니다. 다시 입력해주세요.")
} else {
firstNumb = firstNumbInput
validFirstNumb = true
}
}
아니면 null을 걸러주지 않고 Int형으로 타입을 확정해줘서 Int?을 Int로 스마트 캐스팅 할 수도 있다.
println("숫자는 -2147483648 ~ 2147483647 사이의 정수만 입력가능합니다.")
var validFirstNumb = false
var firstNumb = 0
println("첫 번째 숫자를 입력해주세요")
while (!validFirstNumb) {
val firstNumbInput = readln().toIntOrNull()
if (firstNumbInput is Int) {
firstNumb = firstNumbInput
validFirstNumb = true
} else {
println("잘못 입력하셨습니다. 다시 입력해주세요.")
}
}
1-3. 예외가 발생하는 경우 없애주기
계산기를 완성하고 직접 숫자를 넣어보며 확인하던 와중에 예외가 발생하는 경우를 하나 발견했다. 너무 당연한건데 어떤 숫자이건 0으로 나누면 예외가 발생한다.(ArithmeticException)
더하기, 빼기, 곱하기의 경우에는 두 번째 입력 숫자값에 0이 들어와도 상관없다. 따라서 선택한 연산이 몫 구하기, 나머지 구하기 인 경우(아래 코드에서 operator == "4", operator == "5"가 이 부분에 해당한다.)에 두 번째 입력 값으로 0이 들어오면 0으로 나눌 수 없다는 경고문을 띄워주고 입력을 다시 받도록 코드를 수정하였다.
아래가 해당부분의 코드이다.
var validSecondNumb = false
var secondNumb = 0
println("두 번째 숫자를 입력해주세요")
while (!validSecondNumb) {
val secondNumbInput = readln().toIntOrNull()
if (secondNumbInput == null) {
println("잘못 입력하셨습니다. 다시 입력해주세요.")
} else if (secondNumbInput == 0 && (operator == "4" || operator == "5")) {
println("0으로는 나눌 수 없습니다. 다시 입력해주세요.")
} else {
secondNumb = secondNumbInput
validSecondNumb = true
}
}
2. 오늘 알게된 것
- 클린 코드와 리팩토링에 대해 알게되었다.
- 비동기 프로그래밍, 쓰레드, 코루틴에 대해 간략하게 알게 되었다.
- 이번주에 학습한 코틀린 기본 문법을 이용해 직접 간단한 프로그램을 작성해보며 익숙하게 활용할 수 있도록 연습해보았다.
'오늘 배운 것' 카테고리의 다른 글
24-04-26 Kotlin 인터페이스와 추상 클래스 (0) | 2024.04.26 |
---|---|
24-04-25 Kotlin 계산기 만들기 (2) (0) | 2024.04.25 |
24-04-23 Kotlin 간단한 텍스트 rpg 만들어보기 (2) (0) | 2024.04.23 |
24-04-22 Kotlin 간단한 텍스트 rpg 만들어보기 (2) | 2024.04.22 |
24-04-21 Kotlin filter()와 filterNotNull() (0) | 2024.04.21 |