들어가며
이번에는 반복문 관련하여
응용을 해보려고 한다.
우리는 이미 '하나의 문장
안에 다른 문장을 삽입할
수 있음'을 알고 있다.
예를 들면 for문 안에 if문을
삽입하는 경우이다.
마찬가지로 for문 안에
while문도,
do ~ while문도 그리고
for문도 삽입할 수 있다.
이처럼 하나의 반복문 안에
다른 반복문이
삽입된 경우를 가리켜
'반복문의 중첩'이라고 한다.
생각해 볼 수 있는 중첩의 종류는?
반복문의 종류가 3가지 이니,
도출되는 경우의 수는 9가지
형태다.
- for + for
- for + while
- for + do ~ while
- while + for
- while + while
- whlie + do ~ while
- do ~ while + for
- do ~ while + while
- do ~ while + do ~ while
이 아홉가지 중에서 한 가지
구조로만
중첩을 시킬 수 있어도
나머지 구조로
얼마든지 중첩을 시킬 수
있다.
따라서 가장 흔히 사용하는
for문의 중첩,
그리고 while문의 중첩을
대상으로
'반복문의 중첩'을 진행해
보겠다.
많이 등장하는 for문의 중첩
활용도가 높고 또 이해하기
좋은 것이 for문의 중첩이다.
일단 다음 예제와 그 실행
결과를 분석해 보자
이 예제는 중첩된 for문의
실행 흐름을 파악 할 수
있도록 작성되었다.
public class temp {
public static void main(String[] args){
for (int i = 0; i < 3; i++){
System.out.println("------------------");
for (int j = 0; j < 3; j++){
System.out.print("[" + i + ", " + j + "]");
}
System.out.print('\n');
}
}
}
/*
실행 결과
------------------
[0, 0][0, 1][0, 2]
------------------
[1, 0][1, 1][1, 2]
------------------
[2, 0][2, 1][2, 2]
*/
중첩된 for문은 많은
설명이 필요하지 않다.
적절한 예제 하나를 통해서
그 흐름을 이해하면 충분하다.
그렇다면 이러한 for문의
중첩은 어떤 경우에
사용하면 좋을까?
가장 쉬운 예로는 구구단의
출력을 들 수 있다.
구구단 전체를 출력하는
프로그램을 작성하려면
for문을 중첩해야 한다.
다음 그림을 통해서 for문을
중첩했을 때
바깥쪽 for문이 담당하는
영역이 어떻게 되는지
관찰하자.
위 그림에서 보이듯이 각
단마다
1부터 9까지의 곱을 진행하니
이를 위한 for문이 하나 필요하다.
그리고 2단부터 9단까지
진행을 해야 하니
이를 위한 for문이 또하나
필요하다.
결과적으로 for문을
다음 예제에서
보이는 바와 같이
중첩해야 한다.
public class temp {
public static void main(String[] args){
for (int i = 2; i < 10; i++){
for (int j = 2; j < 10; j++){
System.out.println(i + " x " + j + " = " + (i * j));
}
}
}
}
/*
실행 결과
(대충 실행 결과는 구구단이라는 내용)
*/
위 예제의 코드는 몇 줄
되지 않는다.
그럼에도 불구하고 구구단의
전체 출력이라는 일을 해내고
있다.
이것이 반복문의 중첩이
갖는 장점이다.
while문의 중첩
다양한 상황에서의 유연한
코드 작성을 위해
while문의 중첩도 보고자
한다.
앞서 제시한 구구단 출력
예제를 while문의 중첩으로
재 구현한 결과는 다음과
같다.
실행 결과도 동일하다.
public class temp {
public static void main(String[] args){
int i = 2, j;
while (i < 10){
j = 1;
while (j < 10){
System.out.println(i + " x " + j + " = " + (i*j));
j++;
}
i++;
}
}
}
/*
실행 결과
(대충 실행 결과는 구구단이라는 내용)
*/
동일한 결과를 보이는
예제임에도 불구하고
for문을 중첩해서
구현했을 때보다
코드의 구성이 복잡하다.
때문에 반복문을 중첩할
때에는
for문을 우선으로 고려하기
바란다.
중첩된 반복문을 한 번에 빠져나오는 방법
- 레이블을 설정하는 break문
break문이 실행되면 자신을
감싸고 있는
하나의 반복문을 빠져나갈 뿐,
중첩된 반복문 전부를
빠져나가지는 못한다.
따라서 다음과 같은 목적의
예제 작성에 문제가 될 수
있다.
"구구단에서 곱의 결과가
72인 결과를 딱 하나만 보여라."
public class temp {
public static void main(String[] args) {
for (int i = 2; i < 10; i++) {
for (int j = 2; j < 10; j++) {
if ((i * j) == 72) {
System.out.println(i + " x " + j + " = " + (i * j));
break;
}
}
}
}
}
/*
실행 결과
8 x 9 = 72
9 x 8 = 72
*/
위의 예제에서는 곱의
결과가 72일 때 break문을
실행한다.
그러나 탈출하는 것은
안쪽 for문이다.
즉 바깥쪽 for문은 계속
실행이 된다.
그래서 실행 결과에서
보이듯이
8과 9의 곱에서 끝나지
않고 9와 8의 곱까지
출력되었다.
그렇다면 바깥쪽 for문까지
탈출하려면 어떻게 해야
할까?
다음 예제에서 보이듯이
레이블을 이용해서
빠져나갈 위치를 명시해
주면 된다.
public class temp {
public static void main(String[] args) {
outer : for (int i = 2; i < 10; i++) {
for (int j = 2; j < 10; j++) {
if ((i * j) == 72) {
System.out.println(i + " x " + j + " = " + (i * j));
break outer;
}
}
}
}
}
/*
실행 결과
8 x 9 = 72
*/
처음 레이블을 접한 것이
switch문에서였다.
당시의 레이블과 마찬가지로
break문에서 사용되는
레이블도 위치의 지정이
목적이다.
따라서 들여쓰기에 상관없이
잘 보이는 위치에 놓아두면
된다.
참고 및 출처
|