자바 for문 | 자바 입문강좌 6

자바 for문

자바 for문은 반복문입니다. 우리가 어떤 프로그램의 동작을 정의할 때 반복하는 일들이 많습니다.

컴퓨터는 똑똑할 것 같지만 컴퓨터가 알아듣는 것은 의외로 0과1밖에 없습니다. 컴퓨터에 대하여 그렇게 똑똑하지 않다고 말을 하지만 이는 반만 맞습니다. 반복문을 활용하면 인간의 계산능력을 저 멀리로 초월해 버리기 때문입니다.

한 테스트에 따르면 10세대 Intel CPU로 C++에 반복문을 만들어 64비트 정수를 누산한 결과 10초동안 61억번 누산할 수 있다는 결과도 있습니다.

사람이 계산을 하면 얼마나 걸릴지 모르는 숫자도 컴퓨터는 매우 찰나의 시간에 가능합니다.

자바 for문
자바 for문

for문을 써야하는 이유는 명백하죠. 프로그래머들은 for문을 좋아합니다.

1부터 10까지 누산하는 프로그램을 짜면 아래와 같을 것 입니다.

public static void main(String[] args) {
        
        int myAcc = 0;
        
        myAcc += 1;
        myAcc += 2;
        myAcc += 3;
        myAcc += 4;
        myAcc += 5;
        myAcc += 6;
        myAcc += 7;
        myAcc += 8;
        myAcc += 9;
        myAcc += 10;

        System.out.println("myAcc = " + myAcc);
        
    }
[실행결과]
50

이를 100까지 더할 수 있을까요?? 가능합니다. 허나 누산만 100줄의 타이핑을 해야겠죠. 누산만을 위해서 100줄의 타이핑도 할수는 있지만 가독성도 떨어지도 실수의 위험도 커집니다.

for문을 사용하면 간단합니다.

public class Main {
    public static void main(String[] args) {
        
        int myAcc = 0;

        for (int i = 1; i <= 1000 ; i++) {
            myAcc += i;
        }

        System.out.println("myAcc = " + myAcc);
        
    }
[실행결과]
myAcc = 500500

1000개의 누산정도는 아주 짧은 순간에 완료할 수 있습니다.

for문의 형식은 C언어에서 유래했습니다. 아래에서 보면 for문 한줄에 초기화; 조건식; 증감식이 다 들어있습니다. for문의 장점은 한줄안에 어떠한 조건으로 얼마만큼 실행할 수 있는지 파악할 수 있다는 점입니다.

for(초기화; 조건식; 증감식) {
    실행할 코드블록;
}

for문을 while 반복문과 비교하곤 하는데 for문은 반복회수가 미리 정해져 있는 경우 사용이 쉽습니다.

while문과 뭐가 다르냐? 라고 묻는다면 동작이 똑같더라도 가독성에 차이가 있습니다.

for문은 헤드(for의 초기화부터 증감식까지)만 봐도 어디서부터 어디까지 코드가 실행되는지 알 수 있습니다.

위에서는 1 + 2 + 3 + 4 + 5 … + 1000 까지 누산될 것을 예상할 수 있습니다. 변수 i 는 for문 안에서 초기화 하고 사용될 수 있습니다. for문의 { } 은 하나의 지역(scope)개념을 갖기 때문에 { } 블록을 벗어나면 i는 소멸됩니다.

보통 for문장 안에서 index 로 사용한다고 해서 i 라고 이름 짓고 for문을 내부에 중첩시 i, j, k 와 같이 버전을 올리기도 합니다.

자바 for문 중첩하기

for문은 중첩해서 사용할 수 있습니다. for문이 1차원이라면 for문 하나 더 추가하면 2차원이 됩니다.

수학에서 구구단은 2차원 배열이라고 할 수 있는데요. 중첩 for문을 작성해보겠습니다.

public class Main {
    public static void main(String[] args) {

        for (int i = 2; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                System.out.print(i+"*"+j+"= "+i*j+" ");
            }
            System.out.println();
        }
    }
2*1= 2 2*2= 4 2*3= 6 2*4= 8 2*5= 10 2*6= 12 2*7= 14 2*8= 16 2*9= 18 
3*1= 3 3*2= 6 3*3= 9 3*4= 12 3*5= 15 3*6= 18 3*7= 21 3*8= 24 3*9= 27 
4*1= 4 4*2= 8 4*3= 12 4*4= 16 4*5= 20 4*6= 24 4*7= 28 4*8= 32 4*9= 36 
5*1= 5 5*2= 10 5*3= 15 5*4= 20 5*5= 25 5*6= 30 5*7= 35 5*8= 40 5*9= 45 
6*1= 6 6*2= 12 6*3= 18 6*4= 24 6*5= 30 6*6= 36 6*7= 42 6*8= 48 6*9= 54 
7*1= 7 7*2= 14 7*3= 21 7*4= 28 7*5= 35 7*6= 42 7*7= 49 7*8= 56 7*9= 63 
8*1= 8 8*2= 16 8*3= 24 8*4= 32 8*5= 40 8*6= 48 8*7= 56 8*8= 64 8*9= 72 
9*1= 9 9*2= 18 9*3= 27 9*4= 36 9*5= 45 9*6= 54 9*7= 63 9*8= 72 9*9= 81 

구구단이 출력됩니다. 2차원 배열처럼 2단에 9개, 3단에 9개 … 9단에 9개 요소로 총 81개 요소가 있는 것과 같습니다.

for문으로 삼각형 그리기

for문으로 삼각형 그리기 도형그리기는 알고리즘 고전이기도 합니다. 마찬가지로 중첩문을 사용합니다.

for문의 알고리즘에 대하여 생각보다 인사이트가 있는 연습이니 충분히 연습하면 좋습니다.

직각삼각형

