[Unity 입문 강좌 - 8] C# for, while문 / 반복문

반복문이란?

 

반복문은 게임 개발 시 자주 사용되는 프로그래밍 구조 중 하나입니다. 반복문은 특정 조건이 만족될 때까지 또는 지정된 횟수만큼 코드 블록을 반복 실행하도록 합니다. 이는 게임 개발에서 다양한 상황에서 활용될 수 있습니다, 예를 들어, 적들을 생성하거나, 인벤토리 아이템을 검사하거나, 플레이어가 특정 조건을 충족할 때까지 이벤트를 반복하는 등의 작업을 수행할 때 유용합니다.

 


1. for 반복문


for 반복문은 가장 많이 사용되는 반복문 중 하나입니다. for 반복문은 반복의 횟수가 명확할 때 주로 사용됩니다. for 반복문은 다음과 같은 구조를 가지고 있습니다.

 

  • 초기화 : 반복문이 시작될 때 딱 한 번 실행되는 코드입니다. 
  • 조건 : 반복문이 실행될 때마다 검사하는 코드입니다. 조건이 true일 경우 반복문이 실행됩니다. 
  • 증감 : 반복문이 한 번 실행될 때마다 실행되는 코드입니다.

 

for (초기화; 조건; 증감) {
    반복할 코드
}

 

아래 코드는 for문의 예시 코드로 10번 반복하여 콘솔에 숫자를 출력합니다. for반복문은 지정된 조건이 참인 동안, 즉 조건이 true인 동안 코드 블록을 반복해서 실행합니다. 

 

  • 'int i =0'은 반복문이 시작하기 전에 한 번만 실행됩니다. int는 변수 i의 타입을 정의합니다. i = 0는 변수 i를 0으로 초기화하는 것을 나타냅니다.
  • ' i < 10'은 반복문이 각 반복을 시작하기 전에 평가되는 조건입니다. 이 조건이 true, 즉 i의 값이 10보다 작을 경우, 반복문의 코드 블록이 실행됩니다. i가 10이 되는 순간, 조건이 false가 되어 반복문의 실행이 중단됩니다.
  • i++는 각 반복의 끝에서 실행되어 i의 값을 1씩 증가시킵니다. 이는 다음 반복을 위해 i의 값을 업데이트하는 것으로, 반복문이 언젠가는 중단되도록 보장합니다. 이렇게 반복문을 돌리면 결과적으로, 0부터 9까지의 숫자가 콘솔에 출력됩니다.

 

for (int i = 0; i < 10; i++) {
    Debug.Log(i);
}

 


2. while 반복문


while 반복문은 조건이 true일 때 계속해서 반복하는 반복문입니다. while 반복문은 다음과 같은 구조를 가지고 있습니다. 아래 구조에서 조건은 while 반복문이 실행될 때마다 검사하는 코드입니다. 

 

while (조건) {
    반복할 코드
}

 

아래 코드는 while문의 예시 코드로 특정조건(health가 0보다 클 때)까지 반복하여 플레이어의 health를 감소시키는 예시입니다. 먼저 health라는 이름의 변수를 선언하고, 그 값을 10으로 초기화합니다. 이는 플레이어의 초기 체력을 나타냅니다.

 

  • while반복문은 괄호 안의 조건이 참(true)인 동안 반복해서 코드블록을 실행합니다. 여기서 조건은 health > 0 즉, 플레이어의 체력이 0보다 클 경우입니다. 이 조건이 참인 동안, 즉 체력이 0보다 큰 동안 반복문 내부의 코드가 반복적으로 실행됩니다. 
  • health --는 health 변수의 값을 1씩 감소시키는 연산입니다. 이는 health = health -1과 동일한 작업을 수행합니다.  반복문이 실행될 때마다 체력이 감소하고, 각각의 새로운 체력 값이 출력됩니다. 최종적으로 플레이어의 체력이 0이되면 반복문이 중단되고, 프로그램은 종료됩니다.

 

int health = 10;

while (health > 0) {
    health--;
    Debug.Log("플레이어의 현재 체력: " + health);
}

 


3. do-while 반복문

 

do-while 반복문은 while 반복문과 비슷하지만, 조건을 검사하기 전에 코드 블록을 최소 한 번 실행하고, 그 후에 주어진 조건에 따라 추가 실행 여부를 결정합니다. 이는 최소한 한 번은 코드가 실행되어야 할 때 유용합니다. do-while 반복문은 다음과 같은 구조를 가지고 있습니다.

 

do {
    반복할 코드
} while (조건);

 

아래 코드는 do-while문의 예시 코드로 사용자가 '3. 종료' 옵션을 선택할 때까지 메뉴를 반복해서 표시합니다. 메뉴 옵션은 1. 게임 시작, 2. 설정, 3. 종료로 구성되어 있습니다. 

 

사용자 입력 대신 Random().Next(1, 4)를 사용하여 1부터 3 사이의 임의의 숫자를 생성하고, 이를 menuOption 변수에 할당합니다. 실제 게임이나 애플리케이션에서는 사용자로부터 입력을 받는 방식을 구현해야 합니다.

 

  • switch문을 사용하여 사용자의 선택에 따라 다른 메시지를 출력합니다.
  • 사용자가 '3. 종료'를 선택하기 전까지는 do-while 반복문이 계속해서 메뉴를 표시합니다.
  • '3. 종료'가 선택되면, 반복문이 종료되고 프로그램 종료 메시지를 출력합니다.

 

int menuOption = 0;

do {
    // 메뉴 옵션을 사용자에게 표시
    Debug.Log("1. 게임 시작");
    Debug.Log("2. 설정");
    Debug.Log("3. 종료");

    // 여기서는 예시를 위해 사용자 입력 대신 임의의 값을 할당합니다.
    // 실제 유니티 프로젝트에서는 사용자 입력을 받는 방법(예: UI 버튼 클릭)을 사용해야 합니다.
    menuOption = new Random().Next(1, 4); // 1, 2, 3 중 하나를 임의로 선택

    Debug.Log($"선택한 메뉴 옵션: {menuOption}");

    // 선택한 메뉴 옵션에 따른 동작 처리
    switch (menuOption) {
        case 1:
            Debug.Log("게임을 시작합니다.");
            break;
        case 2:
            Debug.Log("설정 메뉴로 이동합니다.");
            break;
        case 3:
            Debug.Log("게임을 종료합니다.");
            break;
        default:
            Debug.Log("잘못된 선택입니다. 다시 선택해주세요.");
            break;
    }
} while (menuOption != 3); // 사용자가 '3. 종료'를 선택할 때까지 반복

Debug.Log("프로그램을 종료합니다.");

 


4. foreach 반복문


foreach 반복문은 컬렉션(예: 배열, 리스트 등)의 각 요소에 대해 반복 실행을 하고자 할 때 매우 유용합니다. foreach는 컬렉션의 시작부터 끝까지 순차적으로 요소를 하나씩 참조하여, 해당 요소에 대한 처리를 수행합니다. 아래 구조에서 반복문이 실행될 때마다 배열의 요소를 하나씩 가져와서 변수에 대입합니다.

 

  • 타입: 컬렉션에 저장된 요소의 데이터 타입.
  • 변수명: 반복 중 현재 요소를 참조하는 변수의 이름.
  • 컬렉션명: 순회할 컬렉션의 이름.

 

foreach (타입 변수명 in 컬렉션명) {
    // 반복 실행할 코드
}

 

아래 코드는 foreach 문의 예시 코드로 배열의 각 요소를 순회하며, 그 값을 콘솔에 출력하는 예제입니다. 

 

  • int[] numbers = {1, 2, 3, 4, 5}; 이 부분은 int 타입의 배열 numbers를 선언하고, 동시에 1부터 5까지의 숫자로 초기화합니다. 이 경우, 배열 numbers는 총 5개의 요소를 갖게 됩니다.
  • foreach (int number in numbers) 구문에서, int number는 반복문이 현재 순회하고 있는 배열의 요소를 가리키는 변수입니다. numbers는 순회될 배열의 이름입니다. foreach 반복문의 바디({ ... }) 내에 있는 코드는 배열의 각 요소에 대해 한 번씩 실행됩니다.

 

