24.01.02 TIL - [C#] 기초 (5) : 조건문 & 반복문

JJwoo·2024년 1월 2일
0

C#

목록 보기
5/20
post-thumbnail

제어문(Control Statements)

프로그램의 흐름을 제어하기 위해 사용되는 구문들.
프로그래밍에서 코드의 실행 순서를 결정하고, 특정 조건에 따라 다른 작업을 수행하도록 하는 데 필요합니다. 제어문에는 주로 조건문(Conditional Statements)과 반복문(Loop Statements)이 포함 됨.

💎 조건문

프로그램에서 특정 조건을 기준으로 실행할 코드 블록을 결정한다.

조건에 따라 다른 경로를 선택하게 하여 프로그램의 유연성을 높여준다.

코드가 한 줄의 경우 중괄호 생략도 가능.


1) if 문

주어진 조건식이 참(True)일 때만 실행되는 코드

예시)
if (조건식) {
    // 조건식이 참일 때 실행될 코드
}

int playerScore = 80;
        
if (playerScore >= 70)  // 조건식이 참일 경우 실행함
{
    Console.WriteLine("플레이어의 점수는 70점 이상입니다. 합격입니다!");
}
Console.WriteLine("프로그램이 종료됩니다."); // if가 아니면 출력

2) else 문

if 문의 조건식이 거짓(False)일 때 실행될 코드.
else 문은 if 문과 함께 사용되며, else 자체에는 별도의 조건을 붙이지 않는다.

예시)

if (조건식) {
    // 조건식이 참일 때 실행될 코드
} else {
    // 조건식이 거짓일 때 실행될 코드
}

int itemCount = 5;
string itemName = "HP 포션";

if (itemCount > 0)
{
    Console.WriteLine($"보유한 {itemName}의 수량: {itemCount}");
}
else // 조건식이 거짓일 경우 실행
{
    Console.WriteLine($"보유한 {itemName}이 없습니다.");
}

만약 itemCount = 0 이 된다면

if에서 itemCount > 0 식은 0>0, 거짓 flase가 되기 때문에

if는 패스하고 else로 넘어가는 구조.


3) else if 문

여러 조건 중에서 하나를 선택해야 할 때 사용. if 다음에 여러 개의 else if 블록을 추가하여 다양한 조건을 체크

  • if 문의 조건식이 거짓일 때, 새로운 조건식을 사용하여 실행 여부를 결정하는 조건문.
if (조건식1) {
    // 조건식1이 참일 때 실행될 코드
} else if (조건식2) {
    // 조건식1은 거짓이고 조건식2가 참일 때 실행될 코드
} else {
    // 모든 조건식이 거짓일 때 실행될 코드
}



if (조건식1)**```
텍스트
```**
{
    // 조건식1이 참일 경우 실행할 코드
}
else if (조건식2)
{
    // 조건식2가 참일 경우 실행할 코드
}
else
{
    // 모든 조건식이 거짓일 경우 실행할 코드
}

예시3)

int playerScore = 100;
string playerRank = "";

if (playerScore >= 90)
{
    playerRank = "Diamond";
}
else if (playerScore >= 80)
{
    playerRank = "Platinum";
}
else if (playerScore >= 70)
{
    playerRank = "Gold";
}
else if (playerScore >= 60)
{
    playerRank = "Silver";
}
else
{
    playerRank = "Bronze";
}

Console.WriteLine("플레이어의 등급은 " + playerRank + "입니다.");

4) 중첩 조건문

하나의 조건문 안에 또 다른 조건문이 포함된 형태의 조건문.

int itemLevel = 3; // 아이템 레벨
string itemType = "Weapon"; // 아이템 종류

if (itemType == "Weapon")
{
    if (itemLevel == 1)
    {
        // 레벨 1 무기 효과
        Console.WriteLine("공격력이 10 증가했습니다.");
    }
    else if (itemLevel == 2)
    {
        // 레벨 2 무기 효과
        Console.WriteLine("공격력이 20 증가했습니다.");
    }
    else
    {
        // 그 외 무기 레벨
        Console.WriteLine("잘못된 아이템 레벨입니다.");
    }
}
else if (itemType == "Armor")
{
    if (itemLevel == 1)
    {
        // 레벨 1 방어구 효과
        Console.WriteLine("방어력이 10 증가했습니다.");
    }
    else if (itemLevel == 2)
    {
        // 레벨 2 방어구 효과
        Console.WriteLine("방어력이 20 증가했습니다.");
    }
    else
    {
        // 그 외 방어구 레벨
        Console.WriteLine("잘못된 아이템 레벨입니다.");
    }
}
else
{
    // 그 외 아이템 종류
    Console.WriteLine("잘못된 아이템 종류입니다.");
}

