1. 반복문
package loop;
public class While1_1 {
public static void main(String[] args) {
int count = 0;
count = count + 1;
System.out.println("현재 숫자는:" + count);
count = count + 1;
System.out.println("현재 숫자는:" + count);
count = count + 1;
System.out.println("현재 숫자는:" + count);
}
}
- 같은 코드를 3번 작성함. 수작업으로 작성하는 것보다는 반복문을 실행해야함.
1) While문
- 조건에 따라 코드를 반복해서 실행할때 사용
- 조건식이 참일때 무한 반복하고 거짓일때 벗어난다.
while(조건식) {
}
package loop;
public class While1_2 {
public static void main(String[] args) {
int count = 0;
while(count < 3) {
count = count + 1;
System.out.println("현재 숫자는:" + count);
}
}
}
(1) 문제: while문을 사용하지 않고 1부터 하나씩 증가하는 방식(1~3 더하기)
package loop;
public class While2_1 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
sum = sum + 1;
System.out.println("i=" + i + ", sum=" + sum);
i++;
sum = sum + 2;
System.out.println("i=" + i + ", sum=" + sum);
i++;
sum = sum + 3;
System.out.println("i=" + i + ", sum=" + sum);
}
}
- 이 코드에서 while문을 사용해서 i부터 하나씩 증가하는 수를 endNum(마지막 수)까지 더하는 코드를 바꿔보자
package loop;
public class While2_3 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
int endNum = 3;
while (i <= endNum) {
sum = sum + i;
System.out.println("i=" + i + ", sum=" + sum);
i++;
}
}
}
- 반복 횟수 정하기.
즉, i가 endNum이 될때까지 반복해서 코드를 실행함.
2) do-while문
package loop;
public class DoWhile1 {
public static void main(String[] args) {
int i = 10;
do {
System.out.println("현재 숫자는: " + i);
i++;
}
while(i < 3);
}
}
- do 코드블록을 한번 실행하고 마지막 while 조건을 검사하는 코드
3) break, continue
- break, continue는 반복문에서 사용됨
- break는 반복문을 즉시 종료하고 continue는 반복문 나머지 부분을 건너뛴다.
(1) break
while(조건식) {
코드1;
break;
코드2;
}
package loop;
public class Break1 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
while(true) {
sum = sum + i;
if(sum > 10) {
System.out.println("합이 10보다 크면 종료: i=" + i + ", sum=" + sum);
break;
}
i++;
}
}
}
- 조건식을 보면 while 조건식이 true로 되어있음.
- 조건이 참이기 때문에 break가 없으면 무한반복
- 만약 sum > 10 조건을 만족하면 결과 출력하고 break를 사용해서 while문을 벗어난다.
(2) continue
while(조건식) {
코드1;
continue;
코드2;
}
- 1부터 5까지 숫자를 출력하는데 숫자가 3일때는 출력을 건너뛴다
package loop;
public class Continue1 {
public static void main(String[] args) {
int i = 1;
while(i <= 5) {
if(i == 3) {
i++;
continue;
}
System.out.println(i);
i++;
}
}
}
4) for문
- 주로 반복횟수가 정해져 있을때 사용함
- for문 구조
for(1. 초기식 2. 조건식 4. 증감식) {
}
1. 초기식 실행. 초기식은 1번만 실행
2. 조건식을 검증한다. 참이면 코드 실행, 거짓이면 for문 벗어남
3. 코드 실행
4. 코드가 종료되면 증감식 실행
5. 다시 2. 조건식부터 시작
package loop;
public class For1 {
public static void main(String[] args) {
for(int i=1; i<=10; i++) {
System.out.println(i);
}
}
}
(1) i부터 하나씩 증가한 수를 endNum까지 더하기(for문사용)
package loop;
public class For2 {
public static void main(String[] args) {
int sum = 0;
int endNum = 3;
for(int i=1; i<=endNum; i++) {
sum = sum + i;
System.out.println("i=" + i + ", sum=" + sum);
}
}
}
(2) for vs while
- for문은 초기화, 조건 검사, 반복 후 작업 등이 규칙적으로 한 줄에 표시되어 있어 코드를 이해하기 편리함.
for(int i=1; i<=endNum; i++) {
}
- i는 카운터 변수. 증가하면서 반복횟수 올라가고 i를 활용해서 반복할지 말지를 판단할 수 있음.
- while은 변수 i를 선언하는 부분과 i++ 증가하는 부분이 분산되어 있음.
(3) for문 구조
package loop;
public class Break2 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
for(; ;) {
sum += i;
if(sum > 10) {
System.out.println("합이 10보다 크면 종료: i=" + i + ", sum=" + sum);
break;
}
i++;
}
}
}
- for(; ;)는 조건식이 없으므로 무한반복.
- sum > 10 조건을 만족하면 break를 사용해서 반복문 벗어남
5) 중첩 반복문
package loop;
public class Nested1 {
public static void main(String[] args) {
for(int i=0; i<2; i++) {
System.out.println("외부 for시작 i:" + i);
for(int j=0; j<3; j++) {
System.out.println("내부 for시작 j:" + i + "-" + j);
}
System.out.println("외부 for 종료 i:" + i);
}
}
}
어려웠던 코드 : 피라미드
package loop.ex;
public class NestedEx2 {
public static void main(String[] args) {
int rows = 5;
for(int i=1; i<=rows; i++) {
for(int j=1; j<=i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
정리
for문
<장점>
1. 초기화, 조건 체크, 반복 후 작업, 증감식을 한번에 처리할 수 있음
2. 정해진 횟수만큼 반복한다.
3. 루프 범위가 for문 블록에 제한.
<단점>
1. 루프 조건이 루프 내부에서 변경되는 경우 for문 관리 어렵
2. 복잡한 조건을 가진 반복문을 작성하기에 while문이 더 적합
while문
<장점>
1. 루프 조건이 루프 내부에서 변경되는 경우
2. for루프보다 더 복잡한 조건을 while문에서 사용할 수 있음
3. 조건이 충족되는 동안 계속해서 루프 실행. 종료 시점을 명확히 알 수 없음.
<단점>
1. 초기화, 반복 후 작업이 분산되어 있음.
2. 루프 변수가 while문 블록 바깥으로 접근 가능