0101011001010111

kotlin_조건문, 반복문_문제만들어보자 2/5 [문제 : 두 숫자 중 큰 숫자를 찾아내기_while 사용 : 제대로 대답할때까지 나갈 수 없는 고구마] 본문

Kotlin/★정예★반 숙제

kotlin_조건문, 반복문_문제만들어보자 2/5 [문제 : 두 숫자 중 큰 숫자를 찾아내기_while 사용 : 제대로 대답할때까지 나갈 수 없는 고구마]

[진주] 2023. 8. 9. 21:48
728x90
반응형

자 앞의 문제를 풀었다면, 이번엔 다른 형식으로 만들어 볼 것이다. 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)  : 고구마 화법 

 

 

 

문제 : 두 숫자 중 큰 숫자를 찾아내기.

  1. 첫 번째로 사용자에게 숫자를 입력받아 firstNumber에 저장합니다.
  2. 입력한 값이 숫자가 아닌 경우 "올바른 숫자를 입력해주세요."라는 메시지를 출력하고 사용자가 올바른 값을 입력할때까지 !!! 무한반복
  3. 다음으로 두 번째 숫자를 입력받아 secondNumber에 저장합니다.
  4. 이 숫자 역시 숫자가 아닐 경우 "올바른 숫자를 입력해주세요."라는 메시지를 출력하고 사용자가 올바른 값을 입력할때까지 !!! 무한반복
  5. 두 숫자를 비교하여 더 큰 숫자를 출력합니다. 만약 두 숫자가 같다면 "두 숫자는 같습니다."라는 메시지를 출력합니다.

답:

 

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이 아닌거 진짜 전재산 걸고 확실하자나..

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형