5) switch 문

변수나 식의 값에 따라 여러 경우의 코드를 실행할 수 있는 조건문이다.

case 레이블을 사용해 가능한 각 값을 위한 코드 블록을 정의한다.

switch (변수나 식)
{
    case1:
        // 값1이 나온 경우 실행되는 코드
        break;
    case2:
        // 값2가 나온 경우 실행되는 코드
        break;
        // (case 생략)...
    default:
        // 모든 case문에 해당하지 않는 경우 실행되는 코드
        break;
}

switch에 특정한 변수나 식을 주게 되어 특정 case에 진입하고
break; 까지 실행하고 switch 구문을 벗어나 다음 코드 진행

예시)

Console.WriteLine("게임을 시작합니다.");
Console.WriteLine("1: 전사 / 2: 마법사 / 3: 궁수");
Console.Write("직업을 선택하세요: ");
string job = Console.ReadLine();

switch (job)
{
    case "1":  // job이 string 이기 때문에 " " 로 표현
        Console.WriteLine("전사를 선택하셨습니다.");
        break;
    case "2":
        Console.WriteLine("마법사를 선택하셨습니다.");
        break;
    case "3":
        Console.WriteLine("궁수를 선택하셨습니다.");
        break;
    default:
        Console.WriteLine("올바른 값을 입력해주세요.");
        break;
}

Console.WriteLine("게임을 종료합니다.");
  • job은 문자열(string) 이기 때문에 case 안에 숫자를 " " 로 감싸줘야 함

  • 반복문은 주어진 조건에 따라 코드 블록을 여러 번 실행한다. 코드를 반복해서 처리할 때 유용하며, 데이터의 모든 요소를 처리하거나 반복적인 작업을 할 때 쓴다.


6) 삼항 연산자

if 문의 간단한 형태로, 조건식의 결과에 따라 두 개의 값 중 하나를 선택할 수 있게 해주는 연산자.

삼항 연산자를 사용하면 if-else 구문을 좀 더 짧고 간결하게 표현할 수 있어서 코드를 간단하게 만들고 싶을 때 유용하며, 주로 간단한 조건에 따른 값 할당에 많이 쓰인다.

예를 들어, 어떤 숫자가 짝수인지 홀수인지에 따라 문자열을 다르게 할당하고 싶을 때 다음과 같이 삼항 연산자를 사용할 수 있다.

(조건식) ? 참일 때의 값 : 거짓일 때의 값

예시1) 삼항 연산자 사용
int number = 10;
string result = (number % 2 == 0) ? "짝수" : "홀수";
Console.WriteLine(result);


예시2) if else 문으로 바꾸면
int number = 10;
string result;

if (number % 2 == 0) {
    result = "짝수";
} else {
    result = "홀수";
}

Console.WriteLine(result);
예시3)
int currentExp = 1200;
int requiredExp = 2000;


# 삼항 연산자
string result = (currentExp >= requiredExp) ? "레벨업 가능" : "레벨업 불가능";
Console.WriteLine(result);


# if else 문
if (currentExp >= requiredExp)
{
    Console.WriteLine("레벨업 가능");
}
else
{
    Console.WriteLine("레벨업 불가능");
}

삼항 연산자 = if else 문과 같음

삼항 연산자는 코드의 가독성을 해칠 수도 있으니 복잡한 조건이나 여러 조건을 연결할 때는 if-else 구문을 사용하는 게 더 나을 수도 있다.

하지만 간단한 조건에 대해선 삼항 연산자가 매우 편리하게 쓰일 수 있다.


🧨 조건문 실습

1) 홀/짝 구분


            //1) 홀짝
            Console.WriteLine("번호를 입력: ");
            int number = int.Parse(Console.ReadLine());

            // 나머지 연산
            if (number % 2 == 0)
            {
                Console.WriteLine("짝수.");
            }
            else
            {
                Console.WriteLine("홀수.");
            }

2) 등급 출력

