• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

when 에서 early return 관련

22.11.21 11:15 작성 조회수 388

3

안녕하세요! 이해가 쏙쏙 되도록 강의를 잘 해주셔서 정말 잘 듣고 있습니다.

"5강. 코틀린에서 제어문을 다루는 방법" 에서 궁금한 점이 있어 질문 드립니다.

when (값) 에서 값을 생략하면 ealry return 처럼 동작한다고 설명해주셨는데, 실제 코드를 수행하면 그렇게 동작하지 않는 것 같네요.

아래와 같이 println("xxx") 를 추가했을 때 early return 이라면 해당 코드가 동작하지 않아야 되는데 동작을 합니다.

fun judgeNumber2(number: Int) {
  when {
    number == 0 -> {}
    number % 2 == 0 -> println("주어진 숫자는 짝수입니다")
    else -> println("주어지는 숫자는 홀수입니다")
  }
  println("이 코드가 동작하나요?")
}

실제 early return 으로 동작하려면 아래와 같이 when expression 을 통째로 return 해야 가능해 보입니다.

이렇게 하면 맨 아래 코드가 intellij 에서는 unreachable code 라고 뜨네요.

fun judgeNumber2(number: Int) {
  return when {
    number == 0 -> {}
    number % 2 == 0 -> println("주어진 숫자는 짝수입니다")
    else -> println("주어지는 숫자는 홀수입니다")
  }
  println("이 코드가 동작하나요?")
}

혹시 제가 잘못 이해하고 있는 것인지 답변 부탁 드릴게요~~ ^^

답변 1

답변을 작성해보세요.

3

안녕하세요 우창호님!! 아이고~~ 너무나도 좋은 질문 감사드립니다!!! 😊

 

결론부터 말씀드리자면, 제 설명에 부족함이 있었던 것 같습니다!!! 제가 전달하고자 했던 when을 ealry return 처럼 사용할 수 있다는 의미는 이런 의미였습니다!!

fun judgeNumber2(number: Int) {
  when {
    number == 0 -> println("주어진 숫자는 0입니다") // (1)
    number % 2 == 0 -> println("주어진 숫자는 짝수입니다") // (2)
    else -> println("주어지는 숫자는 홀수입니다") // (3)
  }
}

위와 같은 코드에서 judgeNumber2(0) 을 사용하는 경우에
첫 번째 when 구문에 걸려 "주어진 숫자는 0입니다"가 출력되고 나머지 when은 무시되는데요

이러한 동작이 마치 첫 번째 when 구문만 실행하고 return 한 것처럼 동작하기에 ealry return 처럼 동작한다고 표현했습니다..!!!

또 다른 예를 들어 보면,

fun judgeNumber2(number: Int) {
  when {
    number % 2 == 0 -> println("주어진 숫자는 2의 배수입니다") // (1)
    number % 3 == 0 -> println("주어진 숫자는 3의 배수입니다") // (2)
    number % 6 == 0 -> println("주어진 숫자는 6의 배수입니다") // (2)
  }
}

위와 같은 코드에서 judgeNumber(6) 을 호출할 경우에 "주어진 숫자는 2의 배수입니다"만 출력되고 나머지 when은 무시되어 when 자체가 종료되게 됩니다. 이 부분이 첫 번째 구문 실행 이후 return 되어 나머지 구문이 무시된 것처럼 느껴졌습니다!!!

 

다만, 창호님께서 짚어주신것처럼 함수 자체가 when에 의해 끝나는(=return되는) 것은 아닙니다!! 🙏

 

when 자체에서 함수가 완전히 끝나게 하려면 여러 방법이 있겠지만, 아래와 같이 쓸수 있을 것 같습니다!! 😊

fun judgeNumber2(number: Int) {
  when {
    number == 0 -> {
      println("주어진 숫자는 0입니다") // (1)
      return
    }
    number % 2 == 0 -> {
      println("주어진 숫자는 짝수입니다") // (2)
      return
    }
  }
  println("주어지는 숫자는 홀수입니다")
  println("여기가 실행됩니다!!")
}

when 절의 각 구문에는 여러줄이 들어갈 수 있기 때문에 { } 을 사용해 return을 적어주는 방법입니다!!

만약 else부분까지 return을 사용하게 되면 when의 모든 경우에서 return이 되기에 when절 아래로 아예 내려 주었습니다!

 

정말 좋은 포인트 짚어주셔서 감사드립니다!! 🙏

언제든 궁금하신 내용 있으시면 편하게 질문 남겨주세요!! 감사합니다! 🙇

우창호님의 프로필

우창호

질문자

2022.11.22

네네~ 잘 이해되었습니다~ 도움이 많이 되었네요!

감사합니다!