    public static void main(String[] args) {

        int size = 7;

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

인덱스인 i와 j를 유심히 살펴보는 것이 관건입니다. size 는 삼각형의 높이이자 크기입니다. 1층부터 7층까지 올라가는 층이라고 생각합니다.

역삼각형 그리기

    public static void main(String[] args) {

        int size = 7;

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

마찬가지로 size와 i 만 조정했습니다. 출력은 위에서 아래로 내려오기 때문에 맨위가 가장 많은 별을 찍도록 하고 내려갈 수록 줄어들게 합니다.

직사각형 (삼각형을 합친 것)

    public static void main(String[] args) {

        int size = 7;

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

삼각형을 그릴 수 있다면 두개를 합칠 수도 있습니다. 물론 그냥 사각형을 그리는 것도 가능하지만 삼각형을 합치는 방식을 사용하면 각각의 영역을 분리하여 제어할 수 있습니다.

삼각형을 세개로 연결할 수도 4개를 연결할 수도 있습니다.

다음과 같은 패턴도 만들어 낼 수 있습니다. 공백도 하나의 점이자 영역입니다.

******* * * *******
****** ** ** ******
***** *** *** *****
**** **** **** ****
*** ***** ***** ***
** ****** ****** **
* ******* ******* *
        * *        
       ** **       
      *** ***      
     **** ****     
    ***** *****    
   ****** ******   
  ******* ******* 

위 두개 코드를 사용하면 위와 같은 도형을 더 만들 수 있습니다.

요약

자바 for문의 기본을 알아봤습니다. 프로그래머는 for문을 매일 사용합니다. 반복의 힘에서 컴퓨터의 진정한 힘이 나온다는 것을 알기 때문이죠.

이 반복은 앞으로 계속 나올 개념인데요. 초반부에 확실히 익혀두는게 좋습니다. 중첩 for문은 기본이니 인덱스 사용하는 방법 i, j, size 은 여러번의 실습으로 몸에 익혀두는게 좋습니다. 알고리즘을 하기 위해서 필수입니다.

외부참조문서

for loop in java – Tutorialspoint

자바 튜토리얼 (4-4) 반복문 (자바 for문)

Leave a Comment