일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 원스휴먼 레시피 파밍
- 계엄령
- 원스휴먼 쿠폰
- 원스휴먼 황금양
- 비상계엄령
- 2차계엄
- 유광버섯 통조림
- 원스휴먼 요리
- 원스휴먼 황금양털파밍
- 믹스커피
- 1203계엄령
- 원달러환율
- 윤석열
- 원스휴먼 동물
- 계엄령 외신반응
- 레시피 파밍
- 시그니처
- 원스휴먼 레시피
- 국방부
- 홈플러스 시그니처 모카골드믹스커피
- 원스휴먼 사료
- 홈플러스
- 원스휴먼 스타크롬
- 믹스커피추천
- 원스휴먼 먹이
- 일론머스크
- 커피추천
- 원스휴먼 황금양 구하기
- 2차 비상계엄
- Today
- Total
0101011001010111
kotlin_조건문, 반복문_문제만들어보자 2/5 [문제 : 두 숫자 중 큰 숫자를 찾아내기_while 사용 : 제대로 대답할때까지 나갈 수 없는 고구마] 본문
kotlin_조건문, 반복문_문제만들어보자 2/5 [문제 : 두 숫자 중 큰 숫자를 찾아내기_while 사용 : 제대로 대답할때까지 나갈 수 없는 고구마]
[진주] 2023. 8. 9. 21:48자 앞의 문제를 풀었다면, 이번엔 다른 형식으로 만들어 볼 것이다. while이라는 것을 사용해서 말이다 !
먼저, while 반복문 (무한루프) 를 쓰는 법을 알려주겠다.
while(true)
이렇게 써주면, true가 나올때 까지 무한 반복을 하게 되는데,
1번에서 풀었던 예제
fun main() {
println("첫 번째 숫자를 입력하세요:")
val firstNumber = readLine()?.toIntOrNull()
if (firstNumber == null) {
println("올바른 숫자를 입력해주세요.")
return
}
println("두 번째 숫자를 입력하세요:")
val secondNumber = readLine()?.toIntOrNull()
if (secondNumber == null) {
println("올바른 숫자를 입력해주세요.")
return
}
if (firstNumber > secondNumber) {
println("큰 숫자는 $firstNumber 입니다.")
} else if (secondNumber > firstNumber) {
println("큰 숫자는 $secondNumber 입니다.")
} else {
println("두 숫자는 같습니다.")
}
}
여기서는 올바른 숫자를 쓰지 않을 경우 return으로 종료된다고 설명했다. ( 궁금하면 이전글 참고)
이걸 올바른 숫자를 쓸 때 까지 !!
수백번 수억번 반복하는 고구마로 만들어보자!!!!!
while(true) : 고구마 화법
문제 : 두 숫자 중 큰 숫자를 찾아내기.
- 첫 번째로 사용자에게 숫자를 입력받아 firstNumber에 저장합니다.
- 입력한 값이 숫자가 아닌 경우 "올바른 숫자를 입력해주세요."라는 메시지를 출력하고 사용자가 올바른 값을 입력할때까지 !!! 무한반복
- 다음으로 두 번째 숫자를 입력받아 secondNumber에 저장합니다.
- 이 숫자 역시 숫자가 아닐 경우 "올바른 숫자를 입력해주세요."라는 메시지를 출력하고 사용자가 올바른 값을 입력할때까지 !!! 무한반복
- 두 숫자를 비교하여 더 큰 숫자를 출력합니다. 만약 두 숫자가 같다면 "두 숫자는 같습니다."라는 메시지를 출력합니다.
답:
package com.example.myapplication
fun main() {
var firstNumber: Int? // Nullable Int 타입으로 선언
var secondNumber: Int?
// 첫 번째 숫자 입력받기
while (true) {
println("첫 번째 숫자를 입력하세요:")
firstNumber = readLine()?.toIntOrNull()
if (firstNumber != null) break // 올바른 숫자를 입력받았다면 while 루프 탈출
println("올바른 숫자를 입력해주세요.")
}
// 두 번째 숫자 입력받기
while (true) {
println("두 번째 숫자를 입력하세요:")
secondNumber = readLine()?.toIntOrNull()
if (secondNumber != null) break // 올바른 숫자를 입력받았다면 while 루프 탈출
println("올바른 숫자를 입력해주세요.")
}
// 두 숫자 비교 (firstNumber와 secondNumber는 이 시점에서는 non-nullable입니다)
if (firstNumber!! > secondNumber!!) {
println("큰 숫자는 $firstNumber 입니다.")
} else if (secondNumber > firstNumber) {
println("큰 숫자는 $secondNumber 입니다.")
} else {
println("두 숫자는 같습니다.")
}
}
이제 이 것을 한줄 한줄 설명하도록 하겠다..!!
먼저,
var firstNumber: Int? // Nullable Int 타입으로 선언
▲ 이것은
var // 변수 var는 변할 수 있는 값이다. (사용자가 입력하는 것에 따라 변할 수 있기 때문에 var를 써줬다)
firtsNumber 는 이름이고
Int는 정수이다 ( 1 2 3 4 5 6 7 같은)
그 뒤에 ? 가 사실 핵심인데
물음표는 값이 null이어도 허용 한다는 의미다.
즉, 값이 없어도 허용해두었다.
왜냐면 아랫쪽 코드를보면,
if (firstNumber != null) break
null일 경우, 코드를 멈추게 하였고
while(true)반복문을 이용해 원하는 답을 찾을 때 까지 쓸거기 때문이다.
사실 안써줘도 되나 했지만, 안써주면 자꾸
여기서 오류가 생긴다.
답 찾음!!
int?를 넣어준 이유는!!
만약에 내가 그냥 문자열을 써볼수도 있잖아 ? 예를들어서 " 정예반너모조앙"
이라고 쳤다고 쳐
근데 이건 문자열이니까
널값을 허용안하면 그냥 코딩자체가 오류나서 꺼져버리면 안되잖아 (퓨수수수욱)
고구마처럼 계속 올바른 숫자를 입력하세요 라고 출력해야하니까!
일단 null값을 허용해주고 !!!
firstNumber = readLine()?.toIntOrNull()
이게 정수로 반환할수 있는지 toIntOrNull로 확인해주는거야
이거 말 그대로 Int인 것인가 아니면 Or Null 널값인것인가!!!
라는 의미거든 ?
값이 정수여야 다음 if문으로 넘어가겠지 ?
아니면 null값이잖아 ?
null이 되면
println("올바른 숫자를 입력해주세요.")
이것이 계속 반복될거야
if (firstNumber != null) break // 올바른 숫자를 입력받았다면 while 루프 탈출
이걸 설명하자면, 이건
if 하고 소괄호 안에 있는것이 true라면, break를통해, 이 지독한 while루프를 탈출해서 다음 단계로 넘어갈 수 있어.
즉,
firstNumber != null
이니까,
이 퍼스트넘버가 , !=(아니다) 즉 , null이 아니라면!
null이 아니라면, 제대로 된 정수값이겠지? (위의, 정수값만 걸러내는 아이들을 통과했으니 말야)
그렇다면 true니까, break로 가장 최근의 반복문을 탈출할 수 있어!.
두번째는 첫번째의 설명과 같고
// 두 숫자 비교 (firstNumber와 secondNumber는 이 시점에서는 non-nullable입니다)
if (firstNumber!! > secondNumber!!) { /// 20,000퍼센트 자신이 있을때만 쓰는 !! 등장
println("큰 숫자는 $firstNumber 입니다.")
} else if (secondNumber > firstNumber) {
println("큰 숫자는 $secondNumber 입니다.")
} else {
println("두 숫자는 같습니다.")
}
}
여기서, 내가 !! 를 넣어준 이유는,
여러 단계를 거쳐서, 무조건 정수만을 뽑아냈기 때문에 (while문과, tointOrNull등으로)
이건 진짜 12837912837198237189 퍼센트 무조건 정수이기 때문에
너무 자신이 있어서
!!를 써봤어.
그리고, !!을 안쓰면 오류가 나게 돼!!
왜냐면,
> , < 같은 연산자들은 null값을 허용하지 않는, Int타입에만 적용할 수 있어.
근데 봐봐 나는
var firstNumber: Int? // Nullable Int 타입으로 선언
var secondNumber: Int?
위에서 int?로 널허용했단말야.
중간에는 null이 안되게 많은 조취를 했지만 말야.
그렇기 때문에, !!값을 써서 널이 확실하다는 걸 알려준거야.
그럼 또 의문이 생기겠지 ,
다음줄을 봐봐
} else if (secondNumber > firstNumber) {
라는 게 있어.
얘는 왜 !! < 이거 안써준걸까 ?
자, 여기서 고수들이 쓰는 언어
스마트 캐스팅
이 뭔지 알 수 있어!!
if (firstNumber!! > secondNumber!!)
내가 여기서 퍼스트넘버랑 , 세컨드 넘버에
12387138947189273891237퍼 null이 아니라고 !! 를 써줬잖아.
그렇기 때문에 다음에 나오는
} else if (secondNumber > firstNumber) {
여기서도 null이 아닐것 이라고 코틀린이 생각하고 안전하게 <, > 등과 같은 연산자를 쓸 수 있는거야.
그렇지만, 스마트 캐스팅을 나는 너무 믿어서, 자꾸 오류가 나는데..
믿지마...
되는건 되고 안되는건 안돼...
} else if (secondNumber!! > firstNumber!!) {
안전하게 쓰려면
이것도 느낌표 2개를 뽞!!! 써주는게 더 안전할 것 같아....
일단 null이 아닌거 진짜 전재산 걸고 확실하자나..
'Kotlin > ★정예★반 숙제' 카테고리의 다른 글
정예반 숙제! 8.23일! (1) | 2023.08.23 |
---|---|
kotlin _ shuffled() /takeLast/take /drop/dropLast/slice (0) | 2023.08.14 |
Kotlin - 문자열에서 특정 알파벳 a의 개수 알아보기. (0) | 2023.08.10 |
kotlin / 조건문, 반복문/ 문제만들어보자 1/5 /문제 : 두 숫자 중 큰 숫자를 찾아내기./ return 사용 (0) | 2023.08.09 |
정예반 숙제 : 조건문, 반복문 '소수'인지 아닌지 판별기 만들기 (0) | 2023.08.09 |