🔥 while 반복문
Swift에서는 특정 조건이 거짓(false
)이 될 때까지 코드 블록을 반복 실행하는 while
반복문을 제공하지요. 이러한 반복문은 반복 횟수를 미리 알 수 없을 때 사용하면 유용합니다. Swift에서는 두 가지 형태의 while
반복문을 지원하는데요, 하나는 while
이고 다른 하나는 repeat-while
입니다.
while 반복문
while
반복문은 매 반복마다 조건을 먼저 평가합니다. 조건이 true
이면 코드 블록이 실행되고, 조건이 false
가 될 때까지 이 과정을 반복하지요. 기본적인 형태는 다음과 같습니다:
while <#condition#> { <#statements#> }
swift
이제 간단한 뱀과 사다리
게임 예제를 통해 while
반복문을 살펴볼까요?
게임의 규칙은 아래와 같습니다:
- 게임 판에는 25개의 칸이 있고, 25번 칸 이상에 도착하면 승리합니다.
- 플레이어는 게임 판 바로 아래쪽 모서리의 "제로 칸"에서 시작합니다.
- 매 턴마다 6면체 주사위를 굴리고, 그 수만큼 앞으로 이동합니다. (점선 화살표를 따라 수평 방향으로 이동)
- 만약 사다리 아래쪽에 도착하면 사다리를 타고 위로 올라갑니다.
- 만약 뱀 머리 위치에 도착하면 뱀을 따라 아래로 내려갑니다.
게임 판은 Int
값들의 배열로 나타냅니다. 배열의 크기는 승리 조건을 확인하는 데도 사용되는 상수 finalSquare
로 결정됩니다. 플레이어는 "제로 칸"에서 시작하므로, 게임 판은 25개가 아닌 26개의 제로 Int
값으로 초기화됩니다.
let finalSquare = 25 var board = [Int](repeating: 0, count: finalSquare + 1)
swift
그 다음 사다리와 뱀이 있는 칸들에는 구체적인 값을 할당합니다. 사다리 아래쪽 칸은 플레이어를 위로 올려보내는 양수 값을, 뱀 머리 칸은 플레이어를 아래로 내려보내는 음수 값을 가집니다.
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02 board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
swift
3번 칸에는 플레이어를 11번 칸으로 올려보내는 사다리 아래쪽이 있습니다. 이를 나타내기 위해 board[03]
에 +08
을 할당하는데, 이는 정수 값 8
과 같습니다 (3
과 11
의 차이). 값과 구문을 정렬하기 위해 단항 더하기 연산자(+i
)와 단항 빼기 연산자(-i
)를 명시적으로 사용하고, 10보다 작은 숫자 앞에는 0을 채웁니다. (엄밀히 말해 이런 스타일은 필수는 아니지만 코드를 깔끔하게 만들어줍니다)
var square = 0 var diceRoll = 0 while square < finalSquare { // 주사위를 굴립니다. diceRoll += 1 if diceRoll == 7 { diceRoll = 1 } // 주사위 숫자만큼 이동합니다. square += diceRoll if square < board.count { // 게임 판 안이라면 뱀이나 사다리에 따라 위아래로 이동합니다. square += board[square] } } print("Game over!")
swift
위 예제는 주사위 굴리기를 아주 단순하게 구현했습니다. 난수를 생성하는 대신, diceRoll
값을 0
에서 시작해서 while
반복문을 돌 때마다 1씩 증가시킵니다. 그리고 값이 너무 커지지 않았는지 확인하지요. 7
이 되면 주사위 값이 너무 큰 것이므로 1
로 초기화합니다. 결과적으로 diceRoll
값은 항상 1
, 2
, 3
, 4
, 5
, 6
, 1
, 2
순으로 반복됩니다.
주사위를 굴린 후에는 플레이어를 diceRoll
칸 만큼 앞으로 이동시킵니다. 만약 주사위 숫자가 플레이어를 25번 칸을 지나치게 했다면 게임은 끝납니다. 이 경우를 처리하기 위해 square
가 board
배열의 count
속성보다 작은지 확인합니다. square
가 유효하다면 board[square]
에 저장된 값을 현재 square
값에 더해 사다리나 뱀에 의해 위 아래로 이동시키는 거예요.
현재 while
반복문 실행이 끝나고 나면, 반복문의 조건을 확인해서 다시 실행할지 결정합니다. 만약 플레이어가 25번 칸 이상으로 이동했다면, 반복문의 조건은 false
가 되고 게임이 끝나겠죠.
이 경우에는 while
반복문이 적절한데, 게임 시작 시점에서는 게임의 길이를 알 수 없기 때문입니다. 대신 특정 조건이 만족될 때까지 반복문을 실행하는 거예요.
repeat-while 반복문
while
반복문의 다른 변형인 repeat-while
반복문은 반복문의 조건을 고려하기 전에 먼저 코드 블록을 한 번 실행합니다. 그리고 조건이 false
가 될 때까지 반복을 계속하지요.
기본 형태는 다음과 같아요:
repeat { <#statements#> } while <#condition#>
swift
앞서 본 뱀과 사다리
예제를 while
반복문 대신 repeat-while
반복문으로 작성해 볼게요. finalSquare
, board
, square
, diceRoll
의 초기화는 while
반복문과 동일합니다.
let finalSquare = 25 var board = [Int](repeating: 0, count: finalSquare + 1) board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02 board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08 var square = 0 var diceRoll = 0
swift
이 버전의 게임에서는 반복문의 첫 번째 동작이 사다리나 뱀을 확인하는 것입니다. 게임 판의 어떤 사다리도 25번 칸으로 바로 올라갈 수 없기에 사다리를 타고 게임에서 이길 수는 없어요. 따라서 반복문의 첫 번째 동작으로 뱀이나 사다리를 확인해도 안전하답니다.
게임 시작 시 플레이어는 "제로 칸"에 있습니다. board[0]
는 항상 0
과 같고 아무런 효과가 없죠.
repeat { // 뱀이나 사다리에 따라 위아래로 이동합니다. square += board[square] // 주사위를 굴립니다. diceRoll += 1 if diceRoll == 7 { diceRoll = 1 } // 주사위 숫자만큼 이동합니다. square += diceRoll } while square < finalSquare print("Game over!")
swift
뱀과 사다리를 확인한 후에는 주사위를 굴리고 플레이어를 diceRoll
칸 만큼 앞으로 이동시킵니다. 그리고 현재 반복문 실행이 끝나는 거죠.
반복문의 조건(while square < finalSquare
)은 이전과 동일하지만, 이번에는 반복문의 첫 실행이 끝난 후에야 평가됩니다. repeat-while
반복문의 구조가 이 게임에 더 적합해요. 위의 repeat-while
반복문에서는 while
조건이 square
가 여전히 게임 판 위에 있음을 확인한 직후에 항상 square += board[square]
가 실행됩니다. 이런 동작 덕분에 앞서 설명한 while
반복문 버전의 게임에서 봤던 배열 범위 확인이 필요 없어지는 거예요.
어떤가요? while
과 repeat-while
반복문을 게임 예제와 함께 자세히 살펴봤습니다. 반복문은 Swift에서 매우 강력하고 유용한 제어문 중 하나랍니다. 상황에 맞게 적절한 반복문을 선택해서 사용해 보세요!
while vs repeat-while 반복문 선택하기
조건 검사 시점:
- while: 코드 블록 실행 전에 조건 검사
- repeat-while: 코드 블록 실행 후에 조건 검사
실행 보장:
- while: 조건이 처음부터 false면 한 번도 실행되지 않을 수 있음
- repeat-while: 조건과 상관없이 최소 한 번은 실행됨
용도:
- while: 반복 횟수를 미리 알 수 없을 때
- repeat-while: 반복문을 최소 한 번은 실행해야 할 때
Swift의 반복문을 능숙하게 다루는 것은 코딩 실력 향상에 큰 도움이 될 거예요. 다양한 예제를 통해 반복문을 연습해 보시길 추천합니다!