개인과제를 구현하다가 입력값이 0일 때 return을 사용해 프로그램을 종료하려고 했었다.
하지만, while 루프가 전역에 있어 return문을 사용할 수 없었다. 그래서 어떤 방법이 있을까 찾아보다가 Swift에서 제공하는 구문 레이블(Statement Label)을 찾아서 사용했다.
이번엔 구문 레이블이 무엇인지, 왜 사용하는지 간단히 요약한 뒤에, 실제로 사용한 예시를 살펴볼 예정이다.
구문 레이블이란?
구문 레이블(Statement Label)은 Swift에서 반복문이나 조건문 앞에 이름을 붙여, break나 continue와 함께 사용할 때 특정 구문의 흐름을 명확하게 제어할 수 있도록 해주는 문법이다.
이 기능을 사용하면 중첩된 반복문이나 조건문에서 원하는 위치로 제어 흐름을 쉽게 이동시킬 수 있다.
예시 코드
outerLoop: for i in 0...5 {
print(i)
break outerLoop // 여기서 for 루프 전체가 종료됨
}
print("루프 종료")
위 코드는 첫 번째 반복문이 실행되자마자 print(i)가 1번 실행되고, break outerLoop가 실행되면서 for 루프가 즉시 종료되고, 이후 "루프 종료"가 출력된다.
흔히 outerLoop, innerLoop처럼 사용되지만, 원하는 아무 이름으로 지어도 된다.
또한 이 구문 레이블은 여러 중첩된 루프 중 특정 루프만 탈출하는 경우에 유용하게 사용된다.
- 예시)
- 메뉴 기반 입력 처리 (case 0: → 전체 종료)
- 게임 루프에서 "exit" 같은 키워드 입력 시 전체 탈출
- for 안의 while, 그 안의 if 등 다단계 로직에서 흐름 정리
실사용 예시
내가 과제로 만든 menu코드 중 일부를 비슷하게 구현해봤다.
❌ outerLoop 없이 작성한 예시
while true {
print("문제를 선택하세요 (종료: 0): ", terminator: "")
let input = readLine() ?? ""
switch input {
case "0":
print("프로그램을 종료합니다.")
break // switch만 종료됨
default:
print("선택한 문제 실행 중...")
}
}
아래 이미지처럼 switch문 안에서 break를 쓰면 switch만 빠져나오고, while문은 계속 반복이된다.
이러면 while문을 빠져나오지 못해, 프로그램이 종료되지 않고 계속 반복하게 되어 원하는 결과가 나오지 않는다.
✅ outerLoop 사용 예시
outerLoop: while true {
print("문제를 선택하세요 (종료: 0): ", terminator: "")
let input = readLine() ?? ""
switch input {
case "0":
print("프로그램을 종료합니다.")
break outerLoop
default:
print("선택한 문제 실행 중...")
}
}
앞서 말한 것처럼 break문으로는 switch문은 빠져나올 수 있지만, 전역에 있는 while문까지 빠져나오진 못한다.
하지만, 우리는 0을 입력할 경우 while 루프 자체를 완전히 종료하고 싶기 때문에, break outerLoop를 통해 바깥 루프로 직접 종료하여 반복을 빠져나올 수 있다.
continue outerLoop
break에 구문 레이블이 있으니, 혹시 다른 것도 있나? 하고 찾아보니, continue문에도 구문 레이블을 사용할 수 있다고 한다.
예시
outerLoop: for i in 1...3 {
print("i = \(i) 시작")
if i == 2 { continue outerLoop }
print("i = \(i) 처리 완료")
}
// 출력
// i = 1 시작
// i = 1 처리 완료
// i = 2 시작
// i = 3 시작
// i = 3 처리 완료
continue문에도 break와 동일하게 사용된다.
이렇게 하면, i에 들어가는 1, 2, 3의 값들 중, 1, 3에 대해서는 정상적으로 "처리 완료"가 출력되지만, i == 2일 경우에는 중간의 "처리 완료" 출력이 생략되고 바로 다음 반복으로 넘어간다.
이렇게 하면 i == 2일 때만 중간의 “처리 완료” 출력이 생략되고 바로 다음 반복으로 넘어간다.
나머지 값(1, 3)에 대해서는 정삭적으로 “처리 완료”가 출력된다.
✅ 핵심 정리
구문 레이블(Statement Label)
은 반복문 앞에 이름을 붙여 특정 루프를 제어할 수 있게 하는 문법break outerLoop
: 해당 레이블이 붙은 루프를 종료continue outerLoop
: 해당 루프의 다음 반복으로 바로 이동- 중첩 루프나 다단계 로직에서 흐름을 깔끔하게 제어할 수 있어 유용함
'🖋️ TIL Journal' 카테고리의 다른 글
06.12 (목) 🍫 Cocoa 프레임워크란 무엇일까? (1) | 2025.06.12 |
---|---|
06.11 (수) Swift 주석 총 정리! (1) | 2025.06.11 |
06.09(월) 개인과제 Level4 역할 분리 및 구조 개선 회고 (1) | 2025.06.09 |
06.05 (목) enumerated()가 제네릭에서 안 된다고..? (1) | 2025.06.05 |
06.04 (수) 열거형(Enum)과 compactMap, flatMap (0) | 2025.06.04 |