본문 바로가기
프로그래밍 기초/Java

[Java] 이중 for문 쉽게 배우기: 초보자를 위한 개념과 예제

by 제이투더문 2024. 6. 15.

 

 Java를 배우는 초보자들이 꼭 알아야 할 중요한 개념 중 하나는 이중 for문입니다. 이중 for문은 반복문 안에 또 다른 반복문을 포함한 구조로, 주로 2차원 배열이나 표 형태의 데이터를 다룰 때 유용합니다. 이 글에서는 이중 for문의 개념과 필요성, 흐름도 및 간단한 예제에 대해 알아보겠습니다.

 

▤ 목차

    이중 for문의 개념

     

     이중 for문은 하나의 for문 안에 또 다른 for문을 포함한 형태로, 두 가지 수준의 반복이 필요할 때 사용됩니다. 예를 들어, 2차원 배열의 모든 요소를 순회하거나, 행과 열의 구조를 가진 데이터를 처리할 때 사용됩니다. 이중 for문을 통해 각 요소를 개별적으로 접근하고 조작할 수 있습니다.

     

    이중 for문의 필요성

    이중 for문은 다양한 상황에서 매우 유용합니다. 주로 다음과 같은 경우에 필요합니다:

    • 2차원 배열 처리: 행과 열을 순회하며 데이터를 처리해야 할 때.
    • 표 데이터 출력: 행과 열로 구성된 데이터를 화면에 출력하거나 조작할 때.
    • 행렬 연산: 행렬의 덧셈, 곱셈 등 수학적 연산을 수행할 때.
    • 이미지 처리: 픽셀 단위로 이미지를 처리할 때.

     

    이중 for문의 흐름도

    이중 for문의 흐름도는 다음과 같습니다:

    1. 외부 for문 초기화
    2. 외부 for문 조건 검사 (참이면 내부 for문 실행, 거짓이면 종료)
    3. 내부 for문 초기화
    4. 내부 for문 조건 검사 (참이면 내부 코드 블록 실행, 거짓이면 내부 for문 종료)
    5. 내부 for문 증감식
    6. 다시 내부 for문 조건 검사로 돌아감
    7. 내부 for문이 끝나면 외부 for문 증감식
    8. 다시 외부 for문 조건 검사로 돌아감

    간단한 예제

    다음은 이중 for문의 간단한 예제입니다. 2차원 배열의 모든 요소를 출력하는 코드입니다.

    public class NestedForLoopExample {
        public static void main(String[] args) {
            int[][] matrix = {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
            };
            
            for (int i = 0; i < matrix.length; i++) { // 외부 for문
                for (int j = 0; j < matrix[i].length; j++) { // 내부 for문
                    System.out.print(matrix[i][j] + " ");
                }
                System.out.println();
            }
        }
    }

     

    출력결과 :

    1 2 3
    4 5 6
    7 8 9

     

     위 예제는 matrix라는 2차원 배열을 정의하고, 이중 for문을 사용하여 배열의 모든 요소를 출력합니다. 외부 for문은 배열의 행을 순회하고, 내부 for문은 각 행의 요소를 순회합니다.

     

    이중 for문의 필요성에 따른 예제

     

     이중 for문은 다양한 상황에서 매우 유용합니다. 다음은 이중 for문의 필요성을 보여주는 몇 가지 예제입니다.

     

    1. 행렬 덧셈

    두 개의 2차원 배열(행렬)을 더하는 예제입니다.

    public class MatrixAddition {
        public static void main(String[] args) {
            int[][] matrixA = {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
            };
            int[][] matrixB = {
                {9, 8, 7},
                {6, 5, 4},
                {3, 2, 1}
            };
            int[][] result = new int[3][3];
    
            for (int i = 0; i < matrixA.length; i++) {
                for (int j = 0; j < matrixA[i].length; j++) {
                    result[i][j] = matrixA[i][j] + matrixB[i][j];
                }
            }
    
            // 결과 출력
            for (int i = 0; i < result.length; i++) {
                for (int j = 0; j < result[i].length; j++) {
                    System.out.print(result[i][j] + " ");
                }
                System.out.println();
            }
        }
    }

     

    출력결과 :

    10 10 10
    10 10 10
    10 10 10

     

     위 예제는 두 개의 3x3 행렬을 더하여 결과를 출력합니다. 이중 for문을 사용하여 각 행렬의 요소를 순회하며 더해줍니다.

     

    2. 2차원 배열의 요소 합계

    2차원 배열의 모든 요소의 합계를 계산하는 예제입니다.

    public class SumOfElements {
        public static void main(String[] args) {
            int[][] matrix = {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
            };
            int sum = 0;
    
            for (int i = 0; i < matrix.length; i++) {
                for (int j = 0; j < matrix[i].length; j++) {
                    sum += matrix[i][j];
                }
            }
    
            System.out.println("모든 요소의 합계: " + sum);
        }
    }

     

    출력결과:

    모든 요소의 합계 : 45

     

     

     위 예제는 2차원 배열의 모든 요소를 순회하며 합계를 계산합니다. 이중 for문을 사용하여 각 요소를 더해줍니다.

     

    이중 for문의 장점

     

    • 2차원 데이터 처리: 2차원 배열이나 테이블 형식의 데이터를 효율적으로 처리할 수 있습니다.
    • 가독성 향상: 복잡한 반복 구조를 체계적으로 작성할 수 있어 코드의 가독성이 향상됩니다.
    • 유연성: 다양한 상황에서 응용할 수 있는 유연한 구조를 제공합니다.

     

    실습

     이중 for문 실습은 굉장히 어려울 수 있습니다. 이해가 힘드신 분은 표로 그려서 해보시길 추천드립니다. 표로 그리면서 이해하는 방식은 아래서 설명하겠습니다.

     

    (출처) 스마트인재개발원

     

     

    왼쪽 풀이 :

    public class Main {
    	public static void main(String[] args) {
    		for (int i = 0; i < 5; i++) { // i는 0부터 4까지 5번 반복
    			for (int j = 0; j <= i; j++) { // j는 0부터 i까지 반복
    				System.out.print("*");
    			}
    			System.out.println();
    		}
    	}
    }

     

     위 코드를 표로 표현해 보겠습니다. 액셀처럼 (행 ↓, 열 →)로 표기하겠습니다.

    *(0,0)  (0,1) (0,2) (0,3) (0,4)
    *(1,0) *(1,1) (1,2) (1,3) (1,4)
    *(2,0) *(2,1) *(2,2) (2,3) (2,4)
    *(3,0) *(3,1) *(3,2) *(3,3) (3,4)
    *(4,0) *(4,1) *(4,2) *(4,3) *(4,4)

     

     위 그림의 숫자를 (행을 i, 열을 j)로 봐주시면 됩니다. 순서가 중요한데 (0,0)에서 오른쪽으로 가서 다시 (1,0)으로 오는 구조입니다. 이때 i는 1입니다. 다시 말해 i = 0이고 j는 4까지 원래 돌아가는 구조입니다.

     근데 소스를 보면 제가 안쪽 for문에 j는 i보다 적거나 같을 때까지만 돌아가게 해 뒀습니다. 그래서 지금 표에 칠해진 곳을 보면 뒤의 숫자가 앞의 숫자보다 큰 곳이 없습니다. 

     정리하자면, i가 j보다 크거나 같은 곳만 별을 출력하게 되면 이와 같은 모양이 나온다는 겁니다. 다음 예제와 연결해서 또 봐보겠습니다. 비전공자나 프로그래밍 경험이 별로 없으신 분(저 포함)은 이해가 힘드실 수 있습니다.

     

    오른쪽 풀이 :

    public class Main {
    	public static void main(String[] args) {
    		for (int i = 0; i < 5; i++) {
    			for (int j = 5; j > i; j--) {
    				System.out.print("*");
    			}
    			System.out.println();
    		}
    	}
    }

     

    *(0,4) *(0,3) *(0,2) *(0,1) *(0,0)
    *(1,4) *(1,3) *(1,2) *(1,1) (1,0)
    *(2,4) *(2,3) *(2,2) (2,1) (2,0)
    *(3,4) *(3,3) (3,2) (3,1) (3,0)
    *(4,4) (4,3) (4,2) (4,1) (4,0)

     

     색깔 말고 안쪽의 숫자를 보시면 이제 J가 점차 줄어드는 것을 확인하실 수 있습니다. 그리고 j가 i보다 크거나 같을 때만 출력하는 것을 확인할 수 있습니다. 당장의 그림보다 숫자를 보고 이해하시는 게 좋습니다. 

     

     

     

     

    (출처) 스마트인재개발원

     

     

    왼쪽 풀이 :

    public class Main {
    	public static void main(String[] args) {
    		for (int i = 0; i < 5; i++) {
    			for (int j = 4; j > i; j--) {
    				System.out.print(" ");
    			}
    			for (int j = 0; j <= i; j++) {
    				System.out.print("*");
    			}
    			System.out.println();
    		}
    	}
    }
    (0,4) (0,3) (0,2) (0,1) *(0,0)
    (1,4) (1,3) (1,2) *(1,1) *(1,0)
    (2,4) (2,3) *(2,2) *(2,1) *(2,0)
    (3,4) *(3,3) *(3,2) *(3,1) *(3,0)
    *(4,4) *(4,3) *(4,2) *(4,1) *(4,0)

     

     위 쪽 예제와 생긴 모습만 반대라고 보는 것보다, 안의 숫자를 살펴보는 것이 중요합니다. 이는 다른 방법도 있겠지만, 가장 간단한 방법은 공백을 만들어 주는 것이다. 우리가 바로 위의 예제에서 공백 부분은 만들 수 있기 때문에, 공백 부분을 만들고 다시 하나의 for문에서 별을 출력한다.

     

     

    오른쪽 풀이 :

    public class Main {
    	public static void main(String[] args) {
    		for (int i = 0; i < 5; i++) {
    			for (int j = 4; j > i; j--) {
    				System.out.print(" ");
    			}
    			for (int j = 0; j <= i; j++) {
    				System.out.print("*");
    			}
    			for (int j = 0; j < i; j++) {
    				System.out.print("*");
    			}
    			System.out.println();
    		}
    	}
    }

     

    (0,4) (0,3) (0,2) (0,1) *(0,0) (0,1) (0,2) (0,3) (0,4)
    (1,4) (1,3) (1,2) *(1,1) *(1,0) *(1,1) (1,2) (1,3) (1,4)
    (2,4) (2,3) *(2,2) *(2,1) *(2,0) *(2,1) *(2,2) (2,3) (2,4)
    (3,4) *(3,3) *(3,2) *(3,1) *(3,0) *(3,1) *(3,2) *(3,3) *(3,4)
    *(4,4) *(4,3) *(4,2) *(4,1) *(4,0) *(4,1) *(4,2) *(4,3) *(4,4)

     

     따로 어렵게 풀이하지 않고, 위의 예제들을 합쳐서 출력했습니다.

     

     

    (출처) 스마트인재개발원

     

     

    풀이 :

    이건 기존에 우리가 출력한 for문을 더한 것이고, 

    public class Main {
    	public static void main(String[] args) {
    		for (int i = 0; i < 5; i++) {
    			for (int j = 4; j > i; j--) {
    				System.out.print(" ");
    			}
    			for (int j = 0; j <= i; j++) {
    				System.out.print("*");
    			}
    			for (int j = 0; j < i; j++) {
    				System.out.print("*");
    			}
    			System.out.println();
    		}
    		
    		for (int i = 0; i < 5; i++) {
    			for (int j = 0; j < i; j++) {
    				System.out.print(" ");
    			}
    			for (int j = 5; j > i; j--) {
    				System.out.print("*");
    			}
    			for (int j = 4; j > i; j--) {
    				System.out.print("*");
    			}
    			System.out.println();
    		}
    	}
    }

     

    이건 제가 한번 만들어 본 코드입니다. 이렇게 하는 게 남들이 보기도 쉽고 좋은 방법인지는 잘 모르겠습니다.

    public class Main {
    	public static void main(String[] args) {
    		int num = 4;
    		int num2 = 4;
    		
    		for (int i = 0; i < 9; i++) {
    			for (int j = 0; j < num; j++) {
    				System.out.print(" ");
    			}
    			for (int j = num; j <= num2; j++) {
    				System.out.print("*");
    			}
    			System.out.println();
    			
    			if (i >= 4) {
    				num += 1;
    				num2 -= 1;
    			} else {
    				num -= 1;
    				num2 += 1;
    			}
    		}
    	}
    }

     

     별 찍기, 다이아몬드 찍기는 어느 정도 프로그래밍을 한 저에게도 어려운 과제였습니다. 혹시나 안되시더라도 실망하지 마시고, 넘어가셔도 됩니다. 저희 인생에는 이것 말고도 중요한 것들이 많습니다.

     

     

    마무리

     

     

     이중 for문은 Java 프로그래밍에서 매우 유용한 도구입니다. 이를 통해 2차원 배열이나 테이블 형식의 데이터를 쉽게 처리할 수 있으며, 복잡한 반복 구조를 간단하게 구현할 수 있습니다. 위에서 설명한 이중 for문의 개념과 예제를 통해 이중 for문을 이해하고 활용하는 데 도움이 되길 바랍니다.

     

     초보자나 비전공자가 이해하기 어려운 파트일 수가 있습니다. 저 또한 처음 이중 for문을 접했을 때 그 구조가 이해되질 않았습니다. 하지만 반복하고 예제를 풀어보다 보면 어느 순간 감이 오실 겁니다. 파이팅입니다.