반복문을 이용하면 특정 코드를 개발자가 원하는 횟수만큼 반복 제어하여 생산성을 향상하고, 유지보수성을 향상시킬 수 있다.
반복문의 종류로는 for, while, do while, for(foreach)가 있다. 이때, foreach는 향상된 for문(Enhanced for statement)을 의미한다.
💡for문
for (초기식; 조건식; 증감식){
문장;
}
for문은 초기식, 조건식, 증감식으로 구성되며 소괄호 안에 문장을 3개 넣을 수 있다.
반복문은 증감식을 만나면 반복문을 나오지 않고, 다시 초기식으로 돌아간다는 특징이 있다.
1. 초기식: 루프 변수(i)를 초기화한다.
2. 조건식: 루프 지속 유무를 결정한다.
3. 증감식: 루프 변수에 변화를 주는 역할을 한다. (언젠가 루프를 탈출할 수 있도록-false)
"안녕하세요" 문장을 3회 출력하는데 사용할 수 있는 방법을 살펴보며 반복문의 특성을 알아보도록 하자.
Case 1: 등짝을 맞는 방법
System.out.println("안녕하세요");
System.out.println("안녕하세요");
System.out.println("안녕하세요");
시간에 쫓길 때 사용할 수 있는 방법이다. 하지만 빨랐죠?
같은 목적을 가지고 있는 코드는 두 번 이상 사용하지 않는 것이 좋다.
Case 2: 메소드를 활용하는 방법
public static void main(String[] args) {
hello();
hello();
hello();
}
public static void hello() {
System.out.println("안녕하세요.");
}
메소드 호출을 반복함으로써 출력하며, 이 방법은 코드를 수정하기에 용이하다는 장점이 있다.
하지만 위의 과정을 for문으로 작성하여 더욱 단순하게 하는 것이 가능하다.
Case 3: 반복문을 활용하는 방법
for(int i = 1; i <= 3; i++) {
System.out.println("안녕하세요.");
}
1. 초기식: 메모리에 i라는 변수를 만들고 1로 초기화한다.
2. 조건식: i가 3보다 작거나 같은지 검사한다.
3. 문장: 블럭(문장)을 실행한다.
4. 증감식: i에 1을 더해 저장한다.
(초기식은 처음 한 번만 실행된다.)
for문은 위 과정을 반복하며 "안녕하세요" 문장을 3회 출력한다.
for문의 다양한 사용
for (int i = 1; i <= 5; i++) {
System.out.println("실행문");
}
System.out.println("");
for (int i = 5; i <= 9; i++) {
System.out.println("실행문");
}
System.out.println("");
for (int i = 1; i <= 9; i = i + 2) {
System.out.println("실행문");
}
System.out.println("");
for (int i = 5; i > 0; i--) {
System.out.println("실행문");
}
System.out.println("");
위의 4가지 for문은 모두 다른 방법이지만, 출력하는 건 같다.
통상적으로 1식 증가하는 for문을 많이 사용하긴 하지만, 필수는 아니므로 상황에 따라서 적절하게 사용하면 된다. 그리고 증감식에서 꼭 ++를 사용할 필요 또한 없다.
for(int i = 1; i <= 10; i++) {
System.out.println(i);
}
for문은 수열 등을 표현할 때, 내가 원하는 숫자의 패턴 값을 수월하게 공급받기 위해 사용할 수 있다.
단순히 for문을 돌리는 게 중요한 게 아니라 내가 원하는 패턴 값을 만드는 게 훨씬 중요하다.
따라서 for문은 아래의 두 가지 목적으로 사용한다는 것을 알 수 있다.
1. 원하는 횟수 만큼 반복하는 목적
2. 원하는 패턴대로 루프 변수 값을 얻는 목적
무한루프 Infinite Loop
int sum = 0; // 누적 변수
int num = 0; // 입력
Scanner scan = new Scanner(System.in);
// 무한루프
for (;;) {
System.out.print("숫자: ");
num = scan.nextInt();
if (num % 2 == 0) { // 짝수 입력시 종료
break;
}
sum += num;
}
System.out.println(sum);
회전수를 예측하기 힘들 때 무한루프를 사용한다.
위 소스코드는 사용자의 숫자 입력을 누적하여 저장하되, 짝수를 입력하면 루프를 종료한다.
다중 for문
// 대회전 (시침)
for (int i = 0; i < 10; i++) {
// 중회전 (분침)
for (int j = 0; j < 10; j++) {
// 소회전 (초침)
for (int k = 0; k < 10; k++) {
// 실행문
if (j == 5) {
break;
}
System.out.printf("i: %d, j: %d, k: %d\n", i, j, k);
}
}
}
for문은 2중, 3중으로도 사용이 가능하며, 시침, 분침, 초침으로 생각하면 이해하기 쉽다.
위의 3개의 for문은 단지 겹쳐놓은 것임으로, k를 선언한 for문 내에서 break문을 만나더라도 모든 반복문을 나가는 게 아니라 해당 break문을 포함하고 있는 1개의 반복문(k루프)만을 나가게 된다.
💡while문
while (조건식) {
문장;
}
while은 조건식을 만족하면 다시 올라가 실행하며, if를 반복하는 구조라고 생각하면 편하다.
조건을 만족하지 않으면 반복문을 빠져나온다.
for문과 while문의 공통점
for (int i = 1; i <= 10; i++) { // 초기식, 조건식, 증감식
System.out.println(i);
}
System.out.println();
int num = 1; // 초기식
while (num <= 10) { // 조건식
System.out.println(num);
num++; // 증감식
}
위의 for문과 while문 모두 1 ~ 10까지 출력하는 코드이다.
따지자면 for문과 while문은 같다고 할 수 있다. while문도 for문과 같이 초기식, 조건식, 증감식을 필요로 하기 때문이다.
다만 for문은 양식이 정해진 딱딱한 코드라고 하면, while문은 그보다 유연한 코드라고 할 수 있다. 초기식, 증감식에 정해진 위치가 없으므로 while문이 for문보다 활용이 용이하다.
💡do while문
do {
문장;
} while (조건식);
while문은 선조건 후조건인 반면, do while문은 선실행 후조건이다.
do while문은 조건식이 false라고 하더라도 조건과 상관없이 처음은 무조건 실행한다.
do while문을 이용하는 작업이 많이 없기 때문에 자연스럽게 도태되었다.