조건문을 배워서 흐름을 제어했으나, 사이클이 끝나면 그대로 프로그램이 종료된다. 이때 반복문을 활용한다면 원하는 결과를 얻어낼 때까지 컴퓨터에게 특정 코드를 반복 수행시키는 것이 가능하다.
조건문과 반복문은 반복,숙달이 필요하다. 많이 사용해서 익숙해지도록!
for(int i = 3; i > 0; i--)
{
Console.WriteLine("안녕하세요");
}
안녕하세요
안녕하세요
안녕하세요
for 반복문의 경우 (초기식; 조건식; 증감식;)으로 구성되어있다. 초기식에서 변수 설정 및 초기화 작업이 진행되며, 원하는 값을 넣어 특정 횟수만큼 반복 수행시키는 것이 가능하다.
( ) 안의 식의 변수의 경우 { } 내부 함수에 사용하는 것이 아닌 이상, 반복 횟수를 결정짓는 역할만 하기 때문에 최대한 알아보기 쉽게 작성하는 것이 좋다.
주의. 증감식이 없으면, 무한으로 반복된다.
for(int i = 10; i > 0; i--)
{
if(i % 2 == 0)
{
Console.WriteLine(i);
}
else
{
Console.Write("");
}
}
10
8
6
4
2
반복문 { } 내부에 조건문을 사용하여, 특정 조건에서만 기능이 실행되도록 제어할 수 있다.
for(int i = 1; i < 10 i++)
{
for(int j = 1; j < 10; j++)
{
Console.WriteLine($"{i} x {j} = {i*j}");
}
}
구구단 기능을 간단히 구현해보자. 2개의 곱하는 숫자 모두 반복이 되는 경우이므로 반복문을 2번 사용하여 기능을 구현시킬 수 있다.
반복할 범위, 횟수가 정해져있는 경우 for 반복문이 용이하지만, 원하는 상황이 될 때까지 반복을 해야하는 경우 while 반복문을 사용하여 기능을 구현하는 것이 더 편할 수 있다.
bool isTrue = true;
int maxCount = 10;
int count = 1;
while (isTrue)
{
if (count < maxCount)
{
Console.WriteLine($"현재 {count}번째 실행중 입니다.");
count++;
}
else
{
Console.WriteLine("장비를 정지합니다.");
return;
}
}
보통 조건에 부합하는 상황을 설정하기 쉽거나, pseudo 코드를 구현시키는 경우 많이 활용한다. 위의 코드는 count가 10을 넘지 않았으면 좋겠다 라는 pseudo 코드를 구현한 것이다.
int inputInt
do
{
Console.WriteLine("1에서 9사이의 수를 입력하세요.");
string input = Console.ReadLine();
int.TryParse(input, out inputInt);
}
while((1<=inputInt && inputInt<=9)==false);
사용자의 입력을 받아서 기능을 반복해서 수행하는 경우, 처음에 반드시 입력을 받아야하므로 do - while 반복문을 사용한다. 위의 코드의 경우 사용자가 1~9사이의 숫자를 입력할 때까지 계속해서 입력 문구가 출력된다.
int num = 0;
while(true)
{
Console.WriteLine(num);
if(num>=3)
{
break;
}
}
기본적으로 while은 조건이 true인 경우 무한 루프 즉 무한히 반복된다. 이때 루프에서 빠져나오기 위해 사용하는 것이 break 이다. 물론 무한 루프가 아닌, 유한 루프에서도 break 를 활용하여 원하는 상황이 나오면 루프에서 벗어나도록 구현할 수 있다.
for(int i = 10; i > 0; i--)
{
if(i % 2 == 1)
{
continue;
}
Console.WriteLine(i);
}
10
8
6
4
2
continue의 경우 반복문의 맨 처음으로 돌아가도록 하는 구문이다. 반복문 속의 조건문에서 작성한 짝수만 출력하는 코드와 비교해보자. 출력내용은 동일하지만 continue 를 활용하면 아예 실행을 하지 않고 건너뛰는 것이기에 더 빠르고, 가시성 좋게 코드를 짜는 것이 가능하다.
string input1;
int inputInt1;
bool isInt1;
Console.Write("첫 번째 정수를 입력하세요 : ");
input1 = Console.ReadLine();
int.TryParse(input1, out inputInt1);
isInt1 = int.TryParse(input1, out inputInt1);
while (!isInt1)
{
Console.WriteLine("입력한 숫자는 정수 형태가 아닙니다");
isInt1 = int.TryParse(Console.ReadLine();, out inputInt1);
}
개요에서도 말했듯이 반복문을 활용하면 원하는 결과를 얻어낼 때까지 반복이 가능하다. 위의 코드의 경우 정수 형태가 입력될 때까지 반복해서 문구가 출력되는 기능으로, 사용자가 정수 형태를 입력해야 다음으로 넘어갈 수 있도록 구현한 것이다.
이렇게 사용자와의 상호작용으로 이루어지는 게임 개발에서 반복문은 특히 중요하며 for, while 등 여러 반복문을 활용하여 가독성 좋고, 최대한 빠른 속도로 구현시킬 수 있도록 해야한다.
Console.WriteLine("1,2 중 선택해주세요");
int inputInt;
Start:
int.TryParse(Console.ReadLine(),out inputInt);
if(inputInt == 1)
{
goto Chapter1;
}
else if(inputInt == 2)
{
goto Chapter2;
}
else
{
goto End;
}
Chapter1:
Console.WriteLine("당신은 1을 선택했습니다");
goto Start;
Chapter2:
Console.WriteLine("당신은 2를 선택했습니다");
goto Start;
End:
Console.WriteLine("선택지에 없는 것을 선택했습니다");
goto Start;
goto문은 레이블을 형성하여 코드 진행 흐름을 제어하는 구문 중에 하나이다. 다만 구조적 프로그래밍을 지향하는 현대 프로그래밍에서는 레이블이라는 특성 상 구조적 흐름을 깨트리기 때문에 거의 사용하지 않는 구문이다. 또한 goto 문으로 구현된 기능은 for while 등으로 대체하여 구현이 가능하며 위의 코드를 보면 알 수 있듯이 가독성이 좋지않고, 간단한 기능임에도 쓸데없이 길어지는 것을 확인할 수 있다.
조건문과 반복문의 사용이 많아지면 논리 오류를 한 눈에 파악하기 힘들다. 이때 Visual Studio에 디버거 기능을 활용하면 구간 별로 디버그 과정을 진행할 수 있다.
Visual Studio에서는 F5를 눌러서 디버깅을 한다. 하지만 이 경우 프로그램이 처음부터 끝까지 혹은 입력이 필요한 곳까지 코드가 전부 실행되기 때문에, 논리 오류로 값이 제대로 출력되지 않을 때 어디가 잘못되었는지 파악하기가 힘들다.
이 경우 F11을 통해 논리 흐름에 따라 한 줄씩 디버깅하는 것이 가능하다. 아래 창에서 변수 값의 즉각적인 변화를 보며 논리 오류를 파악하기 쉽기 때문에, 앞으로 자주 활용하게 될 것이다. 참고로 F9를 눌러 해당 코드 전까지 실행시키는 것도 가능하다.
사용자가 입력하는 홀수 값에 따라 모양이 달라지는 다이아몬드를 출력하라.
int inputInt;
bool isInt;
Console.Write("출력하고 싶은 다이아몬드의 형태를 홀수로 입력 : ");
isInt = int.TryParse(Console.ReadLine(), out inputInt);
while (true)
{
if (!isInt)
{
Console.Write("입력하신 문자는 정수 형태가 아닙니다. 다시 입력해주세요 : ");
isInt = int.TryParse(Console.ReadLine(), out inputInt);
}
else if (inputInt % 2 == 0)
{
Console.Write("입력하신 숫자는 홀수가 아닙니다. 다시 입력해주세요 : ");
isInt = int.TryParse(Console.ReadLine(), out inputInt);
}
else if (inputInt == 1)
{
Console.Write("1은 입력하실 수 없습니다. 다시 입력해주세요 : ");
isInt = int.TryParse(Console.ReadLine(), out inputInt);
}
else if (inputInt < 0)
{
Console.Write("음수는 입력하실 수 없습니다. 다시 입력해주세요 : ");
isInt = int.TryParse(Console.ReadLine(), out inputInt);
} >
for (int i = -(inputInt / 2); i < 0; i++)
{
for (int j = 0; j < -i; j++)
{
Console.Write(" ");
}
for (int k = 0; k < (inputInt - 2 * -i); k++)
{
Console.Write("*");
}
for (int l = 0; l < -i; l++)
{
Console.Write(" ");
}
Console.WriteLine("");
}
for (int i = 0; i <= (inputInt / 2); i++)
{
for (int j = 0; j < i; j++)
{
Console.Write(" ");
}
for (int k = 0; k < (inputInt - 2 * i); k++)
{
Console.Write("*");
}
for (int l = 0; l < i; l++)
{
Console.Write(" ");
}
Console.WriteLine("");
}
break;
*
***
*****
******* // input이 7인 경우 출력되는 다이아몬드
*****
***
*