반복문
반복문에는 for문, while문, while문의 변형인 do-while문이 있다. for문 while문과 do-while문의 가장 큰 차이는 for문이나, while문에 속한 문장은 조건에 따라 한 번도 수행되지 않을 수 있지만, do-while문은 do-while에 속한 문장은 무조건 최소한 한 번은 수행될 것이 보장된다.
for문
for문은 반복 횟수를 알고 싶을 때 적합하다.
for(초기화;조건식;증감식;) {
// 조건식이 참일 때 수행될 문장들을 적는다.
}
==
for(int i = 1; i <= 5; i++) {
System.out.println("반복문");
}
위에 적힌 것이 for문의 구조이고, 아래가 그 예시이다. for문은 다음과 같은 순서대로 실행된다. 초기화 → 조건식 → 수행될 문장 → 증감식
가끔가다 헷갈리는 부분이 이 분인데, for문에 초기화 조건식 증감식이 다 붙어있어서 수행 순서를 초기화 → 조건식 → 증감식 → 수행될 문장 으로 착각하는 경우가 있으니 주의해야 한다.
초기화
반복문에 사용될 변수를 초기화 하는 부분이고, 둘 이상의 변수가 초기화가 가능하다. 단, 둘 이상의 변수가 필요할 때는 , 구분자로 구분해야 한다.
for(int i = 0; i <= 10; i++) { }
for(int i = 0, j = 0; i <= 10; i++) { }
조건식
조건식에서는 해당 조건이 참인 경우에만 해당 반복문이 실행된다. 따라서, 조건에 해당하지 않으면 단 한번의 반복도 실행되지 않으니 주의해야 한다.
증감식
증감식에서는 다양한 연산자들로 증감식을 작성할 수 있다.
for(int i = 1; i <= 10; i++){}
for(int i = 1; i <= 10; i--){}
for(int i = 1; i <= 10; i *= 2){}
for(int i = 1; i <= 10; i /= 2){}
...등등
증감식에서 또한 반복문 안에서 초기화 된 2개 이상의 변수에 대해 달리 증감을 설정할 수 있다.
for(int i = 1, j = 10; i <= 10; i++, j--) { }
초기화랑 증감식에는 서로 다른 변수를 관리 할 수 있지만, 아쉽게도 조건식에서는 되지 않는 다는 것을 볼 수 있었다. 이 부분은 처음 안 것인데, 초기화, 조건식, 증감식이 전부 필요하지 않으면 생략할 수 있고 다음과 같이 작성할 수 있다.
for(;;) {...} // 초기화, 조건식, 증감식 모두 생략. 조건식은 참
조건식이 항상 참이기 때문에 이후에 break;를 통해 for문에서 빠져나올 수 있도록 해야 한다. 예시는 다음과 같을 것이다.
static int count = 0;
for(;;) {
count++
if(count == 10) {
break;
}
}
중첩 for문
if문 안에 또 다른 if문을 넣듯이, for문 안에 또 다른 for문을 포함시키는 것도 가능하다. 동일하게 중첩의 횟수에도 제한이 없다. 주로, 2차원 배열에서 많이 사용하게 된다.
// 가장 단순한 구구단 예시 1
for(int i = 2; i <= 9; i++) {
for(int j = 1; j <= 9; j++) {
System.out.printf("%d x %x = %d\\n", i, j, i * j);
}
}
=== 2
for(int i = 2; i <= 9; i++)
for(int j = 1; j <= 9; j++)
System.out.printf("%d x %d = %d\\n", i, j, i * j); // 블럭이 한개이므로 생략
for문 또한 블럭내에 문장이 한 문장일 경우 생략이 가능하기 때문에, 2번과 같이 표시할 수 있다.
향상된 for문
JDK1.5에 추가된 기능이다. 저장된 요소에 접근할 때 기존보다 편리한 방법으로 접근할 수 있으나, 요소들을 알 수 없으므로, 요소들을 알 필요가 없을 경우에만 사용하는 것이 좋다.
for( 타입 변수명 : 배열 또는 컬렉션 ) {
// 반복할 문장
}
int[] arr = {10, 20, 30, 40, 50};
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
for(int value : arr) {
System.out.print(value + " ");
}
while문
for문은 3가지 조건이 필요한 반면 while은 단 하나의 조건식만을 필요로 한다.
while(조건식) {
// 조건식의 연산결과가 true일 동안 반복될 문장
}
여기서 중요한 것은 for문과 while문은 서로 변환이 가능하다는 것이다.
for(int i = 0; i <= 10; i++) {
System.out.println(i);
}
int i = 1;
while(i <= 10) {
System.out.println(i);
i++;
}
지금 형태에서는 아마 for문이 더 간결하고 보기 쉬울 것이다. 따라서, for문 적합할 경우, while문이 적합한 경우에 대해서 경험으로 체득해야 한다. 주의할 점은 while문에서는 조건식 생략이 불가능하다는 것이다. 이때, for(;;) 문과 같은 기능을 while(true) 항상 반복문이 참이 되도록 할 수 있다. 주로 다음과 같이 사용한다.
while(T-->0){
System.out.println(T);
}
while(T > 0) {
T--;
System.out.println(T);
}
코딩테스트 때 다음과 같은 형식을 볼 수 있는데, 아래와 위는 똑같이 동작한다는 것을 알아두어야 한다. 이전에 배운 후위 연산자의 응용이다.
// 각 자릿수의 합 구하기
int num = 12345;
int sum = 0;
while(num != 0) {
sum += num % 10;
System.out.println("sum : " + sum + ", num : " + num);
num /= 10;
}
System.out.println(sum);
sum : 5, num : 12345 sum : 9, num : 1234 sum : 12, num : 123 sum : 14, num : 12 sum : 15, num : 1 15
다음과 같이 각 자릿수를 하나씩 제거해주면서, 10으로 나눈 나머지를 구해 각 자릿수를 구하고, 그 합을 구하는 것을 볼 수 있다.
do-while 문
do-while문은 while문의 변형된 구조이다. for문과 while문은 무조건 조건에 맞아야 실행되는 반면, do-while문은 무조건 최소 한 번은 수행된다.
do {
// 처음 혹은 조건식의 연산결과가 true일 때 수행될 문장
} while (조건식); // 조건식의 끝에 ';' 가 들어간다는 것을 주의해야 한다.
do-while문은 생각보다 자주 사용되지는 않지만, 사용자에게 값을 지속적으로 입력받아야 하는 상황이라면 유용하다.
break 문, continue 문
break는 switch에서 봤었던 것처럼 탈출하는 기능을 가지고 있다. 이를 반복문에서 활용을 하면 해당 반복문에서 탈출을 할 수 있다. 그러나 continue 문은 해당 로직까지만 동작하고, 그 아래는 수행되지 않고, 다시 조건문이 맞으면 해당 반복문을 이어서 수행을 한다.
for(int i = 0; i < 6; i++) {
if(i % 3 ==0)
continue;
System.out.println(i);
} // 1
for(int i = 0; i < 6; i++) {
if(i % 3 ==0)
break;
System.out.println(i);
} // 2
서로의 결과가 다르게 나올 것이다.
1 1 2 2 4 5
break는 바로 해당 반복문을 빠져나가도록 하고, continue는 건너뛰고 이어서 진행하기 때문에 다음과 같은 결과의 차이가 발생하는 것이다.
이름 붙은 반복문
나는 항상 중첩된 for문이나 while문에서 break로 빠져나가기 위해 boolean 변수를 이용한 flag를 사용했었다. 그러나 반복문에 이름을 붙임으로써 중간에 빠져나올 수 있었다.
Loop1 : for(int i = 2; i <= 9; i++) {
for(int j = 1; j <= 9; j++) {
if(i == 5) {
break Loop1;
continue Loop1;
}
}
}
break나 continue를 위 처럼 작성하면 바로 첫 번째 반복문으로 Jump해서 중지시킬 수 있었다. flag를 쓰기보다 해당 구문을 사용하는 것이 flag 변수를 사용하는 것보다 오히려 더 좋을 것 같다.
'Language > Java' 카테고리의 다른 글
7-7 내부 클래스 (재업로드), 익명 클래스 (0) | 2023.03.29 |
---|---|
12. Generic 제너릭 (0) | 2023.03.29 |
4-1 자바 조건문 (0) | 2023.03.23 |
7-6 다형성 (0) | 2023.03.23 |
7-5 캡슐화 (0) | 2023.03.23 |