주인장의 프로그래밍 개발 공부방

[Chapter 4 반복문] 5. 중첩 반복문(중첩 for문) (어려움) 본문

프로그래밍 기본 지식/Chapter 4 반복문

[Chapter 4 반복문] 5. 중첩 반복문(중첩 for문) (어려움)

거신 2019. 7. 8. 02:05

이제 반복문의 끝판왕이자

길고 길었던 반복문을 끝낼 때가 왔다.

이번 시간에는 반복문 안에 또 다른 반복문을 사용하는

중첩 반복문에 대해서 알아보려고 한다.

 

목표 : 중첩 반복문이 어떻게 동작하는지 정확하게 이해하고 중첩 반복문을 사용할 수 있다.

 

1. 중첩 반복문이란?

 

중첩 반복문은 우리가 지금까지 공부했던

반복문 안에 새로운 반복문이 들어가 있는 녀석을 말한다.

이전에 조건문을 공부할 적에도 중첩 조건문이라는 것도 있었던 것처럼

반복문도 중첩이 가능하다.

그리고 그 중첩의 횟수도 제한이 없다.

(하지만 조건문과는 다르게 반복문에는 특이한 개념이 따라오기 때문에 중첩 횟수가 굉장히 중요하다.

그 부분은 나중에 다시 알아볼 기회가 있으니 이번 시간에는 중첩 횟수에 제한이 없다만 알고 있자.)

 

그리고 어떠한 반복문을 중첩하더라도 상관이 없다.

즉, for문 안에 for문도 들어갈 수 있고 while문이 들어갈 수도 있다.

반대로 while문 안에 while문이 들어가도 되고 for문이 들어가도 된다.

이 역시 중첩 조건문과 거의 대부분 같다고 생각하면 된다.

 

하지만 중첩 조건문과 다른 점은 중첩 반복문이 동작하는 과정이 되겠다.

이 부분에서 특히나 어려움을 많이 겪을 수 있으니

가능하다면 정확하게 개념과 동작과정을 정확하게 이해하길 바란다.

 

2. 중첩 반복문의 형태

 

그렇다면 중첩 반복문의 형태를 알아보도록 하자.

반복문만 사용한 중첩 반복문에는 여러 형태가 있겠지만

여기에서는 가장 많이 사용하는 for문만을 사용한 중첩 반복문에 대해서

자세하게 알아보려고 한다.

이 형태의 중첩 반복문만 제대로 이해하면 다른 형태의 중첩 반복문을 이해하는데

큰 어려움이 없을 것이다.

다시 말해, for문이 중첩된 중첩 반복문이 제일 어렵다는 뜻이 되겠다.

 

각설하고 먼저 코드부터 살펴보도록 하자

 

예시1)

for(int i = 2; i < 10; i++) {
	for(int j = 1; j < 10; j++) {
    	System.out.println(i + " x " + j + " = " + (i * j));
    }
}

위의 예시1은 구구단을 2단부터 시작해 9단까지 출력하는 코드가 되겠다.

중첩 반복문가장 대표적인 예시가 바로 구구단이 되겠다.

 

여기에서 중첩 반복문의 형태를 자세하게 알아보자면

일단 for문 안에 새로운 for문이 등장했다.

일단 for문은 반복문이기 때문에 밖에 있는 for문도 반복할 것이고

안에 있는 for문도 반복할 것이다.

그렇다면 어떻게 반복한다는 것일까?

 

처음 접하면 굉장히 어렵게 느껴질 수도 있지만

차근차근 살펴보면 의외로 간단하다는 것을 알 수 있다.

먼저 쉽게 설명하자면 밖에 있는 for문이 1번 실행될 때마다

안에 있는 for문이 모든 반복을 실행하게 된다.

그리고 안에 있는 for문의 동작이 완료되면 다시 밖에 있는 for문이 1번 반복하게 되고

안에 있는 for문이 다시 동작을 반복하는 것이다.

그래서 밖에 있는 for문이 만약 5번을 반복하고 안에 있는 for문이 3번을 반복하는 형태라면

총 15번의 동작이 실행된다는 것을 알 수 있다.

 

일반적인 for문도 마찬가지지만 중첩 for문배열과도 아주 밀접한 관련이 있다.

특히 2차원 배열을 사용한다면 중첩 for문은 거의 필수라고 봐도 무방하다.

일반 for문은 1차원 배열, 중첩 for문은 2차원 배열과 궁합이 아주 잘 맞다고 생각하면 좋겠다.

다음에 배열을 배우게 된다면 for문과 함께 어떤식으로 사용되는지 알아보도록 하자.

 

3. 중첩 반복문의 동작 과정

 

일단 중첩 반복문이 어떻게 생겼는지 알았으니 이제 어떤식으로 동작하는지

자세하게 알아볼 필요가 있다.

앞서 잠깐 맛보기 식으로 어떻게 동작하는지 언급했었는데

동작 과정을 좀 더 세밀하게 알고 이해한다면 더 다양한 중첩 반복문을 사용할 수 있을 것이라고 생각한다.

 

다시 예시를 보도록 하자.

 

예시2)

for(int i = 1; i <= 10; i++) {
	for(int j = 0; j < i; j++) {
    	System.out.println("*");
    }
}

위의 코드를 실행해보면 신기한 출력물을 얻을 수 있을 것이다.

중첩 반복문 문제로 가장 대표적인 "별찍기" 예제가 되겠다.

꼭 한 번 실행해보길 바란다.

 

이러한 코드를 이용해서 직각삼각형, 정삼각형, 다이아몬드, 리본 등등

요상한 출력들을 얻을 수 있다.

그 문제들은 스스로 한 번 만들어보길 권장한다.

별찍기를 마스터한다면 중첩 반복문을 마스터했다고 해도 과언이 아닐테니....

 

다시 본론으로 돌아와서

이렇게 중첩되어 있는 반복문은 어떤 순서로 동작하는지를 정확하게 파악할 필요가 있다.

중첩 조건문과는 다르게 동작하는 순서와 방식이 약간 다르기 때문에

한 번은 제대로 알아봐야한다.

 

먼저 for문이 동작하는 순서가 되겠다.

크게 바깥에 있는 for문, 안에 있는 for문으로 나눌 수 있는데

앞서 잠깐 알아봤듯이 바깥에 있는 for문이 한 번 실행될 때 마다

안에 있는 for문이 모든 반복을 마치는 동작을 하게 된다.

그런데 여기에서 코드를 읽는 순서를 살펴보자.

 

예시2가 실행이 된다면 코드를 실행하는 컴파일러는 이러한 순서로 코드를 실행한다.

 

int i = 1  i <= 10  int j = 0  j < i  j++  j < i  j++  .....  i++ 

i <= 10  int j = 0  j < i  j++  j < i  j++  .....  i++ 

i <= 10  int j = 0  j < i  j++  j < i  j++  .....  i++ → .....

 

이게 뭔가 싶을 것이다.

외계문자처럼 보일텐데 순서대로 살펴보자면

 

먼저 바깥에 있는 for문에서 int i = 1이라는 초기화가 실행된다.

그런데 이 부분은 위의 중첩 반복문에서 무조건, 단, 1번만 실행된다.

이 점을 잊지않길 바란다.

의외로 간단하게 생각할 수도 있겠지만 아주 중요한 부분이라고 할 수 있겠다.

그리고 그 다음에 i <= 10이라는 조건식을 판단해서

만약 여기에서 결과가 true가 된다면 바깥에 있는 for문의 안으로 진행한다.

그리고 안에 있는 새로운 for문을 만나게 되고

여기서부터는 우리가 알고있는 단순 반복문의 과정을 진행하게 된다.

그리고 안에 있는 반복문이 완료되면

바깥에 있는 for문으로 돌아와 i++를 실행하고 i <= 10을 다시 판단하게 된다.

여기에서 true가 된다면 역시 앞서 똑같은 동작을 반복하고

만약 false가 된다면 비로소 중첩 반복문의 동작이 모두 완료하는 것이다.

 

말로 풀어서 설명했기 때문에 굉장히 복잡하고 어렵게 느껴질 것이다.

그렇기 때문에 스스로 코드가 동작하는 순서를 하나씩 따라가보는 것을 추천한다.

아무리 글로 설명하더라도 결국 본인이 직접 진행해보는 것이 가장 크게 와닿기 때문이다.

 

4. 마무리

 

굉장히 어려운 설명이 이어졌지만 사실 생각해보면

의외로 간단한 동작을 하고 있는 것이다.

바깥에 있는 for문도 결국 반복을 하고 있는 것이기 때문에

자신이 가지고 있는 구현부를 계속해서 반복하는 것이다.

크게 뜯어서 생각하면 우리가 알고 있는 반복문의 동작을 그대로 실행하고 있는 것이다.

그리고 안에 있는 for문또 다른 for문이기 때문에 자신의 역할을 그대로 하고 있는 것이다.

처음에는 굉장히 어렵게 느껴질지도 모르지만

시간이 지나고보면 굉장히 간단하다는 것을 느낄 때가 올 것이라 믿는다.

그리고 단순 반복문 뿐만 아니라 중첩 반복문도 완전히 이해해야

다음에 배울 배열을 장난감다루듯 가지고 놀 수 있다는 점도 기억하길 바란다.

Comments