호댕의 iOS 개발

[Swift 기본문법] Swift 제어 전송문 총 정리 (break, fallthrough, continue, return, throw) 본문

Software Engineering/Swift

[Swift 기본문법] Swift 제어 전송문 총 정리 (break, fallthrough, continue, return, throw)

호르댕댕댕 2022. 5. 17. 00:43

 

반복문, 조건문, 함수를 사용하다보면 제어 전송문을 사용하게 된다. 

그래서 이를 총 정리해보고자 한다. 

 

🌀 break

Switch 문

해당 케이스에서 실행하는 문장이 없는 경우 break를 사용

만약 작성을 하지 않는다면 이와 같은 에러가 발생한다. 

'case' label in a 'switch' must have at least one executable statement

'default' label in a 'switch' must have at least one executable statement

var num = Int.random(in: 1...100)
var array = ["Hello", "Jobs", "Swift", "Cook"]

switch num % 4 {
case 0:
    print(array[0])
case 1:
    print(array[1])
case 2:
    print(array[2])
case 3:
    print(array[3])
default:
    break
}

위 코드처럼 default에서 실행할 문장이 없는 경우 break를 사용해주면 된다. 

 

반복문

가장 인접한 반복문의 모든 싸이클을 아예 중지하고 반복문의 다음 코드를 실행한다.

for count in 1...10 {
    if count > 7 {
        break
    }
    print("현재 count \(count)")
}

 위 코드의 경우 7보다 큰 8이 되게 되면 반복문을 중단하고 다음 코드를 실행하게 된다. 

 

🌀 fallthrough

Switch 문에서 매칭된 값과 상관없이 무조건 다음 문장도 실행하는 경우 사용한다. 

let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " a prime number, and also"
    fallthrough
default:
    description += " an integer."
}
print(description)

이 경우 integerToDescribe가 5이기 때문에 case 첫번째에 들어가고 fallthrough를 만나 다음에 있는 default 문도 실행이 된다. 

따라서 결과는 The number 5 is a prime number, and also an integer.가 나온다

 

🌀 continue

현재의 반복문을 종료하고 다음 싸이클로 넘어가서 계속 실행

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "]
for character in puzzleInput {
    if charactersToRemove.contains(character) {
        continue
    }
    puzzleOutput.append(character)
}
print(puzzleOutput)
// Prints "grtmndsthnklk"

예시를 보더라도 만약 charactersToRemove에 값이 포함되어 있는 경우 현재 반복 싸이클은 종료하고 다음 싸이클로 넘어간 것을 볼 수 있다. 따라서 모음과 띄워쓰기가 있는 경우 output에 append 되지 않은 것이다. 

 

🌀 return

return의 경우 가장 자주 사용되는 전송제어문일 것이다. 

만약 함수에 리턴타입이 있는 경우 해당 타입을 리턴하면서 함수를 벗어나게 된다. 즉, 스택의 메모리에서 내려가게 되는 것이다. 

 

리턴타입이 없는 경우에는 함수의 실행을 중지하고 벗어나게 된다. 

두 경우 모두 함수의 실행을 중단하고 함수에서 벗어나는 것은 동일하다. 

 

따라서 만약 return 뒤에 코드를 작성하게 된다면 해당 내용은 절대 실행되지 않기 때문에 다음과 같은 경고가 발생한다. 

Code after 'return' will never be executed

 

🌀 throw

에러가 발생 가능하도록 정의된 함수에서 리턴을 작성하기 전에 throw로 표시를 하게 되면 에러 타입을 리턴하면서 함수를 벗어나게 된다. 

func canThrowErrors() throws -> String

위처럼 작성을 하게 되며 만약 이를 사용할 때에는 try를 붙여야 한다. 또한 에러는 do-catch 문을 통해 처리를 해줘야 한다. 

guard let 구문을 사용할 때에도 바인딩이 안되는 경우 그냥 이를 통과하면 안되기 때문에 return이나 throw를 통해 해당 scope에서 벗어나도록 해줘야 한다. 

'guard' body must not fall through, consider using a 'return' or 'throw' to exit the scope

 

📖 참고 문서

- Swift Language Guide Control Flow

 

Control Flow — The Swift Programming Language (Swift 5.6)

Control Flow Swift provides a variety of control flow statements. These include while loops to perform a task multiple times; if, guard, and switch statements to execute different branches of code based on certain conditions; and statements such as break a

docs.swift.org

- 앨런 Swift 문법 마스터 스쿨

 

앨런 Swift문법 마스터 스쿨 (온라인 BootCamp - 2개월과정) - 인프런 | 강의

Swift문법을 제대로 이해, 활용해보고자 하는 철학을 바탕으로 과정이 설계되었습니다. 코딩에 대해 1도 모르는 비전공자를 시작으로 네카라쿠배에 입사할 수 있는 초고급 수준까지 올리는 것을

www.inflearn.com

 

Comments