(Java) 자바의 정석 3판 005일차 - 반복문(for, while, do-while), continue와 break
반복문
for문
1 | public class test2 { |
향상된 for문
배열이나 컬렉션을 순회할 때만 사용할 수 있다.
es6의 for of와 유사하다.1
2
3
4
5
6
7const nums = [1, 2, 3];
/*
1
2
3
*/
for(const num of nums) console.log(num);1
2
3
4
5
6
7
8
9
10
11public class test2 {
public static void main(String[] args) {
int nums[] = {4, 5, 6};
/*
4
5
6
*/
for(int num : nums) System.out.println(num);
}
}
while문
for문과 while문은 항상 변환이 가능하다.
for는 반복할 횟수
에 포커스를, while은 조건
에 포커스를 뒀다.
연습문제 오답
char 범위 구하기
자꾸만 아스키 코드의 함정에 갇혀있다.
오답은 아닌데 어차피 int로 변환되므로 굳이 아스키코드로 대조하지 않아도
숫자인지 영어인지 비교가 가능했다.ch > 47 && ch < 58
가 아니라'0' <= ch && ch <='9'
(ch > 64 && ch < 91) || ( ch > 96 && ch < 123)
가 아니라('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')
boolean형 변수 powerOn가 false일 때 true인 조건식
한 가지 경우밖에 떠올리지 못했다.- !powerOn
- powerOn == false
- powerOn != true
정수, 음수 교차 합산 문제
또 한번 나의 머리를 강타한 문제다.
내가 굉장히 편협한 사고 방식을 가지고 있는 게 아닐까 하는 생각이 들었다.
정답을 살짝 보고 나와 다른 것 같아서 아무리 생각해봤지만…
저자의 발끝만치도 따라오지 못했다.
정말 반성해야겠다.
1+(-2)+3+(-4)+… 과 같은 식으로 계속 더해나갔을 때, 몇까지 더해야 총합이 100이상이 되는지 구하시오.
내가 생각한 답안1
2
3
4
5
6
7
8
9
10
11public class test2 {
public static void main(String[] args) {
int i=1, sum=0;
while(sum < 100) {
sum += i;
i = i>0 ? -(++i) : -(--i);
}
i = i>0 ? i : -i;
System.out.printf("sum: %d, i: %d", sum, --i);
}
}저자가 제시한 답안
s라는 부호 변수를 놓고, 토글시키면서 쓸 줄은 전혀 몰랐다…1
2
3
4
5
6
7
8
9
10public class test2 {
public static void main(String[] args) {
int i = 0, s = 1, sum = 0;
while(sum < 100) {
sum += ++i * s;
s = -s;
}
System.out.printf("sum: %d, i: %d", sum, i);
}
}두 개의 주사위를 던졌을 때, 눈의 합이 6이 되는 모든 경우의 수
필요없는 sum을 선언했었다.
다른 곳에서 쓰지 않는 변수는 따로 캐싱을 하지 않아도 된다.1
2
3
4
5
6
7public class test2 {
public static void main(String[] args) {
for(int i=0; ++i<6;)
for(int j=0; ++j<6;)
if(i+j == 6) System.out.printf("i: %d, j: %d%n", i, j);
}
}정수형 변수에 랜덤한 값 담기.
1
2// 형변환을 꼭 해줘야하고, + 이전까지가 실수이므로 랩핑은 거까지만 해주면 됨.
int rnd = (int)(Math.random() * 6) + 1;문자를 정수로 바꾸기.
parseInt가 만능이 아니었다.1
2
3char ch = '4';
int num = Integer.parseInt("" + ch);
int num2 = ch - '0'; // - 연산에 의해 int로 둘 다 형변환 되서 연산이 진행됨.정수의 각 자릿수 구하기.
문자열이면 정수로 바꾸고 진행하는 게 맘 편하다.1
2
3
4
5
6
7
8
9
10public class test {
public static void main(String[] args){
int num = 12345;
while(num > 0) { // 이 놈의 조건이 참 유용하다. 괜히 for로 해서 변수 선언할 필요 없다.
System.out.println(num % 10);
num /= 10;
// 결국 마지막엔 10 이하의 값을 나누게 되므로 0이 된다.
}
}
}
continue와 break
이중 반복문이 있을 때 반복문에 이름을 붙이고, continue와 break 뒤에 반복문의 이름을 붙이면 해당 반복문을 탈출한다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class Main {
public static void main(String[] args) {
/*00
01
10
11*/
outer:
for(int i=0; i<2; i++) {
for(int j=0; j<4; j++) {
if(j == 2) {
continue outer;
}
System.out.print(i);
System.out.println(j);
}
}
}
}