반복문의 분류
- 크게 while문과 for문으로 분류
- while : 반복 횟수가 명확하지 않을 때
- for : 반복 횟수가 명확할 경우
while문
<예제 - 아래를 while문으로 변환>
1부터 출력하기 위해서 n++위에 출력문 넣고 시작함.
<예제>
<예제 - 구구단>
i가 9보다 작거나 같을 때까지 반복
<예제>
i와 sum의 기본 값으로 0을 준다.
i는 99까지라고 했으니 while의 조건문에 i<=99로 범위를 넣고,
짝수들의 합이라고 했으니 if문을 넣어 짝수만 구하는 조건을 준다.
if문 안에는 짝수들의 합을 대입할 정수인 sum에 i값이 계속 더해지도록 식을 세운다.
i의 증감 연산자는 if문을 나와서 while문에 적어준다.
<처음에는 더하는 방법을 몰라서 헤매다가 +=연산자가 생각났다.)
다시 풀어볼 때 위에 식으로 적어서 틀렸다.
틀린 이유는 모든 짝수들을 더한 정수 값을 하나 더 만들었어야 했는데, 만들지 않았기 때문이다.
<예제 - 정수 여러개 입력 받고 평균값 출력, -1이 입력되면 종료>
-1이 입력되면 반복이 멈추니까 while의 조건문에 n이 -1이 안될때 까지 반복이라고 넣은 것.
정수 하나당 한 번 while문이 도니까 입력된 정수의 수는 count가 한번의 반복에 1씩 증가하는 식을 넣어 구할 수 있음.
do-while문
- 작업문이 먼저 실행되고, 조건식이 실행됨. 즉, 최초 한번은 무조건 실행된다.
- 작업문이 실행되고, 참이면 계속 반복되고, 거짓이면 그대로 끝이 난다.
- 위의 식을 보면 먼저 0이 출력되고, i가 계속해서 1씩 증가하며 10보다 작을 때까지 반복된다.
- 따라서 0123456789가 출력
<예제 - 파워자바117>
일단 무조건 한번 실행 된 다음 조건에 맞지 않아 그대로 종료되어서 값은 10이 나오게 됨.
초기값이 10이었기 때문.
<예제 - a를 넣고, z이전까지 나오도록>
캐스팅을 사용해서 풀어야 하는 문제.
근데 c+=1을 해도 결과가 똑같이 나온다.?
<예제>
for문
반복횟수가 정해져 있을 때 사용하기 좋다.
반복문 중에서 가장 많이 사용된다.
- a초기화는 단 한번만 수행된다.(초기값)
- b가 참이면 c 내용이 실행되고, 그 다음 d갱신으로 와서 변화가 생긴 뒤 b에 해당하는 참이면 다시 c로 돌아감.
(d갱신에서는 보통 증감의 경우가 많다.)
<예제 - 구구단>
원하는 단은 a에 집어넣고, i는 9까지 1씩 증가
<예제 - 1부터 10까지 총합>
반복이 끝나면 출력해야 하니까 for문 {}밖에 출력문 넣는다.
<예제 - 0~99 짝수 합>
출력문 위치는 같음
i+=2로 2의 배수만 구하여 계산한게 선생님 방식
<예제>
income은 계산될 값이기 때문에 초기값을 0으로 주어 계산에 오류가 없도록 한다.
모든 계산은 for문 안에서 이루어지는 것이기 때문에 스캐너 입력 문장도 for문 안으로 들어가야 한다.
i는 그냥 반복되는 것을 뜻하는 것으로 초기값은 당연히 아무것도 입력이 안되었으니까 0인 것이고, 10번째 입력하는 순간 반복이 끝나면서 총 수입이 뜨도록 해야하기 때문에 조건은 i<10이 된다. i는 내가 반복문이 반복될 수록 1씩 증가하도록 i++로 준다.
총 수입은 내가 입력한 요금을 계속 누적해서 더하는 것이기 때문에 income+=fare로 주고, 이 결과가 도출되는 것은 반복문이 끝난 이후이기 때문에 출력은 for문 밖에서 하도록 for문 중괄호 밖에 출력문을 적어준다.
for문의 특이한 형태
1. 참이면 계속 반복
2. 무한반복
3. 증가와 동시에 출력까지
<예제>
for문 안에 if-else문을 넣어서 i가 10이 아닐 경우에는 뒤에 +가 오도록 출력하고, 10인 경우에는 =가 오도록 출력해서 풀면 된다.
위에서 계속 i가 출력되기 때문에 sum값은 for문의 가장 끝에 배치하고 for문이 멈췄을 때 for문 밖의 출력문으로 출력
중첩 반복
- i에서 j로 간 다음 j가 끝나면 다시 i로 올라감
<예제>
첫 번째 for문 다음으로 내려가서 두 번째 for문이 완성되면 다시 처음 for문으로 돌아오는 것 반복.
역슬래시t로 들여쓰기를 통해 지저분하게 나오는 출력을 정렬
분기문
- continue문 : 반복문의 모든 코드를 수행하지 않고, 다음 반복으로 이동
- break문 : 반복문을 탈출
continue문
<예제 - 파워자바126p / 문자열에서 특정 문자의 갯수>
<예제>
3, 6, 9일 경우에는 짝을 출력하고, 그 경우에는 for문의 i를 출력하는 출력문을 거치지 않고 바로 i++로 넘어가서 3, 6, 9가 반복 출력되는 일이없도록 한다.
그 외의 경우는 정상적으로 i를 출력하는 출력문으로 출력된다.
*if의 조건문을 if(i%3==0)으로 줬다면 더 깔끔했을 것
<예제>
먼저 양수들의 합이 될 정수인 sum을 만들어 둔다.
정수 5개를 엔터를 치면서 입력하기 위해서는 for문 안에 스캐너를 넣어줘야 한다.
if문으로 입력하는 정수인 a가 0보다 클 경우 sum값에 누적시킨다고 해주고, if문이 참으로 끝나면 continue를 통해서 for문으로 돌아간다.
이렇게 정수 5개를 넣은 뒤에 for문을 빠져나가서 합을 출력해준다.
break문
- continue문이 조건식이나 갱신으로 갔다면 break는 그냥 빠져나옴
- 2번 같은 경우는 while에서 빠져나와 for문 안에 있기 때문에 break문을 한번 더 써줘야 한다.
<예제>
int n과 while문의 조건은 그냥 반복 횟수를 정해주는 조건식이라고 생각하고 해야한다.
문자열을 입력하는 문제니 스캐너로 입력하는 것은 String타입이 되어야 할 것이고, 이를 if문에 조건으로 주기 위해서는
equals 함수를 사용해서 입력하는 값과 해당되는 값이 같은 타입인걸 비교해서 사용해주어야 한다.
if뮨 안에 a.equals("exit")를 사용해서 내가 입력하는 값이 exit일 경우 "종료합니다."를 출력하고 break를 사용해서 반복문을 종료하도록 하였다.
그 조건이 아니라면 >>을 출력하도록 한다.
<예제>
<문제 - 알파벳을 입력해서 순서대로 출력하기(이중 for문 사용)>@
별 찍는거랑 거의 비슷한데, charAt에 j를 줘서 자연스럽게 하나씩 줄어들도록 만들면 된다.
저거 아님
char a = scanner.next().charAt(0);를 사용해서 char타입을 입력할 수 있도록 만들어 준다.
이중 for문을 사용해서 처음 for문은 i에 char a를 대입하여 입력받는 문자 'e'에서 시작해서 'a'까지 점점 내려가도록 하고, 두 번째 for문은 'a'에서 시작해서 입력받은 수인 char a까지 커지도록 만들어준다.
이렇게되면 처음 for문은 점점 줄어들면서 'a'와 값이 같아지면 멈추게 되고, 두 번째 for문은 점점 커지면서 'e'가 되면 반복을 멈추게 된다.
그래서 첫 줄은 i가 'e'값을 가지고 있기 때문에 두 번째 for문에서 abcde가 출력되는 것이고, 계속해서 반복하면서 점차 하나씩 줄어들게 된다.