반복문은 어떤 작업이 반복적으로 실행되도록 할 때 사용되며, 반복문의 종류로는 for문, while문 do-while문이 있다. for문과 while문은 서로 변환이 가능하기 때문에 반복문을 작성할 때 어느 쪽을 선택해도 좋지만, for문은 반복 횟수를 알고 있을 때 주로 사용하고, while문은 조건에 따라 반복할 때 주로 사용한다. while문과 do-while문의 차이점은 조건을 먼저 검사하느냐, 나중에 검사하느냐일 뿐 동작 방식은 동일하다.
반복문
for문
프로그램을 작성하다 보면 똑같은 실행문을 반복적으로 실행해야 할 경우가 많이 발생한다. 다음 코드를 살펴보자.
int sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
sum = sum + 4;
sum = sum + 5;
System.out.println(" 1~5까지의 합: " + sum);
위 코드는 5개의 실행문으로 1부터 5까지의 합을 수했다. 하지만 1부터 100까지의 합, 혹은 그 이상의 숫자의 합을 구하려면 코드의 양이 엄청 많아질 것이다. 이런 경우 for문을 사용하면 코드를 획기적으로 줄여준다.
public class ForSumFromTo100Example {
public stastic void main(String[] args) {
int sum = 0;
for (int i=1; i<=100; i++) {
sum = sum + i;
}
System.out.println(" 1~100까지의 합: " + sum);
}
}
100개의 실행문을 약 3라인으로 압축한 것이라고 볼 수 있는데, 반복문은 한 번 작성된 실행문을 여러번 반복 실행해주기 때문에 코드를 절감하고 간결하게 만들어준다. 코드가 간결하면 개발 시간을 줄일 수 있고, 오류가 날 확률도 줄어든다. for문은 주어진 횟수만큼 실행문을 반복 실행할 때 적합한 반복 제어문이다. 다음은 for문의 형식과 실행 흐름을 도식화한 것이다.
for문이 처음 실행될 때 "초기화식"이 제일 먼저 실행된다. 그런다음 "조건식"을 평가해서 true이면 "실행문"을 실행시키도, false이면 for문 블록을 실행하지 않고 끝나게 된다. 블록 내부의 "실행문"들이 모두 실행되면 "증감식"을 실행시키고 다시 "조건식"을 평가하게 된다. 평가 결과가 true이면 3 -> 4 -> 2 로 다시 진행하고, false이면 for문이 끝나게 된다.
초기화식의 역할은 조건식과 실행문, 증감식에서 사용할 변수를 초기화하는 역할을 한다. 초기화식이 필요 없을 경우에는 다음과 같이 초기화식을 생략할 수 있다.
int i = 1;
for(; i<=100; i++) { ... }
어떤 경우에는 초기화식이 둘 이상이 있을 수도 있고, 증감식도 둘 이상이 있을 수 있다. 이런 경우에는 쉼표( , )로 구분해서 작성하면 된다.
for(int i=0, j=100; i<=50 && j>=50; i++, j--) { ... }
초기화식에서 선언된 변수는 for문 블록 내부에서 사용되는 로컬 변수이다. 따라서 for문을 벗어나서는 사용할 수 없다. 위의 예제 ForSumFromTo100Example 에서 9라인을 다음과 같이 수정하면 컴파일 에러가 발생한다.
System.out.println("1~" + i + " 합: " + sum);
그 이유는 i는 for문을 벗어나서는 사용할 수 없기 때문이다. 그러나 다음과 같이 변수 i가 for문의 초기화식에서 선언되지 않고 for문 전에 선언되었다면 for문 내부뿐만아니라 for문을 벗어나서도 사용할 수 있다.
public class ForSumFrom1To100Example {
public static void main(String[] args) {
int sum = 0;
int i = 0;
for(i=1; i<=100; i++) {
sum += i;
}
System.out.println("1~" + (i-1) + " 합: " + sum);
}
}
for문을 작성할 때 주의할 점은 초기화식에서 루프 카운트 변수를 선언할 때 부동소수점 타입을 사용하지 말아야 한다. 다음 예제를 보자.
public class ForFloatCounterExample {
public static void main(String[] args) {
for(float x=0.1f; x<=1.0f; x+=o.1f) {
System.out.println(x);
}
}
}
이론적으로 3라인의 for문은 10번 반복해야 한다. 하지만, 0.1은 float 타입으로 정확하게 표현할 수 없기 때문에 x에 더해지는 실제값은 0.1보다 약간 크다. 결국 루프는 9번만 실행된다. 실행되지 않는 것은 아니다. 실행은 정상적으로 이루어지되 반복횟수가 예상한것과 다르게 나올 수 있다는 것이다.
for문은 또 다른 for문을 내포할 수 있는데, 이것을 중첩된 for문이라고 한다. 이 경우 바깥쪽 for문이 한 번 실행할 때마다 중첩된 for문은 지정된 횟수만큼 반복해서 돌다가 다시 바깥쪽 for문으로 돌아간다. 다음 예제는 구구단을 출력하는 코드이다.
public class ForMultiplicationTableExample {
public static void main(String[] args) {
for(int m=2; m<=9; m++) {
System.out.println("*** " + m + "단 ***");
for(int n=1; n<=9; n++) {
System.out.println(m + " x " + n + " = " + (m*n));
}
}
}
}
while문
for문이 정해진 횟수만큼 반복한다면, while문은 조건식이 true일 경우에 계속해서 반복한다. 조건식에는 비교 또는 논리 연산식이 주로 오는데, 조건식이 false가 되면 반복 행위를 멈추고 while문을 종료한다. 다음은 while문을 작성하는 형식과 실행 흐름을 보여준다.
while문이 처음 실행될 때 "조건식"을 평가한다. 평가 결과가 true이면 "실행문"을 실행한다. "실행문"이 모두 실해오디면 다시 조건식으로 돌아가서 "조건식"을 다시 평가한다. 만약 조건식이 true라면 2 -> 1로 다시 진행하고, false라면 while문을 종료한다. 다음 예제는 1부터 100까지 합을 구하기위해 for문 대신 while문을 사용한 것이다.
public class WhileSumForm1To100Example {
public static void main(String[] args) {
int sum = 0;
int i = 1;
while(i<=100) {
sum += 1;
i++;
}
System.out.println("1~" + (i-1) + " 합: " + sum);
}
}
조건식에는 boolean 변수나 true / false 값을 산출하는 어떠한 연산이든 올 수 있다. 만약 조건식에 true를 사용하면 while(true) { ... } 이 되어서 무한 루프를 돌게 된다. 무한 루프는 무한히 반복하여 실행하기 때문에 언젠가는 while문을 빠져 나가기 위한 코드가 필요하다. 대표적으로 break문을 이용한다. break문은 뒤에서 더 자세하게 알아보자.
while(true) {
int i = 0;
int sum += i;
System.out.println(sum);
if(i==5)
break;
i++;
}
do-while문
do-while문은 조건식에 의해 반복 실행한다는 점에서는 while문과 동일하다. while문은 시작할 때부터 조건식을 검사하여 블록 내부를 실행할지 결정하지만, 경우에 따라서는 블록 내부의 실행문을 우선 실행시키고 실행 결과에 따라서 반복실행을 계속할지 결정하는 경우도 발생한다. 이때 do-while문을 사용할 수 있다. 다음은 do-while문의 작성 형식과 실행 흐름을 보여준다.
작성 시 주의할 점은 while() 뒤에 반드시 세미콜론( ; )을 붙여야 한다. do-while문이 처음 실행될 때 "실행문"을 우선 실행한다. "실행문"이 모두 실행되면 "조건식"을 평하가는데, 그 결과가 true이면 1 -> 2와 같이 반복 실행을 하고, 조건식의 결과가 false이면 do-while문을 종료한다.
break문
break문은 반복적인 for문, while문, do-while문을 실행 중지할 때 사용된다. 또한 이전에 학습한 switch문에서도 break문을 사용하여 switch문을 종료한다.
break문은 대개 if문과 같이 사용되어 if문의 조건식에 따라 for문과 while문을 종료할 때 사용한다.
public class BreakExample {
public static void main(String[] args) {
while(true) {
int num = (int)(Math.random() * 6) + 1;
System.out.println(num);
if(num == 6) {
break;
}
}
System.out.println("프로그램 종료");
}
}
만약 반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료시키지 않는다. 중첩된 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 이름(라벨)을 붙이고, "break 이름;"을 사용하면 된다.
public class BreakOutterExample {
public static void main(String[] args) {
Outter: for(char upper='A'; upper<='Z'; upper++) {
for(char lower = 'a'; lower<='z'; lower++) {
System.out.println(upper + "-" + lower);
if(lower == 'g')
break Outter;
}
}
}
}
continue문
continue문은 반복문에서만 사용되는데, 블록 내부에서 continue문이 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 이동한다.
continue문은 반복문을 종료하지 않고 계속 반복을 수행한다는 점이 break문과 다르다. break문과 마찬가지로 continue문도 대개 if문과 같이 사용되는데, 특정 조건을 만족하는 경우에 continue문을 실행해서 그 이후의 문장을 실행하지 않고 다음 반복으로 넘어간다.
public class ContinueExample {
public static void main(String[] args) {
for(int i=1; i<=10; i++) {
if(i%2 != 0)
continue;
System.out.println(i);
}
}
}
'Java 길찾기 > 이것이 자바다' 카테고리의 다른 글
[Java] 참조 타입 (2) (0) | 2022.01.03 |
---|---|
[Java] 참조 타입 (1) (0) | 2021.12.31 |
[Java] 조건문 (0) | 2021.12.29 |
[Java] 연산자 (0) | 2021.12.28 |
[Java] 타입 변환 (0) | 2021.12.27 |