int[] numbers = {1, 2, 3, 4, 5};

foreach (int number in numbers) {
    Debug.Log(number);
}

 


5. for문, While문 중첩

 

5.1 for문 중첩

 

for 문 중첩은 하나의 for 문 안에 다른 for 문을 포함시키는 것을 말합니다. 주로 2차원 배열이나 리스트를 다룰 때, 또는 복잡한 데이터 구조를 순회할 때 사용됩니다. 이때 문법은 동일합니다. 변수는 보통 i, j, k, l ... 순으로 지정합니다. 다른 변수명으로 지정해도 문제는 없습니다.

 

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 2; j++) {
        Debug.Log($"i: {i}, j: {j}");
        if (j == 1) break; // j가 1일 때 내부 for 문 중단
    }
}

 


5.2 while문 중첩

 

while 문 중첩은 한 while 문 안에 다른 while 문을 포함시키는 것입니다. 이것은 더 복잡한 반복 조건이나 다양한 상황에서의 반복 처리에 유용하게 사용됩니다. 이때 문법은 동일합니다. 

 

int i = 0;
while (i < 3) {
    int j = 0;
    while (j < 2) {
        Debug.Log($"i: {i}, j: {j}");
        j++;
        if (j == 1) break; // j가 1일 때 내부 while 문 중단
    }
    i++;
}

 


5.3 for문과 while문 중첩

 

for 문과 while 문을 서로 중첩하여 사용하는 것도 가능합니다. 이러한 중첩은 다양한 반복 조건을 조합할 때 유용합니다.

 

for (int i = 0; i < 3; i++) {
    int j = 0;
    while (j < 2) {
        Debug.Log($"i: {i}, j: {j}");
        j++;
        if (j == 1) break; // j가 1일 때 while 문 중단
    }
}

 


6. 반복문에서의 제어문

 

반복문에는 break, continue, return, goto와 같이 반복문의 흐름을 제어하는 제어문이 있습니다.

 


 

6.1 break문

break 문은 중첩된 반복문에서 사용될 때 가장 가까운 반복문만을 종료시킵니다. 

 

for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        // i가 5일 때 반복문 종료
        break;
    }
    Debug.Log(i);
}

 


6.2 continue

 

continue 문은 현재 반복을 중단하고 반복문의 다음 반복으로 즉시 이동하게 합니다. for, while, do-while 반복문에서 사용할 수 있으며, 주로 특정 조건 하에서 남은 코드의 실행을 건너뛰고 싶을 때 사용됩니다.

 

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) continue; // i가 짝수면 아래 코드를 실행하지 않고 다음 반복으로 넘어감
    Debug.Log(i); // 홀수만 출력됨
}

 


6.3 return

 

return 문은 현재 실행 중인 함수에서 즉시 탈출합니다. 반복문 내에서 return을 사용하면, 해당 반복문 뿐만 아니라 그 반복문을 포함하는 함수의 실행도 종료됩니다. 이는 특정 조건이 만족되었을 때 더 이상의 실행이 불필요하거나 원하는 결과를 얻었을 때 함수를 즉시 종료시키고 싶을 때 유용합니다.

 

void CheckNumbers() {
    for (int i = 0; i < 10; i++) {
        if (i == 5) return; // i가 5에 도달하면 함수 실행을 중단
        Debug.Log(i);
    }
    // i가 5에 도달하면 여기에 도달하지 않음
}

 


6.4 goto

 

goto 문은 지정된 레이블로 즉시 점프합니다. goto는 다른 제어 흐름 구조를 사용하기 어려운 특수한 경우에 한하여 제한적으로 사용됩니다. goto의 사용은 일반적으로 권장되지 않으며, 코드의 가독성과 유지보수성을 떨어뜨릴 수 있기 때문에 가능한 피하는 것이 좋습니다.

 

for (int i = 0; i < 10; i++) {
    if (i == 5) goto customLabel; // i가 5에 도달하면 customLabel로 점프
    Debug.Log(i);
}

customLabel:
Debug.Log("i가 5에 도달하여 레이블로 점프함");