🔥 while 반복문

865자
11분

Swift에서는 특정 조건이 거짓(false)이 될 때까지 코드 블록을 반복 실행하는 while 반복문을 제공하지요. 이러한 반복문은 반복 횟수를 미리 알 수 없을 때 사용하면 유용합니다. Swift에서는 두 가지 형태의 while 반복문을 지원하는데요, 하나는 while이고 다른 하나는 repeat-while입니다.

while 반복문

while 반복문은 매 반복마다 조건을 먼저 평가합니다. 조건이 true이면 코드 블록이 실행되고, 조건이 false가 될 때까지 이 과정을 반복하지요. 기본적인 형태는 다음과 같습니다:

while <#condition#> {
   <#statements#>
}
swift

이제 간단한 뱀과 사다리 게임 예제를 통해 while 반복문을 살펴볼까요?

lecture image

게임의 규칙은 아래와 같습니다:

  • 게임 판에는 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과 같습니다 (311의 차이). 값과 구문을 정렬하기 위해 단항 더하기 연산자(+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번 칸을 지나치게 했다면 게임은 끝납니다. 이 경우를 처리하기 위해 squareboard 배열의 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 반복문 버전의 게임에서 봤던 배열 범위 확인이 필요 없어지는 거예요.

어떤가요? whilerepeat-while 반복문을 게임 예제와 함께 자세히 살펴봤습니다. 반복문은 Swift에서 매우 강력하고 유용한 제어문 중 하나랍니다. 상황에 맞게 적절한 반복문을 선택해서 사용해 보세요!

while vs repeat-while 반복문 선택하기

조건 검사 시점:

  • while: 코드 블록 실행 전에 조건 검사
  • repeat-while: 코드 블록 실행 후에 조건 검사

실행 보장:

  • while: 조건이 처음부터 false면 한 번도 실행되지 않을 수 있음
  • repeat-while: 조건과 상관없이 최소 한 번은 실행됨

용도:

  • while: 반복 횟수를 미리 알 수 없을 때
  • repeat-while: 반복문을 최소 한 번은 실행해야 할 때

Swift의 반복문을 능숙하게 다루는 것은 코딩 실력 향상에 큰 도움이 될 거예요. 다양한 예제를 통해 반복문을 연습해 보시길 추천합니다!