public static void main(String[] args) {
int num = 1;
int sum = 0;
while(true) {
int temp = 1;
if(num%2==0) {
temp = -1;
}
sum = sum + num*temp;
if(sum>=100) {
break;
}
System.out.printf("num = %d sum = %d\n", num, sum);
num++;
}
}
public static void main(String[] args) {
int num = 1;
int sum = 0;
int val = -1;
do {
if (num % 2 == 0)
sum += num * val;
else
sum += num;
num++;
System.out.printf("num= %d sum=%d\n", num, sum);
} while (sum < 100);
}
두 코드는 비슷해보이지만 출력은 엄연히 다르다. 무엇때문일까?
우선 옳은 코드는 첫번째 코드이다. sum의 값이 100보다 클 때 while문을 탈출하게 하였고,
무엇보다 num의 값이 증가하기 이전에 출력을 하였다.
num이 증가하게 되면 다음 while문을 돌 때 영향을 끼치는 것이므로 num이 증가하기 전에 출력해야 한다.
그러면 두번째 코드는 무엇이 잘못되었을까?
num++이후에 출력을 하였기 때문에 num의 값은 출력에 오류를 범하게 된다.
System.out.printf("num= %d sum=%d\n", num, sum);
num++;
num++; 이전에 출력을 하게되면 올바른 값이 나온다.
정답은 num이 199일때, sum이 100이 되는 것이다.
하지만 아직도 첫번째 코드와 두번째 코드의 출력문이 다르다.
첫번째 코드의 경우, while문의 실행 도중 sum>=100 이라는 조건에 걸려서 break를 통해 바로 반복문을 빠져나온다.
두번째 코드의 경우, sum이 100이 되었음에도 while(sum<100) 이라는 조건을 만나지 않았기 때문에 계속 실행된다.
결과적으로 1+(-2)+3+...+ 가 100이상이 되려면 num은 199일 경우라는 것을 알 수 있다.
하지만 위의 경우, num값을 구하기 위해 sum이 100이상일 때 바로 반복문을 탈출하는 것이 중요하다.
따라서 do while 문은 올바른 코드라고 할 수 없고 아래와 같은 코드를 작성하는 것이 바람직하다.
public static void main(String[] args) {
int num = 1;
int sum = 0;
while (true) {
int temp = 1;
if (num % 2 == 0) {
temp = -1;
}
sum = sum + num * temp;
if (sum >= 100) {
break;
}
num++;
}
System.out.printf("num = %d sum = %d\n", num, sum);
}
'Java' 카테고리의 다른 글
public, protected, default, private 접근제한자 (0) | 2021.12.31 |
---|---|
자바의 정석 연습문제 4.6 풀이 (0) | 2021.12.31 |
자바의 정석 연습문제 4.7 풀이 (0) | 2021.12.31 |
자바의 정석 연습문제 4.2 풀이 (0) | 2021.12.31 |
자바의 정석 연습문제 4.3 풀이 (0) | 2021.12.31 |
댓글