공부/C#

[C#] for문과 break, continue의 사용, 열거형 상수 enum과 예제

굴러다니다니 2023. 3. 16. 17:44
728x90

for문 (반복문)

 - while처럼 조건식이 참인 동안 코드를 반복 실행한다.

 - 하지만 while보다 반복을 더 정교하게 제어할 수 있다.

 - while에 비하여 좀 더 많은 코드로 이루어져 있지만 임의의 횟수만큼 반복을 수행하기에는 for문이 더 편리하다.

            for문 형식)
            for (초기화식; 조건식; 반복식) {반복 실행할 코드}


초기화식: 반복을 실행하기 전, 가장 먼저 딱 한번만 실행된다.
              ㄴ for 반복문에서 사용할 변수 등을 이곳에서 초기화 한다.
조건식: 반복을 계속 수행할지 여부를 결정하는 식
              ㄴ 이 조건의 결과가 false가 되면 반복을 중단한다.
반복식: 매 반복이 끝날 때마다 실행된다.
              ㄴ 주로 여기서 조건식에서 사용하는 변수의 값을 조정한다. 

                   반복식이 실행된 후에는 조건식이 실행되어 반복을 계속 진행할지 여부를 판단한다. (i++, i--)

 

예시 코드

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

코드 내부의 실행 순서

1. int형 변수 i를 선언하고 0으로 초기화한다.
2. 바로 조건식을 실행해 i가 5보다 작은지 확인한다. 
3. 0 < 5가 true임으로 WriteLine 실행한다.
4. 반복식의 i++을 실행해 i가 1이 된다.

5. 조건식을 실행해 i가 5보다 작은지 확인한다. ,,, 반복


즉 초기값은 0으로 하고 i가 false가 될 때까지 i를 1씩 증가시키면서 출력하는 코드이다.

 

예제 1. 홀수만 출력하는 코드를 작성하라

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

i가 1부터 10까지를 출력하지만, 반복문이 +=2 이므로 실행마다 2씩 늘어나 1, 3, 5, 7, 9  홀수가 나오게 된다.

 

예제 2. 1부터 100까지의 합을 구하는 코드를 작성하라

int sum = 0;
for (int i = 1; i <= 100; i++)
{
    sum += i;
}
    Console.WriteLine(sum);

for문을 돌면서 i는 1부터 100까지 1씩 증가하고, sum에 이 값을 모두 더한 뒤 for문을 빠져나와 출력문을 실행한다.

출력되는 값은 5050

 

중첩 for문

 - for문은 if문처럼 2개정도까지는 자주 중첩해서 사용한다.
  - 중첩으로 반복을 해야한다면 while보다 for문이 적절하다.

 

예시. 아래의 값을 실행하면 0 0 0 1 0 2 1 0 식으로 2 2 까지 출력된다

for (int i = 0; i < 3; i++)
{
	for (int j = 0; j < 3; j++)
	{
		Console.WriteLine("i의 값: {0}    k의 값: {1}", i, j);
	}
}

 

예제 3. 구구단 코드를 작성하라

for (int i = 2; i <= 9; i++)
{
	for (int k = 1; k <=9; k++)
	{
		Console.WriteLine("{0} * {1} = {2}", i, k, i * k);
	}
}

 


break는 본인이 속한 가장 가까운 반복문에서 빠져나온다고 배웠었다.

이와 대조되는 continue의 개념을 살펴보자.

 

continue

 - 한 번 건너뛰어 반복을 계속 수행한다. 

 - 주로 예외 처리에서 많이 쓰인다.

break문은 반복문을 탈출해 나가버리지만, continue는 아래의 내용을 수행하지 않고 반복문을 이어 한다.

예시를 보자
         

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

위의 내용을 실행하면 0부터 9까지중에 3을 제외한 나머지 숫자만 출력된다.

이는 if (i != 3)일때 출력 으로 코드를 짤 수 있지만,  대체적으로 continue를 사용한 for문이 훨씬 보기 좋기 때문에 많이 이용한다고 한다. 

 

예제 4 위의 홀수 코드를 continue를 이용한 코드로 작성하라

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

짝수일 경우 건너뛴다의 continue를 넣어주면 간단하게 할 수 있다.



예제 5. 홀수를 역순으로 출력하되, 그 홀수중의 짝수번째 숫자만 출력하라.

for (int i = 10, count = 0; i > 0; i--) //홀수의 개수를 세는 count 변수 선언
{
	if (i % 2 == 0) //짝수이면 건너뜀
	{
    	continue;
	}
	count++; //홀수이면 홀수의 개수 셈
	if (count % 2 == 1) //홀수가 홀수개일때 건너뜀
	{
		continue;
	}
Console.WriteLine(i);
}

    위의 코드를 변형해 역순으로 출력되게 만든 뒤, 홀수의 개수를 세는 변수를 선언해 이 변수가 홀수일때 건너뛰게 코드를 작성해 보았다. 꼼수로 그냥 역수중에 4번째마다 출력되게 해도 될 듯 하다.


열거형 상수 enum

 - 상수는 변수와 다르게 안의 데이터 값을 변경하지 못한다. (*변경하려고 할 시 error)

 - 그리고 변수를 상수화 시킬 때 사용하는 것이 열거형 상수 enum이다.

 - 또한 할당이 필요하다면 선언과 동시에 할당해야 한다.

 - start void Main 위의 줄에 사용하며 형식은 다음과 같다.

enum (이름 대문자로) {상수 이름 대문자로, 이름, 이름};

타입을 바꾸고 싶다면 (int)Direction.Left; 처럼 쓸 수 있으며

열거형 상수 내에 접근하려 할 때는 .을 써야한다.

그리고 switch case문에 사용할 경우 보통 (열거형 상수)변수 로 열거형상수 type으로 변수의 type을 바꿔 이용한다.

 

예시 코드

        enum DIRECTION { LEFT, RIGHT = 10, UP, DOWN};
        enum PLAYERSTATE { ATTACK, MOVE, DEFENSE}; //열거형 상수
        enum GAME { ROCK=1, SCISSORS=2, PAPER=3};


            Console.WriteLine(DIRECTION.LEFT); 
            Console.WriteLine(DIRECTION.RIGHT); 
            Console.WriteLine(DIRECTION.UP); 
            Console.WriteLine(DIRECTION.DOWN); 

            Console.WriteLine((int)DIRECTION.LEFT); 
            Console.WriteLine((int)DIRECTION.RIGHT);  //10
            Console.WriteLine((int)DIRECTION.UP);     //11
            Console.WriteLine((int)DIRECTION.DOWN);


            PLAYERSTATE state = PLAYERSTATE.ATTACK;
            //플레이어 스테이트 형의 변수 state
            Console.WriteLine(state == PLAYERSTATE.ATTACK); //true
            Console.WriteLine(state == PLAYERSTATE.DEFENSE);//false
            Console.WriteLine(state == PLAYERSTATE.MOVE); //false

            int playerNum;
            int count = 0;
            while (true)
            {
                Console.WriteLine("입력해라");
                Random random = new Random();
                playerNum = int.Parse(Console.ReadLine());
                int comNum = random.Next(1, 4);

                switch ((GAME)playerNum)
                {
                    case GAME.ROCK:
                        switch ((GAME)comNum)
                        {
                            case GAME.ROCK:
                                Console.WriteLine("ddd");
                                break;
                        }
                        break;
                }
            }
        }
728x90