switch문 활용


        static void Main(string[] args)
        {
            //등급 출력
            int score = 100;
            string rank = "";

            switch(score / 10)  // 10을 나눠서 10단위로 case에 활용
            {
                case 10: // 이게 없으면 100점인 경우 default로 가버림, case 10에서 9로 진행. 
                case 9:
                    rank = "다이아몬드";
                    break;
                case 8:
                    rank = "플래티넘";
                    break;
                case 7:
                    rank = "골드";
                    break;
                case 6:
                    rank = "실버";
                    break;
                default:
                    rank = "브론즈";
                    break;

            }

            Console.WriteLine(rank);
        }

3) 로그인 프로그램

            // 로그인 프로그램
            string id = "id";
            string password = "pw";

            Console.Write("아이디를 입력하세요: ");
            string inputId = Console.ReadLine();
            Console.Write("비밀번호를 입력하세요: ");
            string inputPassword = Console.ReadLine();

            if (id == inputId && password == inputPassword)
            {
                Console.WriteLine("로그인 성공");
            }
            else
            {
                Console.WriteLine("로그인 실패");
            }
            

4) 알파벳 판별 프로그램

            //알파벳 판별
            Console.Write("문자를 입력: ");
            char input = Console.ReadLine()[0]; // [ ] 인덱싱, 0은 문자열에서 제일 앞에 것을 가져옴

            // 소문자 a ~ z, 대문자 A~Z 범위에 해당 되면 알파벳   
            if ( (input >= 'a' && input <= 'z') || input >= 'A' && input <= 'Z')
            {
                Console.WriteLine("알파벳입니다.");
            }
           else
            {
                Console.WriteLine("알파벳이 아닙니다.");
            }

💿 반복문

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

1) for 문

초기식, 조건식, 증감식으로 구성

일정 횟수를 알고 있거나 특정 범위의 숫자를 순회할 때 사용된다. 초기식에서 시작해 조건식이 거짓이 될 때까지 반복되며, 각 반복 후에 증감식이 실행된다. 주로 배열이나 리스트와 같은 컬렉션의 정해진 범위를 순회할 때 매우 효과적이다.

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

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

초기를 만족 시키고, 조건을 검사해서, WriteLine 출력 후 다시 증감식으로 진행, 조건 확인 후 맞으면 i ++ 진행


2) while 문

조건식이 참인 동안 코드 블록을 계속 실행한다.
주로 얼마나 많은 반복이 필요한지 미리 알 수 없을 때 사용된다.

예를 들어, 사용자 입력이나 파일의 끝에 도달할 때까지 데이터를 읽는 경우에 적합하다.

while (조건식)
{
    // 조건식이 참인 경우 실행되는 코드
}
int i = 0; //초기
while (i < 10)  //조건
{
    Console.WriteLine(i);
    i++; // 증감
}

결국 for 문과 비슷
int count = 0;
while (count < 10)
{
    Console.WriteLine("적을 처치했습니다! 남은 적 수: " + (10 - count - 1));
    count++;
}

Console.WriteLine("축하합니다! 게임에서 승리하셨습니다!");

3) for 문 vs while 문 비교

for문 예시)

int sum = 0;

for (int i = 1; i <= 5; i++)
{
    sum += i;
}

Console.WriteLine("1부터 5까지의 합은 " + sum + "입니다.");
while문 예시)

int sum = 0;
int i = 1;

while (i <= 5)
{
    sum += i;
    i++;
}

Console.WriteLine("1부터 5까지의 합은 " + sum + "입니다.");

for : 반복 횟수를 직관적으로 알 수 있고, 반복 조건을 한 눈에 확인할 수 있어 가독성이 좋다.

while : 반복 조건에 따라 조건문의 실행 횟수가 유동적이며, 이에 따라 코드가 더 간결할 수 있다.

어떤 반복문을 사용할지는 코드의 흐름에 따라 상황에 맞게 선택.


4) do-while 문

적어도 한 번은 반복문의 코드를 실행한 후 조건을 검사한다.

while 문과 유사하지만, 반복문의 코드가 최소 한 번은 실행됨을 보장한다. 사용자 입력을 받고 검증해야 할 때 유용하다.

do
{
    // 조건식이 참인 경우 실행되는 코드
}
while (조건식);
int sum = 0;
int num;

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

Console.WriteLine("합계: " + sum);
// 사용자가 유효한 숫자를 입력할 때까지 계속 요청
int number;
do {
    Console.Write("0 이상의 숫자를 입력하세요: ");
    number = Convert.ToInt32(Console.ReadLine());
} while (number < 0);

