티스토리 뷰
이전글 : [깅깅의 C# 독학] 3.C# 기본 - 조건분기 : if문과 switch문
[깅깅의 C# 독학] 3.C# 기본 - 조건분기 : if문과 switch문
개인적으로 코딩의 핵심이라 생각하는 대목! 바로 조건분기다. 내가 가장 좋아하는 구간이기도 하다. 먼저 if문부터 정리해보겠다. ㄴ^.^ㄱ 아잉 씬나 [if문] 여기, 깅이 서 있다. 깅의 키는 현재 80
dubleging.tistory.com
이번엔 이름 그대로 시킨 일을 반복하는 반복문(loof statement)을 다룰 차례이다. 설정한 조건이나 그 값에 따라 블록 안의 구문들을 실행하는데, 다음 편에 소개할 배열과 함께 자주 사용된다. 만약 다음과 같이 반복되는 문자를 표시해야한다고 해보자.
깅이 나무를 캔 횟수 : 0
깅이 나무를 캔 횟수 : 1
깅이 나무를 캔 횟수 : 2
깅이 나무를 캔 횟수 : 3
깅이 나무를 캔 횟수 : 4
숫자 외에 '깅이 나무를 캔 횟수 : '는 반복이 된다. 이럴 때 반복문을 사용하면 편리하다.
[for문]
for문을 사용한다면 다음과 같이 표현할 수 있다.
for (int i = 0; i < 5; i++)
{
lb1.Text += "깅이 나무를 캔 횟수 : " + i + "\n";
}
int i = 0; 으로 변수를 초기화 하고 i < 5; 으로 어디까지 반복할 것인지 쓰고, i++로 i에 변화를 준다. 변화를 주는 이유는 변화를 주지 않으면 i는 계속 0이기 때문에 구문을 무한 반복하기 때문이다. 반복문에서 조심해야하는게 바로 무한 반복인데, 이렇게 간단한 코드를 쓸 때는 그럴 일이 없겠지만, 점점 복잡한 코드를 쓰다보면 간혹 무한 반복 때문에 프로그램이 실행되지 않는 경우가 생긴다.
[while문]
while문을 사용하면 다음과 같이 표현할 수 있다.
int i = 0;
while (i < 5)
{
lb1.Text += "깅이 나무를 캔 횟수 : " + i + "\n";
i++;
}
while문 밖에 변수 i를 초기화한 뒤, if문 처럼 그 안에 조건을 넣는다. for문에서 변화를 위한 식인 i++가 중요한 것처럼 while문도 마지막 i++; 가 중요하다. 이렇게 i를 1씩 증가시켜주지 않으면 무한 반복이 될 테니까 말이다.
※반복하는 횟수만큼 문자를 표시할 때 대입(=)이 아닌 덧셈 대입(+=) 사용!
내가 자꾸 까먹는 것이 있다. 바로 덧셈 대입을 사용해야한다는 것인데, 만일 덧셈 대입이 아닌 대입을 사용하면 아래처럼 된다.
대입만 사용하면 lb1.Text 의 내용이 계속 덮어써져서 마지막 한 줄만 나온다. 덧셈 대입으로 내용을 추가 시켜줘야한다는 것, 잊지 말자!
-do ~ while문
조건이 맞지 않아도 한 번은 실행 한 뒤, 조건이 맞으면 반복하게끔 할 수도 있다.
int i = 0;
do
{
lb1.Text = "깅이 나무를 캔 횟수 : " + i + "\n";
i++;
} while (i > 5);
반복 실행의 조건은 i가 5를 초과해야 한다. 하지만 i는 0이다. 원래의 while문이라면 아무것도 표시되지 않겠지만 이렇게 do ~ while문을 쓰면 한 번은 구문을 실행한다.
i가 1 증가하는 식을 넣었지만 그래봤자 1이기 때문에 반복되지 않는다. 만일 한 번 실행할 때 i가 5를 초과하면 무한 반복이 될 것이다. 5보다 큰 수는 무한대로 있으니 말이다. 참고로 무한 반복이 되는 경우 친절한 비쥬얼 스튜디오 조차 빨간 줄로 알려주지 않으니 잘~ 생각해서 써야한다.
[break문과 continue문]
Main Quest 2-1. 나무 좀 그만 캐자...!
방랑자의 말에 따라 동쪽으로 향하던 깅. 반나절만에 깅덤에 도착했지만 성문 앞에서 경비병들에게 막히고 말았다. 나무 10개를 가져오면 들여보내준다는데... 왜 자꾸 나무야?!! 이젠 체력도 얼마 남지 않았는데!
깅이 나무를 캔 횟수를 10까지 반복 표시하되 체력이 0이 되면 체력이 바닥났다고 한 뒤 중단시키려 한다. if문과 break문으로 이를 표현해보자.
int i = 0;
int hp = 5; //깅의 남은 체력
while (i <= 10)
{
lb1.Text += "깅이 나무를 캔 횟수 : " + i + "\n";
i++;
hp--; //한 번 나무를 캘 때마다 체력이 1씩 감소
if (hp == 0)
{
lb1.Text += "체력이 바닥났습니다!";
break;
}
}
변수 hp로 남은 체력을 설정하고 나무를 캘 때마다 hp 1씩 감소(hp--), if문으로 hp가 0일 때 체력이 바닥났다고 한 뒤 break를 썼다.
체력이 5 남았고 한 번 캘 때마다 1씩 줄어든다면 5번은 캐고 체력이 바닥나야하는데... 0부터 시작해서 4번 캐고 바닥났다. i가 1이 될 때부터 hp를 감소시키던가, 횟수를 1부터 세던가 하면 되겠지만 귀찮으니 넘어가자.
Main Quest 2-2. 행운의 여신은 나의 편!
겨우 체력을 회복하고 나무 10개를 가져다준 깅은 드디어 깅덤 왕국에 입성했다. 본격적으로 사깅꾼을 찾기 전 쉬고 싶었던 깅은 여관으로 갔다. 그런데 웬 이벤트를 하고 있네? 제비뽑기를 해서 당첨이 나오면 하루 숙박비가 무료?! 주어진 기회는 5번. 2번 당첨을 뽑으면 이틀, 5번 모두 당첨이면 5일 숙박비가 무료다~!!! 당첨을 뽑자!
1~5회차 결과 중 나머지는 꽝, 하나는 당첨으로 표시하려고 한다. 뽑기는 랜덤을 사용하는게 정석이지만 그건 나중에 사용하고, 일단 임의로 3번째 결과만 당첨으로 표시할 것이다. continue를 사용해 표현해보자.
int i = 0; //뽑기 회차
while (i < 5)
{
i++;
lb1.Text += i + "회차 뽑기 결과 : ";
if (i == 3)
{
lb1.Text += "당첨!\n";
continue; //3회차 때 밑에 꽝!을 건너뜀.
}
lb1.Text += "꽝!\n";
}
먼저 반복이 될 문구인 n회차 뽑기 결과 : 를 써준다. lb1.Text 위에 i++를 넣은 것은, 반복문의 시작부터 1로 설정하기 위해서이다. lb1.Text보다 밑에 써두면 0회차부터 표시된다.
그렇다면 i를 초기화 할 때 0이 아닌 1로 해두고 i++를 Text 밑에 두어도 되지 않을까? 싶어서 해보니...
3회차가 아닌 2회차에서 당첨이 된다. 그 이유는 1회차 뽑기 결과 : 가 표시된 뒤 증가를 해서 2가 되는데, 다음 반복에서 2회차 뽑기 결과 : 가 표시된 뒤 또 증가해서 3이 되기 때문이다.
그렇다면 i++를 if문 밑에 두면 어떻게 될까?
무한 반복이 된다. continue를 빼면 (당연히) 무한반복이 되지 않지만, 3회차에 당첨과 꽝이 둘 다 표시된다. 왜 무한반복 되는 건지는 아무리 생각해도 모르겠어서 찾아봤다.
출처글 - https://blog.naver.com/kijun/221977303159
C# break와 continue
break 우리는 이미 break 명령어를 사용해 보았다. switch 문을 공부할 때 break가 등장했었는데, break 명...
blog.naver.com
아.. 아....! 아!!!!!!!
그렇다...!
i가 3이 되었을 때 건너뛰니 밑에 있는 i++도 건너뛰고 i가 증가하지 않으니 영원히 3에 머무르게 된 것이였다...!!
알고나서 보면 참 당연하고 간단한 건데... 내 의도만 집중적으로 생각하고 코드를 너무 추상적으로 받아들여서 이 부분을 놓친 것 같다. 또 i가 3이 될 때부터가 아니라 처음부터 문제인 줄 알았다.ㅠㅠ
내가 너무 바보같은 건가 싶기도 하지만, 그렇다고 몰랐다는 사실을 바꿀 순 없고 결국 알아냈다는게 중요한 것 같다! ^.^ ! 주눅들지 말자~ 알았음 됐지~ 알아낼 때까지 포기만 안하면 되지~
+for문과 while문의 차이..? 랄까 어느 상황에 적합할지는... 아직 명확하게 모르겠다. 하다보면 알게 될 것 같다.
요약
1.for문 형식 예: for(int i = 0; i < 5; i++){ ... } / 5회 반복. i는 0~4 출력.
2.while문 형식 예: int i = 0; while(i < 5) { ... i++; } / 5회 반복. i++; 위치에 따라 출력 다름.
3.do ~ while문 : 한 번은 무조건 실행. 조건이 맞으면 반복.
4.break는 반복중단.
5.continue는 건너뛰고 다음 반복으로.
'코딩공부' 카테고리의 다른 글
[깅깅의 C# 독학] 6.C# 기본 - 클래스(上) : 멤버, 인수, 반환값, 접근 수식자 (0) | 2023.09.04 |
---|---|
[깅깅의 C# 독학] 5.C# 기본 - 배열, 다차원 배열, 가변 배열 (1) | 2023.08.21 |
[깅깅의 C# 독학] 3.C# 기본 - 조건분기 : if문과 switch문 (0) | 2023.08.08 |
[깅깅의 C# 독학] 2.C# 기본 - 대입, 형, 변수, 연산자 (0) | 2023.08.07 |
[깅깅의 C# 독학] 1.C# 기본 - Main(), 구문, 주석, 폼, 문자, 이미지 (0) | 2023.08.07 |
- Total
- Today
- Yesterday
- 코드잇
- 코드잇TIL
- C# 라디오버튼
- C# 독학
- C# 체크박스
- C# 패널
- #C# 기초
- C# 텍스트파일 읽기
- 파이썬데이터
- 오늘도코드잇
- #코딩 공부
- C# 캐스트
- #C# 공부
- #C# 기본
- C# 이벤트
- #C#
- C# 텍스트박스
- C# 버튼
- 코딩 공부
- 파이썬
- C# 리스트박스
- #C# 독학
- C# 기본
- C# 기초
- c#
- C# 공부
- c# 컨트롤
- 파이썬응용
- 코딩공부
- C# 클래스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |