-
I. 조건문
: 주어진 조건식의 결과에 따라 프로그램의 제어 흐름을 변경하는 제어문
1. if 문
if (조건)
{
<조건식이 참일 경우 실행문>
}int playerScore = 80; if (playerScore >= 70) // !! playerScore 은 70보다 크므로, 실행문이 실행이 됨. { Console.WriteLine("플레이어의 점수는 70점 이상입니다. 합격입니다!"); } Console.WriteLine("프로그램이 종료됩니다.");
>
2. if .. else 문
!! else 문의 경우, 조건식이 거짓일 경우가 필요한 경우에만 작성한다.
if 문 만으로도 코드 자체는 실행되기 때문.
if (조건)
{
<조건식이 참일 경우 실행문>
}
else
{
<조건식이 거짓일 경우 실행문>
}else 는 if 가 아닌 모든 경우이므로, 조건을 붙일 필요가 없다.
int itemCount = 0; string itemName = "HP 포션"; if (itemCount > 0 // !! 조건문 불만족 { Console.WriteLine($"보유한 {itemName}의 수량: {itemCount}"); } else { Console.WriteLine($"보유한 {itemName}이 없습니다."); // !! else 문 실행 }
>
3. else if 문
if (조건)
{
<조건식이 참일 경우 실행문>
}
else if (조건2)
{
<조건1이 거짓이고 조건2식이 참일 경우 실행문>
}
else
{
<조건1과 조건2가 모두 거짓일 경우 실행문>
}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 + "입니다.");
>
!! 만약, 순서가 뒤집힌다면?
int playerScore = 100; string playerRank = ""; if (playerScore >= 70) !! Gold를 앞에 두어봄. { playerRank = "Gold"; } else if (playerScore >= 80) { playerRank = "Platinum"; } else if (playerScore >= 90) { playerRank = "Diamond"; } else if (playerScore >= 60) { playerRank = "Silver"; } else { playerRank = "Bronze"; } Console.WriteLine("플레이어의 등급은 " + playerRank + "입니다.");
>
조건에 대한 실행문이 실행된 이후, 실행이 멈췄기 때문에 playerScore가 100점일 지라도, Diamond나, Platinum을 만족한다는 문구는 뜨지 않는다.
이를 통해, else if 문이 다음과 같이 작동됨을 알 수 있다.
int playerScore = 100; string playerRank = ""; if (playerScore >= 70) // !! 1. 조건1 : 70점 이상인가? { playerRank = "Gold"; // !! 2. 참일 경우, 해당 실행문 실행, 이후 종료. } else // !! 3. 조건1이 거짓이라면.. { if (playerScore >= 80) // !! 3. 조건2 : 80점 이상인가? { playerRank = "Platinum"; // !! 4. 참일 경우, 해당 실행문 실행, 이후 종료. } else // !! 5. 조건2가 거짓이라면.. { if (playerScore >= 90) // !! 5. 조건3 : 90점 이상인가? { playerRank = "Diamond"; // !! 6. 참일 경우, 해당 실행문 실행, 이후 종료. } else // !! 7. 조건3이 거짓이라면.. { if (playerScore >= 60) // !! 7. 조건4 : 60점 이상인가? { playerRank = "Silver"; // !! 8. 참일 경우, 해당 실행문 실행, 이후 종료. } else // !! 9. 조건4가 거짓이라면.. { playerRank = "Bronze"; // !! 9. 해당 실행문 실행 } } } } Console.WriteLine("플레이어의 등급은 " + playerRank + "입니다.");
따라서, else if 문을 사용할 경우, 조건간의 만족범위에 대해 생각하고, 순차적으로 조건의 범위가 포함하면서 넓어지도록 코드를 작성해야 한다.
4. 중첩 조건문
: 하나의 조건문 아래 다른 조건문이 있는 경우
!! 바로 위의 코드가 중첩조건문에 해당함.
5. switch 문
: 변수나 식의 결과에 따라 다른 코드 블록을 실행하는 제어문
: case 문을 사용하여 변수나 식의 결과에 따라 실행할 코드를 지정.
: case에 들어가는 조건은 고정된 상수여야 하며, 중복되면 안된다.
!! if 문과 switch
: switch문으로 구현가능한 것은 if문으로 구현 가능
: if 문의 경우, 위에서부터 순차적으로 값을 대입함.
: 조건의 수가 늘어날 경우, switch 문이 더 빠름.
: if 문의 경우, 메모리 사용을 줄일 수 가 있다.
: 큰 차이는 없기 때문에, 상황에 따라, 조건에 따라, 가독성이 좋은 것을 활용하자.
switch (변수나 식)
{
case 값1:
<값1에 대응하는 실행문>
break;
case 값2:
<값2에 대응하는 실행문>
break;
// ... 생략
default:
<모든 case문에 해당하지 않는 경우의 실행문>
break;
}namespace ifelseif; internal class Program { static void Main(string[] args) { Console.WriteLine("게임을 시작합니다."); Console.WriteLine("1: 전사 / 2: 마법사 / 3: 궁수"); Console.Write("직업을 선택하세요: "); string job = Console.ReadLine(); switch (job) { case "1": Console.WriteLine("전사를 선택하셨습니다."); break; case "2": Console.WriteLine("마법사를 선택하셨습니다."); break; case "3": Console.WriteLine("궁수를 선택하셨습니다."); break; default: Console.WriteLine("올바른 값을 입력해주세요."); break; } Console.WriteLine("게임을 종료합니다."); } }
>
!! 2개 이상의 조건을 하나의 코드로 향하게 할 때는 break문을 생략함으로 이루어낸다.
!! goto case 문을 활용하여, 특정 조건의 코드로 이동할 수 있다.
string capital = "KOREA"; switch(capital) { case "KOREA": // !! 조건을 만족하고 break이 없으므로, 아래의 코드를 실행 // "서울" case "한국": Console.WriteLine("서울"); break; case "CANADA": case "캐나다": Console.WriteLine("몬트리올"); break; case "JAPAN": Console.WriteLine("도쿄"); break; case "일본": // !! 해당 조건을 만족하면 아래에 해당하는 조건으로 이동하여 코드를 실행 goto case "JAPAN"; default: Console.WriteLine("지원되지 않는 나라입니다."); break; }
6. 삼항연산자
: if 문의 간단한 형태로, 조건식의 결과에 따라 두 값을 선택하는 연산자
(조건식) ? 참일 경우 값 : 거짓일 경우 값;
int currentExp = 1200; int requiredExp = 2000; string result = (currentExp >= requiredExp) ? "레벨업 가능" : "레벨업 불가능"; Console.WriteLine(result);
!! if else 문과 차이가 없다. 아래의 코드와 위의 코드가 같다. 다만, 조건문의 결과가 간단하게 떨어질 경우, 삼항연산자를 활용한다면 코드를 더 간결하게 만들 수 있을 것이라 기대된다.
int currentExp = 1200; int requiredExp = 2000; if (currentExp >= requiredExp) { Console.WriteLine("레벨업 가능"); } else { Console.WriteLine("레벨업 불가능"); }
!! 디버그
: 컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적 연산(버그)을 찾아내고 그 원인을 밝히고 수정하는 작업 과정
1. 중단점 설정
f9 키 혹은 코드 줄 숫자 왼쪽을 클릭하여 중단점을 지정한다.
중단점을 지정한 후, 코드를 실행한다면, 지정한 중단점까지만 코드가 실행된다.
2. 중단점 설정 이후, 코드 실행
!! vs studio 하단에서는 중단 당시의 변수 이름, 값, 호출 스택 등의 정보를 얻을 수 있다.
3. 이후, f10 키를 누르면, 코드가 한줄씩 실행된다.
!! 문제가 생길법한 부분에서, 디버그를 활용하여 문제를 찾아내도록 하자.
II. 반복문
: 일련의 명령문을 반복해서 실행하는 제어문
1. for
: 초기식, 조건식, 증감식을 사용하여 반복문을 작성
for ( 초기화 ; 조건 ; 변화 )
{
실행 코드
}for (int i = 0; i < 10; i++) { Console.WriteLine(i); }
!! 해당 반복문을 Debug를 통해서 확인하면,
: int i 가 10보다 작은 지 확인 -> int i 를 출력 -> int i에 ++ (+1) 의 일련의 과정을 반복한다.
: i 가 조건을 만족하지 않는 10이 된다면 즉시, 코드를 종료한다.
2. while
: 조건식이 참(true)인 동안 코드 블록을 반복적으로 실행
초기화
while ( 조건 )
{
실행 코드
}!! while은 조건만 체크하는 반복문이기 때문에, if 문과 다르게 명확한 반복 회차가 필요 없다.
!! if 문이나 while 문이나 기능적으로는 같다. if 문으로 가능하다면, while 문으로도 가능하고, 그 반대의 경우도 성립한다.
if 문 : N번 반복하기 / 명확한 반복 횟수가 나왔을 경우 사용하면 좀 더 유리하다.
while 문 : ~~ 까지 반복하기 / 조건이 더 우선시 될 경우 사용하면 좀 더 유리하다.
!! 따라서, 어떤 반복문을 사용할 지는 코드의 흐름에 따라 상황에 맞게 선택하자.
int i = 0; while (i < 10) { Console.WriteLine(i); i++; }
3. do-while
: 조건식을 검사하기 전에 먼저 코드 블록을 무조건 한 번 실행하는 while 문
초기화
do
{
실행 코드
}
while ( 조건 );int i = 10; do { Console.WriteLine(i); i++; } while (i < 10);
>
4. foreach
: 배열이나 컬렉션에 대한 반복문
foreach ( 자료형 변수 in 배열 혹은 컬렉션 )
{
실행 코드
}string[] inventory = { "검", "방패", "활", "화살", "물약" }; foreach (string item in inventory) // 인벤토리의 index 순서대로 반복이 이루어짐. { Console.WriteLine(item); }
>
5. 중첩 반복문
: 하나의 반복문 아래 다른 반복문이 있는 경우
: 안쪽의 반복문이 반복 된 후, 바깥 쪽의 반복문이 반복된다.
for (int i = 2; i <= 9; i++) { for (int j = 1; j <= 9; j++) { Console.WriteLine(i + " x " + j + " = " + (i * j)); } }
>
!! 해당 반복문을 디버그
1. 바깥쪽 반복문에서 시작 i =2
2. 안쪽 반복문 시작 j = 1
3. 안쪽 반복문 실행 j의 값을 확인하며, 조건에 맞을 시마다, 출력 실행
j = 2, 3, 4, 5 ....
4. j 가 10이 되어, 조건이 맞지 않을 때, 안쪽 반복문 끝. 바깥쪽 반복문으로 이동.
i 의 수 +1
5. i가 10이 될 때까지, 2~4번 반복
6. 반복문 종료
6. break
: 감싸고 있는 반복문을 하나 중지시키는 명령어.
7. continue
: 감싸고 있는 반복문 시행 중 하나 중지시키는 명령어.
for (int = 1; i <= 10; i++) { if (i % 3 == 0) { continue; } } Console.WriteLine(i); if (i ==7) { break; }
!! continue에 해당하지 않는 loop의 경우, 평소의 반복문처럼 진행된다.
!! continue에 해당하는 loop의 경우, 실행문 대신 continue가 실행되어 다음 회차의 loop로 넘긴다.
!! break 에 해당하는 loop의 경우, 즉시 loop를 종료한다.
!! 무한 루프
: 종료문을 만나시 못하고 끝없이 동작하는 것.
: 이를 활용하여, 계속 작동하다가, 특정 조건을 만족하면 무한루프를 빠져 나오게 하는 기능 구현 가능.
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[] choices = { "가위", "바위", "보" }; string playerChoice = ""; string computerChoice = choices[new Random().Next(0, 3)]; // !! 컴퓨터 : 가위바위보 배열 중 랜덤선택 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("컴퓨터 승리!"); } }
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($"{count.ToString()}회 시도하셨습니다."); Console.WriteLine("정답"); } else if (guess < targetNumber) { Console.WriteLine("더 큰 숫자를 입력해주세요."); } else { Console.WriteLine("더 작은 숫자를 입력해주세요."); } }