[TIL] 2022-10-12 Switch - fallthrough 사용을 조심해야 하는 이유

Jongdroid·2022년 10월 12일
7

TIL

목록 보기
22/24
post-thumbnail

Swift의 흐름 제어 중 Switch는 다른 언어에서는 보지 못했던 다음과 같은 특징이 존재한다.

Swift Switch의 특징

  • Switch 구문에서 () 소괄호를 생략할 수 있다.
  • 비교될 값이 열거형(한정적인 값)이 아닐 때는 default를 반드시 작성해야 한다.
  • break 사용은 선택이다.
  • case 내에서 범위 연산자, where 절을 사용하여 조건을 확장할 수 있다.
  • fallthrough을 사용하여 다음의 case문 내로 바로 진입할 수 있다.

오늘은 fallthrough를 중점으로 살펴보고자 한다.

Swift Switch의 fallthrough

결론부터 이야기하자면 "fallthrough" 사용은 피하는 게 상책이다. 좋은 코드가 나오기 힘들기 때문이다.

사실 fallthrough는 기계적으로 시키는대로 작동할 뿐인데도 코드가 길어지거나 복잡해지면 우리가 논리적으로 구성해놓아도 의도한대로 되었는지 읽고 따라가기 어려운 때가 종종 생기기 마련이다.

다음 2가지의 코드를 살펴보자

<예시1>

var myValue: String = "Joker"

switch myValue {
case "Jenny":
    fallthrough
    
case "Joker":
    fallthrough
    print("I am \(myValue)")
    
case "Nova":
    fallthrough
    print("he or she is \(myValue)")
    
default:
    print("블라블라")
}

2번째 case 조건이 부합되어 case 내부를 실행한다. 단순히 보면 "I am Joker" 와 같은 결과를 기대할 수 있다.
하지만 fallthrough를 만나게 되면 그 즉시 다음 case문 내부를 실행한다. 따라서 다음과 같은 코드를 순차적으로 해석하면
"블라블라" 가 출력될 것임을 알 수 있다.

따라서 해당 코드를 다음 예시와 같이 작성하는 방법이 더 나은 코드라고 생각한다.

<2022-10-17 수정> 예시1에 대한 설명은 하단에 추가 작성.

글의 첫 부분에서 fallthrough의 사용을 최대한 지양하자고 하였는데 그렇다면 fallthrough를 의도한대로 작성한 코드를 간략하게 살펴보자!

<22.10.17 추가 - fallthrough 사용 예시>

import Foundation

var myScore: Int = 100

switch myScore {
case 100:
    print("당신은 만점자 입니다.")
    
    let chooseYourOptions: Bool = true
    
    if chooseYourOptions {
        fallthrough
    } else {
    	print("당신은 A등급 입니다.")
        break
    }
    
case 90...100:
    print("당신은 A등급 입니다.")
    print("자랑하기!!")
    
case 80...89:
    print("당신은 B등급 입니다.")
    
default:
    print("default Text")
}

(코드 작성이 아직 능숙하지 못한 점 양해 부탁드립니다)

다음과 같이 코드를 작성한 이유는 학창시절 평균 90점이 넘으면 꽤 만족스러운 점수를 받았다고 생각해서 부모님에게 자랑을 했던 기억이 있다.

또한 100점을 받았을때 자랑을 하고 싶을 수도, 하고 싶지 않을 수도 있으니 chooseYourOptions을 통해 선택할 수 있도록 했고. 저라면 무조건 자랑을 할 것이기 때문에 true를 대입연산자로 지정하였습니다.

따라서 100점의 점수를 받은 학생이 tchooseYourOptions에 true를 선택한다면 다음 case의 조건과는 상관없이 내부 내용을 실행할 것이다.

100점인 학생은 "당신은 만점자 입니다." , "당신은 A등급 입니다." , "자랑하기!!"
3가지 결과 값을 갖게 된다.

2차 내용 추가 (수정중)

코드로 설명하기 어려운 상황이라면 사례 중심으로 설명을 하는 습관을 갖자!

<예시2>

var myValue: String = "Joker"

print(myValue)

switch myValue {
case "Jenny", "Joker", "Nova":
    print("he or she is \(myValue)")
    
default:
    print("블라블라")
}
profile
만드는 사람이 수고하면 쓰는 사람이 편하고 만드는 사람이 편하면 쓰는 사람이 수고롭다.

2개의 댓글

comment-user-thumbnail
2022년 10월 14일

Comments

  • <예시1> 코드를 Playground에 입력하면 "Will never be executed" 경고가 발생합니다. 즉 fallthrough 명령문에 의도된 bad case 프레임을 씌운 예시는 설명 혹은 이해에 도움이 되지 않습니다.
  • 모든 명령문은 존재의 이유가 있으며, 그 본질을 논하는 것이 좋습니다. 본질에 어긋난 case는 linting을 통해 작성자에게 인지시킬 수 있으며, 보완될 수 있습니다.
  • 요즘과 같은 스마트워크 시대에 fallback을 구사할 수 있는 명령문은 작성자에게 축복입니다.
1개의 답글