나 개발자 진짜 되냐?

[ C# 기본 문법 9 ] 반복문 본문

C# 을 맛보았어요!/문법정리를 해보았어요!

[ C# 기본 문법 9 ] 반복문

Snow Rabbit 2024. 9. 21. 22:28

 

 

반복문을 함께 공부해 보자!!

 


 

반복문이란

명령문을 반복해서 실행하는 제어문

 

 

🌟 for문 🌟

초기식, 조건식, 증감식을 사용하여 반복문을 작성

 

for (초기식; 조건식; 증감식)
{
    // 조건식이 참인 경우 실행되는 코드
}

 

초기식은 반복문이 시작될 때 단 한 번 실행되고,

조건식반복문이 실행될 때마다 평가되며,

참(true)인 경우 반복문이 계속 실행됩니다.

증감식반복문이 실행될 때마다 실행되는 식입니다.

 

for (int i = 0; i < 10; i++) 
{
  Console.WriteLine(i);
}

순서가

초기식 > 조건식 > 밑으로 들어와서

writeline > 증감식 > 조건식 밑으로 내려와서

writeline > 증감식 > 조건식...

 

이다.

 

안에다가 초기식 안에는

int = 0으로 변수를 선언할 수 있다.

int i = 0;
for (i = 0 ; i < 10 ; i++)
{
    Console.WriteLine(i);
}

대신! for문안에 변수를 선언한 경우

i는 for문안에서밖에 못쓰기 때문에,

밖에서도 쓰고 싶다면

 

미리 i를 선언해 주고 for문에 넣어주어야 한다.

 

 

 

for문은

for ( int i = 0; i < 10; i++ )

이 구조만 알아도 많이 사용할 수 있다.

여기서는 0-9까지 10번이라는 뜻이지만

 

2부터 하고 싶으면

초기식 값을 2부터, i = 2;

만약에 20번이면 

조건식 값을 20으로, i < 20;

3씩 증가하고 싶으면

증감식 i+=3으로 해주면 된다.

 

큰 틀을 외운다면

그 뒤로는 사용할 수 있는 범위가 늘어난다.

 

 

🌟 while문 🌟

 

조건식이 참(true)인 동안 코드 블록을 반복적으로 실행

while (조건식)
{
    // 조건식이 참인 경우 실행되는 코드
}

for문과 차이가 있다면

for문은 횟수를 정해두고

while은 목표달성까지 횟수제한 없이 돌린다는 의미로

차이가 있다.

 

 

int i = 0;
while (i < 10)
{
    Console.WriteLine(i);
    i++;
}

for문과 나오는 값은 같다.

 

 while은 초기 조건 증감이 없는가?

 

그것도 아니다.

 

int i = 0;

while (i < 10)

    Console.WriteLine(i);
    i++;

 

while문에도

초기 조건 증감 다 있다.

 

for 문은 반복 횟수를 직관적으로 알 수 있고,

반복 조건을 한눈에 확인할 수 있어 가독성이 좋다.

 

while 문은 반복 조건에 따라 조건문의 실행 횟수가 유동적이며,

이에 따라 코드가 더 간결할 수 있다.

 

 

 

🌟  do - while문 🌟

 

while문과 비슷하지만,

조건식을 검사하기 전에 먼저 코드 블록을 한 번 실행하는 점이 다르다.

 

쉽게 말해서

일단 한번 검사해 보고

그다음에 조건문을 판단하겠다.라고 해석할 수 있다.

 

do 안에 있는 값은 최초로 한번 실행될 것이다.

 

int sum = 0;
int num;

do
{
    Console.Write("숫자를 입력하세요 (0 입력 시 종료): ");
    num = int.Parse(Console.ReadLine());
    sum += num;
} while (num != 0);

Console.WriteLine("합계: " + sum);

 

 

이 식도 

먼저 무조건 한 번은

do안에 있는 문장이 실행되고

while을 통해 검사하고 나서

그 값이 참이면

다시 올라가서 do문이 실행되고

 

아닐 경우 탈출하게 된다.

 

 

 

🌟  foreach  🌟

포이치문은

배열이나 컬렉션

뭉탱이들에 대한 반목문을 쓸 때 사용한다.

 

foreach (자료형 변수 in 배열 또는 컬렉션)
{
    // 배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드
}

뭉탱이를 넣어놓고 하나씩 사용하는 것이다.

 

어려우니 예시를 들어보자

string[] inventory = { "빨강","주황","노랑","파랑","검정" };

foreach (string color in inventory)
{
    Console.WriteLine(color);
}

여러 색들이 인벤토리라는 배열에 들어가 있고 있고

foreach문으로

인벤토리 안에 있는 컬러들을 순차적으로 출력한다.

 

 

 

🌟  중첩 반복문 🌟

 

반복문을 두 번씩 쓰는 것!

 

보통 구구단에 많이 쓴다!

 

for (int i = 2; i <= 9; i++)
{
    for (int j = 1; j <= 9; j++)
    {
        Console.WriteLine(i + " x " + j + " = " + (i * j));
    }
}

 

 

 

 

🌟  기타 🌟

Break & Continue

break는 반복문 중지!

 

continue는 현재 반복을 중지하고

다음 반복을 진행하세요!

 

 

간단하게

break는 반복문 조건문 바로 탈출!

 

continue는 skip 하고 다음 조건문 실행!

 

int sum = 0;

while (true)
{
    Console.Write("숫자를 입력하세요: ");
    int input = int.Parse(Console.ReadLine());

    if (input == 0)
    {
        Console.WriteLine("프로그램을 종료합니다.");
        break;
    }

    if (input < 0)
    {
        Console.WriteLine("음수는 무시합니다.");
        continue;
    }

    sum += input;
    Console.WriteLine("현재까지의 합: " + sum);
}

Console.WriteLine("합계: " + sum);

예시를 가져왔다

 

 

숫자를 입력받았을 때

0이면 break이기 때문에

반목문 if문

그리고 while문까지 나와서

합계가 출력될 것이다.

물론 0이겠지만...

 

 

continue의 경우

음수를 받으면 그 if문만 띄어 넘고

while을 다시 돌아 숫자를 입력하세요가 뜨게 된다.

 

while문 옆에 true는 무엇인가?

무한참!

즉 무한으로 굴러간다.

언제까지? 조건식이 끝날 때까지

그래서 while (true)를 하게 되면

꼭 break가 있어주어야 한다.

안 그러면 컴퓨터가 터진다..

 

for문도 무한참을 시켜주러면

for(;;) 해주면 무한참이 된다 ㅎㅋ

 

 

 


자! 이제 복습 겸 예습 겸 공부 겸

해봅시다.

 

 

1. 가위바위보 하기

 

// 배열 생성
string[] choices = { "가위", "바위", "보" };
//string 변수 초기화 ""
string playerChoice = "";
//랜덤으로 값을 낸다. 0부터 2까지만 나온다.
string computerChoice = choices[new Random().Next(0, 3)];

// 값을 안받아왔으니 당연히 이 while문에 들어가진다.
while (playerChoice != computerChoice)
{
    Console.Write("가위, 바위, 보 중 하나를 선택하세요: ");
    playerChoice = Console.ReadLine();

    Console.WriteLine("컴퓨터: " + computerChoice);
    
	//비겼을때 종료, 왜냐면 위에 while문이 거짓으로 나온다. 내값과 컴퓨터 값이 같아서. 
    if (playerChoice == computerChoice)
    {
        Console.WriteLine("비겼습니다!");
    }
    //내가 이기는 조건 가위(&&)이고 보 이거나(||)
    else if ((playerChoice == "가위" && computerChoice == "보") ||
             (playerChoice == "바위" && computerChoice == "가위") ||
             (playerChoice == "보" && computerChoice == "바위"))
    {
        Console.WriteLine("플레이어 승리!");
    }
    // 기타 모든것 = 내가 지는것
    else
    {
        Console.WriteLine("컴퓨터 승리!");
    }
}

 

주석을 다 달아놓았다.

 

컴퓨터는 값을 랜덤 하게 뽑아냈지만

한번 내면 바꾸지 않기 때문에

 

아마도

최대

3판째에 비겨서 게임이 종료될 것이다. 걱정 마쇼

 

 

2. 숫자 맞추기

 

//랜덤하게 숫자 넣기 101까지라 1 - 100까지 나온다.
int targetNumber = new Random().Next(1, 101);
//맞추려는 숫자, 내가 맞추는 숫자. 받아내는 숫자.
int guess = 0;
//추측한 횟수
int count = 0;

Console.WriteLine("1부터 100 사이의 숫자를 맞춰보세요.");

//
while (guess != targetNumber)
{
    Console.Write("추측한 숫자를 입력하세요: ");
    guess = int.Parse(Console.ReadLine());
    //맞출때까지 카운트 되어야하니까 while문에 넣는다.
    count++;

    if (guess < targetNumber) // 컴퓨터 숫자가 더 클때
    {
        Console.WriteLine("좀 더 큰 숫자를 입력하세요.");
    }
    else if (guess > targetNumber) // 내가 추측한 값이 더 클때
    {
        Console.WriteLine("좀 더 작은 숫자를 입력하세요.");
    }
    else // 정답인 경우
    {
        Console.WriteLine("축하합니다! 숫자를 맞추셨습니다.");
        Console.WriteLine("시도한 횟수: " + count);
    }
}

 

위의 문제와 굉장히 비슷하다.

 

 

여기서 for문을 쓸 수 있을까?

되긴 된다.

 

근데 우리는 조건을 맞출 때까지 기 때문에

while문이 더 사용하기가 편리하다.

 

더 클 때,

더 작을 때를

if문으로 구하고

 

값을 맞추면!

탈출하는 방식으로 작성한다.

 

 

반복문과 조건문은 계속 봐줘야 하는 부분이라고 생각한다.

 

앞으로도 자주 찾아보고 자주 익혀봐야겠다.