처음부터 다시 하는 자바 공부는 인프런의 김영한 강사님의 강의를 참고해서 공부했다.
반복문 시작
반복문은 이름 그대로 특정 코드를 반복해서 실행할 때 사용한다.
자바는 다음 3가지 종류의 반복문을 제공한다.
while , do-while , for
먼저 while 문부터 알아보자.
while문1
while문은 조건에 따라 코드를 반복해서 실행할 때 사용한다.
while (조건식) {
// 코드
}
- 조건식을 확인한다. 참이면 코드 블럭을 실행하고, 거짓이면 while문을 벗어난다.
- 조건식이 참이면 코드 블럭을 실행한다. 이후에 코드 블럭이 끝나면 다시 조건식 검사로 돌아가서 조건식을 검사
한다.(무한 반복)
while문을 사용해서 1을 한 번씩 더해서 총 3번 더하는 코드를 만들어보자
package loop;
public class While1_2 {
public static void main(String[] args) {
int count = 0;
while (count < 3) {
count++;
System.out.println("현재 숫자는:" + count);
}
}
}
출력 결과
현재 숫자는:1
현재 숫자는:2
현재 숫자는:3
while (count < 3) 에서 코드 블럭을 반복 실행한다. 여기서 count 의 값이 1 , 2 , 3 으로 점점 커지다가 결국
count < 3 이 거짓이 되면서 while 문을 빠져나간다.
while(count < 3) 에 있는 숫자를 while(count < 100) 으로 변경하면 while 문의 코드 블럭을 100번 반복한다.
while문2
이번에는 난이도를 조금 높여보자. 다음 문제를 같이 풀어보자.
package loop;
public class While2_1 {
public static void main(String[] args) {
int sum = 0;
sum = sum + 1; //sum(0) + 1 -> sum(1)
System.out.println("i=" + 1 + " sum=" + sum);
sum = sum + 2; //sum(1) + 2 -> sum(3)
System.out.println("i=" + 2 + " sum=" + sum);
sum = sum + 3; //sum(3) + 3 -> sum(6)
System.out.println("i=" + 3 + " sum=" + sum);
}
}
출력 결과
i=1 sum=1
i=2 sum=3
i=3 sum=6
이 코드의 정답은 맞다. 하지만 개선할 점이 많이 있는데, 무엇보다 변경에 유연하지 않다.
다음과 같이 요구사항이 변경되었다.
문제: 10부터 하나씩 증가하는 수를 3번 더해라 (10 ~12더하기)
이렇게 되면 10 + 11 + 12 를 계산 해야한다. 문제는 코드를 너무 많이 변경해야 한다는 점이다.
변수를 사용해서 더 변경하기 쉬운 코드로 만들어보자. 변경되는 부분을 변수 i 로 바꾸어보자.
문제: i부터 하나씩 증가하는 수를 3번 더해라 (i ~ i+2더하기)
package loop;
public class While2_2 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
sum = sum + i; //sum(0) + i(1) -> sum(1)
System.out.println("i=" + i + " sum=" + sum);
i++; //i=2
sum = sum + i; //sum(1) + i(2) -> sum(3)
System.out.println("i=" + i + " sum=" + sum);
i++; //i=3
sum = sum + i; //sum(3) + i(3) -> sum(6)
System.out.println("i=" + i + " sum=" + sum);
}
}
출력 결과
//i=1
i=1 sum=1
i=2 sum=3
i=3 sum=6
변수 i 를 사용한 덕분에 i 의 값만 변경하면 나머지 코드를 전혀 변경하지 않아도 된다
.
i=10 으로 변경하면 다른 코드의 변경 없이 앞서 이야기한 10 + 11 + 12 의 문제도 바로 풀 수 있다.
출력 결과
//i=10
i=10 sum=10
i=11 sum=21
i=12 sum=33
좋은 코드인지 아닌지는 변경 사항이 발생했을 때 알 수 있다.
변경 사항이 발생했을 때 변경해야 하는 부분이 적을수록 좋은 코드이다.
지금까지 변수를 사용해서 하나의 문제를 잘 해결했다. 이번에는 새로운 변경사항이 등장했다.
기존 문제: i부터 하나씩 증가하는 수를 3번까지 더해라 (i ~ i+2 더하기)
새로운 문제: i부터 하나씩 증가하는 수를 endNum(마지막 수)까지 더해라 (i ~ endNum 더하기)
예)
- i=1 , endNum=3 이라고 하면 1 ~ 3까지 총 3번 더해야한다.
- i=1 , endNum=10 이라고 하면 1 ~ 10까지 총 10번 더해야한다.
- i=10 , endNum=12 이라고 하면 10 ~ 12까지 총 3번 더해야한다.
먼저 i=1 , endNum=3 이라고 생각하고 단순하게 문제를 풀어보자.
package loop;
public class While2_3 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
int endNum = 3;
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
i++;
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
i++;
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
i++;
}
}
실행 결과
i=1 sum=1
i=2 sum=3
i=3 sum=6
i=1 , endNum=3 이므로 다음 코드를 총 3번 반복해야 한다.
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
i++;
그런데 i=1 , endNum=10 와 같이 변경하면 이 코드를 총 10번 반복해야 한다. 따라서 같은 코드를 더 많이 추가해야
한다.
이 문제를 제대로 풀기 위해서는 코드가 실행되는 횟수를 유연하게 변경할 수 있어야 한다. 한마디로 같은 코드를 반복
실행할 수 있어야 한다.
while 문을 사용하면 원하는 횟수 만큼 같은 코드를 반복 실행할 수 있다.
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=1, endNum=3
i=1 sum=1
i=2 sum=3
i=3 sum=6
//i=1, endNum=10
i=1 sum=1
i=2 sum=3
i=3 sum=6
i=4 sum=10
i=5 sum=15
i=6 sum=21
i=7 sum=28
i=8 sum=36
i=9 sum=45
i=10 sum=55
//i=10, endNum=12
i=10 sum=10
i=11 sum=21
i=12 sum=33
반복 횟수 정하기
i 가 endNum 이 될때 까지 반복해서 코드를 실행하면 된다.
- i=1 , endNum=3 이라면 3번 반복하면 된다. i=1 -> 2 -> 3
- i=3 , endNum=4 라면 2번 반복하면 된다. i=3 -> 4
while문 작성하기
- while 문에서 i <= endNum 조건을 통해 i 가 endNum 이 될 때 까지 코드 블럭을 실행한다.
- i 가 endNum 보다 크면 while 문을 종료한다.
그림을 통해 코드를 분석해보자.
왼쪽은 while 의 조건식을 체크하는 단계이고, 오른쪽은 조건식을 통과하고 나서 while 문의 코드 블럭을 실행하는
부분이다.
i=1, endNum=3
- 조건식을 만족한다.
- i=1, sum=1 을 출력한다.
i=2, endNum=3
- 조건식을 만족한다.
- i=2, sum=3 을 출력한다.
i=3, endNum=3
- 조건식을 만족한다.
- i=3, sum=6 을 출력한다.
i=4, endNum=3
- 조건식을 만족하지 않는다.
- while 문을 종료한다.
실행 코드 분석
sum(0), i(1), endNum(3)
//루프 1
while (i(1) <= endNum(3)) -> true
sum(0)+i(1) -> sum(1)
i(1)++ -> i(2)
//루프 2while (i(2) <= endNum(3)) -> true
sum(1)+i(2) -> sum(3)
i(2)++ -> i(3)
//루프 3
while (i(3) <= endNum(3)) -> true
sum(3)+i(3) -> sum(6)
i(3)++ -> i(4)
//루프 4while (i(4) <= endNum(3)) -> false
do-while문
do-while 문은 while 문과 비슷하지만, 조건에 상관없이 무조건 한 번은 코드를 실행한다.
do-while문 구조
do {
// 코드
} while (조건식);
예를 들어서 조건에 만족하지 않아도 한 번은 현재 값을 출력하고 싶다고 하자.
먼저 while 문을 사용한 예제를 보자
package loop;
public class DoWhile1 {
public static void main(String[] args) {
int i = 10;
while (i < 3) {
System.out.println("현재 숫자는:" + i);
i++;
}
}
}
출력 결과
//없음
i=10 이기 때문에 while (i < 3) 조건식은 거짓이 된다. 따라서 아무것도 출력되지 않는다.
이번에는 do-while 문을 사용해보자.
package loop;
public class DoWhile2 {
public static void main(String[] args) {
int i = 10;
do {
System.out.println("현재 숫자는:" + i);
i++;
} while (i < 3);
}
}
출력 결과
현재 숫자는:10
do-while 문은 최초 한번은 항상 실행된다. 따라서 먼저 현재 숫자는:10 이 출력된다.
코드 블럭을 실행 후에 조건식을 검증하는데, i=10 이기 때문에 while (i < 3) 조건식은 거짓이 된다. 따라서
do-while 문을 빠져나온다.
do-while 문은 최초 한번은 코드 블럭을 꼭 실행해야 하는 경우에 사용하면 된다.
break, continue
break 와 continue 는 반복문에서 사용할 수 있는 키워드다.
break 는 반복문을 즉시 종료하고 나간다. continue 는 반복문의 나머지 부분을 건너뛰고 다음 반복으로 진행하는
데 사용된다.
참고로 while , do-while , for 와 같은 모든 반복문에서 사용할 수 있다.
break
while(조건식) {
코드1;
break;//즉시 while문 종료로 이동한다.
코드2;
}
//while문 종료
break 를 만나면 코드2 가 실행되지 않고 while문이 종료된다.
continue
while(조건식) {
코드1;
continue;//즉시 조건식으로 이동한다.
코드2;
}
continue 를 만나면 코드2 가 실행되지 않고 다시 조건식으로 이동한다. 조건식이 참이면 while 문을 실행한다.
예제를 통해서 알아보자.
문제: 1부터 시작해서 숫자를 계속 누적해서 더하다가 합계가 10보다 처음으로 큰 값은 얼마인가?
1 + 2 + 3 ... 계속 더하다가 처음으로 합이 10보다 큰 경우를 찾으면 된다.
package loop;
public class Break1 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
while (true) {
sum += i;
if (sum > 10) {
}
System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
break;
}
i++;
}
}
}
실행 결과
합이 10보다 크면 종료: i=5 sum=15
- 조건식을 잘 보면 true 라고 되어있다. 조건이 항상 참이기 때문에 이렇게 두면 while 문은 무한 반복된다. 물
론 break 문이 있기 때문에 중간에 빠져나올 수 있다. - 만약 sum > 10 조건을 만족하면 결과를 출력하고, break 를 사용해서 while 문을 빠져나간다.
문제: 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++;
}
}
}
실행 결과
1
2
4
5
실행 결과를 보면 3일 때는 출력하지 않은 것을 확인할 수 있다.
'[JAVA]' 카테고리의 다른 글
[처음부터 다시 하는 JAVA] 스코프 (4) | 2024.01.12 |
---|---|
[처음부터 다시 하는 JAVA] 반복문 for문 (2) | 2024.01.11 |
[처음부터 다시 하는 JAVA] 조건문 switch, 삼항연산자 (0) | 2024.01.09 |
[처음부터 다시 하는 JAVA] 조건문 if, if-else (0) | 2024.01.08 |
[처음부터 다시 하는 JAVA] 연산자 (1) | 2024.01.07 |