제어 전달문(Control Transfer Statements)은 코드의 한 부분에서 다른 부분으로 제어 흐름을 전달하여 코드가 실행되는 순서를 변경해주는 구문이다. 보통 반복문이나 조건문, 함수 등에서 사용되는 이 구문은 C언어나 다른 언어에서도 많이 사용된다. 스위프트에서 사용되는 전달문은 다음 네 가지가 존재한다.
- break
- continue
- fallthrough
- return
break
break 구문은 switch 구문에서의 실행 흐름이나 반복 실행 중인 루프를 조건식의 결과에 상관없이 즉각 종료하는데 사용된다.
for row in 0...5 {
if row > 2 {
break
}
print("\(row) was executed!")
}
/* 실행결과
0 was executed!
1 was executed!
2 was executed!
위의 for 구문은 0 ~ 5까지 총 6번에 걸쳐 반복되어야 하지만 row 값이 2보다 큰 경우 break 구문을 실행하도록 설계되어 있어 row 값이 3부터는 출력되지 않는 모습을 볼 수 있다.
continue
continue 구문은 이 구문 아래에 있는 실행 구문들을 건너뛰고 다음 반복을 시작하는 역할을 한다. break 구문의 경우 완전히 종료되지만 continue 구문은 반복문의 조건을 다시 평가하고 그 결과에 따라 다음 반복을 실행한다. continue 구문 아래에 있는 나머지 구문들을 실행하지만 않을뿐, 전체 반복은 계속 유지되는 것이 break 구문과의 큰 차이점이다.
for row in 0...5 {
if row < 2 {
continue
}
print("executed data is \(row)")
}
/* 실행결과
executed data is 2
executed data is 3
executed data is 4
executed data is 5
본래라면 0 ~ 5까지 출력되어야 하지만 continue 구문에 의해 row 값이 0, 1인 경우엔 건너 뛰어지고 나서 2, 3, 4, 5가 출력된 것을 확인할 수 있다. 이러한 continue 구문의 실행 방식을 사용하면 다음과 같이 특정문자만 필터링하거나 다른 문자로 변경하는 코드를 작성할 수도 있다.
var text = "This is a swift book for Apple's programming language" // 입력될 문장
var result = "" // 결과를 저장할 변수
for char in text {
if char == " " { // 공백을 _로 변경한다
result.append(Character("_"))
continue
} else if char == "o" { // o를 0으로 변경한다
result.append(Character("0"))
continue
}
result.append(char)
}
print(result)
/* 실행결과
This_is_a_swift_b00k_f0r_Apple's_pr0gramming_language
result에 text에 저장된 문자 하나하나씩을 넣어주는 구문이다. 그 사이에 루프 상수 char로 인해 조건이 추가되면서 " "(공백)의 경우 "_"로 바뀌도록 "o"의 경우 "0"으로 바뀌어 저장되게 하는 대신 continue 구문으로 끝까지 반복되게 하여 다음과 같은 실행결과가 나타났다.
구문 레이블과 break, continue
중첩된 구문들에서 continue 구문이나 break 구문을 사용하려면 약간의 문제가 생길 수 있다. 중첩된 구문 내에서 사용된 break나 continue 구문이 어떤 구문을 멈추고 다시 실행할지 명확하지 않다는 점이다.
이를 해결하기 위해서 스위프트에서는 반복문이나 조건문 등 특정 구문에 레이블을 붙여 기억할 수 있도록 하고, break나 continue 구문이 사용될 때 레이블을 명시해주어 원하는 구문 위치에 정확히 흐름 제어가 적용될 수 있도록 문법을 제공한다.
for i in 1...5 {
for j in 1...9 {
if (j == 3 {
break
}
print("\(i) X \(j) = \(i * j)")
}
}
/* 실행결과
1 X 1 = 1
1 X 2 = 2
2 X 1 = 2
2 X 2 = 4
3 X 1 = 3
3 X 2 = 6
4 X 1 = 4
4 X 2 = 8
5 X 1 = 5
5 X 2 = 10
다음과 이중 반복문이 있는데 안쪽 반복문에서 break를 걸어줄 경우엔 바깥 반복문은 멈추지 않고 계속되는 것을 확인할 수 있다. 하지만 구문레이블을 작성할 경우 다음과 같이 바깥쪽 반복문까지 쉽게 제어가 가능하다.
outer : for i in 1...5 {
// 1에서 9까지 반복
inner : for j in 1...9 {
// j의 값이 3일 때 break 구문을 실행
if (j == 3) {
break outer
}
// 구구단을 출력
print("\(i) X \(j) = \(i * j)")
}
}
/* 실행결과
1 X 1 = 1
1 X 2 = 2
안쪽 루프에서 break 구문을 출력했지만 바깥 outer 반복문을 종료해주어 한 번에 반복문이 종료된 것을 확인할 수 있다. 이처럼 복잡한 중첩 루프에서도 break, continue 구문에 레이블을 붙여 지정해두면 보다 효율적으로 코드를 작성하고 관리할 수 있다.
출처 : 꼼꼼한 재은씨의 Swift 문법편
'Swift > 문법' 카테고리의 다른 글
스위프트(Swift) - 집단자료형(Collection Types) Ⅱ. 집합(Set) (0) | 2022.05.06 |
---|---|
스위프트(Swift) - 집단 자료형(Collection Types) Ⅰ. 배열(Array) (0) | 2022.05.05 |
스위프트(Swift) - 조건문 Ⅳ. switch 구문 (0) | 2022.05.03 |
스위프트(Swift) - 조건문 Ⅲ. #available 구문 (0) | 2022.05.02 |
스위프트(Swift) - 조건문 Ⅱ. guard 구문 (0) | 2022.04.30 |