5) foreach 문

배열이나 컬렉션에 대한 반복문을 작성할 때 사용.

컬렉션의 시작부터 끝까지 각 요소에 대해 반복 실행하며, 주로 컬렉션의 모든 요소에 접근할 때 쓰인다.

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

string[] inventory = { "검", "방패", "활", "화살", "물약" }; //string의 배열들, 순서대로 하나씩 대입 됨

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

foreach 루프의 반복에서, inventory 배열의 현재 요소를 참조하여
item이라는 변수에 순차적으로 할당

출력)
검
방패
활
화살
물약

6) 중첩반복문

반복문 안에 또 다른 반복문이 들어가는 구조로, 다차원 배열이나 리스트 같은 복잡한 데이터 구조를 처리할 때 사용된다. 각 요소에 대한 세밀한 제어가 필요할 때 흔히 볼 수 있다.

for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 3; j++)   
    {
        Console.WriteLine("i: {0}, j: {1}", i, j);
    }
}
// 총  5x3  -> 15번 반복
// 2차원 배열의 각 요소를 출력
int[,] matrix = new int[3, 3];
for (int i = 0; i < matrix.GetLength(0); i++) {
    for (int j = 0; j < matrix.GetLength(1); j++) {
        Console.Write(matrix[i, j] + " ");
    }
    Console.WriteLine();
}

구구단 예시)
 
for (int i = 2; i <= 9; i++)//처음 조건 실행하고 밑으로
{
    for (int j = 1; j <= 9; j++) // 9까지 실행하고 다시 위로
    {
        Console.WriteLine(i + " x " + j + " = " + (i * j));
    }
}

  • 7) Break & Continue

    • break는 현재의 반복문을 즉시 종료하고 반복문 블록 바깥으로 빠져나온다
    • continue는 현재 반복을 중지하고, 반복문의 다음 반복으로 즉시 넘어간다.

break는 루프를 완전히 끝내야 할 때,

continue는 특정 조건을 만족할 때 해당 반복만 건너뛰고 싶을 때 사용된다.

for (int i = 1; i <= 10; i++)
{
    if (i % 3 == 0) // 3의 배수 일 때
    {
        continue; // i가 3의 배수인 경우 다음 숫자로 넘어감
    }
    Console.WriteLine(i); // 3의 배수만 빼고 출력
    
    if (i == 7) // i가 7이되면 끝내고 싶다는 뜻
    {
        break; // 7이 출력된 이후에는 반복문을 빠져나감
    }
}

Continue : 조건에 맞는 회차를 건너 뛰고 다시 증감식으로.
Break : 구문 밖으로.



예제)

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);

🏑 반복문 실습

1) 가위바위보 만들기

            //가위바위보
            string[] choice = { "가위", "바위", "보" };
            string playerChoice = "";
            string computerChoice = choice[new Random().Next(0,3)]; // 0~2까지만 랜덤으로.

            while (playerChoice != computerChoice)
            {
                Console.Write("가위, 바위, 보중 하나를 선택하세요 : ");
                playerChoice = Console.ReadLine();

                if (playerChoice == computerChoice)
                {
                    Console.WriteLine("비겼습니다.");
                }
                else if (
                    (playerChoice == "가위" && computerChoice == "보") ||
                    (playerChoice == "바위" && computerChoice == "가위") ||
                    (playerChoice == "보" && computerChoice == "바위")
                    )
                {
                    Console.WriteLine("플레이어 승리!");
                }
                else
                {
                    Console.WriteLine("컴퓨터 승리!");
                }
            }

Random 클래스의 Next() 메서드를 사용

Random변수명 = new Random();
-> 랜덤 타입의 객체를 생성

next() : 임의의 정수를 반환하는 메서드 ( n>=0 )


2) 숫자 맞추기

            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());
                count++;

                if (guess < targetNumber)
                {
                    Console.WriteLine("좀 더 큰 숫자를 입력하세요.");
                }
                else if (guess > targetNumber)
                {
                    Console.WriteLine("좀 작은 숫자를 입력하세요.");
                }
                else
                {
                    Console.WriteLine("정답입니다!");
                    Console.WriteLine("시도한 횟수 : " + count);
                }
            }
            
profile
개발 모코코

0개의 댓글