While 문 사용 (While you were away...)
지금까지 if, for, switch-case문을 이용해 Swift의 강력한 제어와 반복 기능을 경험했습니다. 그러나 Swift의 추가 구조문에서는 생각을 자연스럽게 표현하는 방법도 제공합니다.
소프트웨어를 개발할 때 루프의 논리를 표현하고 싶지만 정확한 반복 횟수를 모를 때가 있습니다. 예를 들면 특정 기준을 충족시킬 때까지 무엇인가에 반복하려고 합니다. 그리고 값의 표를 계산하고 싶지만 계산된 값이 특정 숫자보다 크기 전까지는 멈추고 싶지 않습니다.
while 루프는 Swift의 루프 구조문으로 사용자가 선택한 조건이 충족될 때까지 동일한 코드가 계속해서 실행되게 할 수 있습니다. while 문의 기본적인 구조는 아래와 같습니다.
while someCondition {
// execute code
}
while 루프에서 값을 반복하기.▼
someCondition 조건은 참이나 거짓이 될 수 있는 불 연산식(Boolean expression)입니다. 만약 참이라면 괄호 안의 코드가 실행되고 컨트롤이 while 루프로 돌아갑니다. 조건 결과가 거짓이라면 괄호 안의 코드를 건너뜁니다.
var base = 2
var target = 1000
var value = 0
while value > target {
value += base
}
while 루프의 또 다른 버전은 do-while 조건문입니다. 그러나 현재 XCODE에서는 이 do-while 문이 repeat-while문으로 대체가 되었습니다. repeat-while 조건문은 코드를 실행하고 난 후 실행을 계속 진행할 것인지 아니면 건너뛸 것인지 결정하기 전에 수식을 평가하게 됩니다. repeat-while의 형태는 다음과 같습니다.
repeat {
// execute code
} while someCondition
repeat-while 루프 ▼
someCondition 조건은 while 루프에서 볼 수 있는 불 연산식과 같습니다. 그러나, 다른점은 괄호 안의 코드가 초기에 실행이 되고 나서 평가한다는 것입니다. repeat-while 루프의 value가 다릅니다. while 루프의 value가 1000이 아닌 1002입니다. 그 이유가 무엇일까요?
repeat
{
value += base
} while value < target
repeat-while 루프를 입력할 때 while 루프에 의해 설정되었기 때문에 value가 이미 1000 이었습니다. repeat-while 루프는 코드를 실행시킵니다. base(2) 를 value(1000)에 추가하고 그 후 식을 검사합니다. 이때 value(1002)가 target(1000)보다 작기 때문에 조건은 거짓이 됩니다. 그리고는 repeat-while 루프를 종료합니다.
코드검사(Inspecting your code)
제한 속도 코드조각▼
지금까지 설명한 플레이그라운드의 기능은 코드를 검사하고 결과를 바로 볼 수 있다는 점입니다. Swift는 결과를 보여주는 사이드바를 통해 계속해서 입력된 코드를 분석하고 심지어 코드 세그먼트가 몇 번이나 실행되었는지도 보여줍니다. 몇 번이나 루프를 실행했는지 분석하면서 특정 시나리오에 최적화되고 코드를 더 빠르고 더 나은 방법으로 만들 수 있도록 도와줍니다.
실제로 플레이그라운드 환경에서는 사이드바를 통해 코드를 검사하는 방법이 여러가지 있습니다. 다음 코드조각을 입력한 후 결과를 확인하겠습니다. 이 코드는 자동차 속도 증가를 모니터하기 위해 while 문과 switch-case 문을 조합해 사용했습니다.
// Speed Limit Simulation
var speedLimit = 75
var carSpeed = 0
while (carSpeed < 100) {
carSpeed++
switch carSpeed {
case 0..<20:
print("\(carSpeed): You're going really slow")
case 20..<30:
print("\(carSpeed): Pick up the pace")
case 30..<40:
print("\(carSpeed): Tap the accelerator")
case 40..<50:
print("\(carSpeed): Hitting your stride")
case 50..<60:
print("\(carSpeed): Moving at a good clip")
case 60..<70:
print("\(carSpeed): Now you're cruising!")
case 70..<speedLimit:
print("\(carSpeed): Warning... approaching the speed limit")
default:
print("\(carSpeed): You're going too fast!")
}
if carSpeed > speedLimit {
break
}
}
이 예제는 자동차의 속도가 계속 증가하는지 모니터 합니다. 제한 속도를 시간당 75마일로 설정하고 그 다음 행에 자동차의 속도 변수는 0으로 설정합니다. while 루프는 자동차 속도가 100 미만인 조건을 포함하고 있습니다. 루프가 진행되면서 자동차의 속도가 1씩 증가하고 그 후에 switch-case 선언문을 검사합니다.
각각의 case는 속도 범위를 처리하고 각 값에 대한 피드백을 제공합니다. 코드를 입력한 후 각 case가 실행된 횟수가 사이드바에 표시됩니다. 사이드바의 결과값 위로 마우스를 가져가면 "눈" 모양의 아이콘과 동그라미 표시를 볼 수 있습니다.
사이드바의 아이콘▼
break 문이 필요해 (Give me a break!)
break를 사용해 while 루프 조기 종료▼
때로는 루프를 사용해 프로세스가 진행중인 중간에 루프를 종료했으면 하는 때가 있습니다. 앞서 사용한 코드조각이 중간에 종료해도 되는 예제입니다. 자동차가 일단 제한 속도를 넘어서면 "속도가 너무 빠릅니다!(You're going too fast!)"라는 메시지가 시간당 100마일을 달리는 동안 계속해서 출력됩니다. 자동차의 속도가 제한 속도를 넘어선 후 while루프를 멈추고 싶다면 어떻게 해야 할까요? 이 때 break 키워드를 사용하면 됩니다. break를 사용하면 루프 또는 switch-case문에서 중도에 빠져 나와 컨트롤이 바로 가장 가까운 곳에 있는 코드 블록으로 이동합니다. 위의 그림이 break가 어떻게 작동되는지 보여줍니다.
if 문은 자동차의 속도가 제한 속도를 넘어섰는지 확인하고 제한 속도를 넘겼다면 break를 사용합니다. 이 break를 사용하면 while 루프를 실질적으로 종료시키는 것입니다.
글이 마음에 드셨나요?
로그인 없이 누구나 가능한
♥ 공감은 힘이 됩니다!