본문 바로가기
Java/Java 기초문법

[JAVA 기초] 제어문 - 반복문 (for문 - 단일 for문, 다중 for문)

by dev수니 2021. 3. 3.
반응형

 

for문은 특정한 횟수동안 작업을 반복하고 싶을 때 사용하는 반복문이다. for문은 최기화, 조건식, 증감식, 그리고 실행 부분으로 이루어져 있다. 

 

for(초기화; 조건식; 증감식){
    sysout("조건식이 참일 때 실행되는 부분");
}

 

① 초기화 : 반복문을 위해 사용할 변수를 초기화한다.

② 조건식 : 반복을 계속하기 위한 조건을 정한다. 조건식의 값이 true이면 반복을 계속 진행하고, false이면 중단하고 for문을 벗어난다.

③ 증감식 : 변수의 값을 증가 또는 감소한다.

④ 실행부분 : 조건식이 참일 때 실행되는 부분이다.

 

 


Ex 예제.

 

 1  단일 for문

 

1. 다음은 1부터 10까지의 합을 계산하여 출력하는 프로그램이다.

1
2
3
4
5
6
7
8
9
10
11
12
package java_practice;
 
public class For_ {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int sum = 0;
        for(int i=1; i<=10; i++) {
            System.out.printf("i=%d sum=%d\n",i , sum+=i);
        }
    }
}
cs

합계를 저장할 int형 변수 sum을 선언하고 초기값을 0으로 지정해준다.

for문을 이용해 i를 1부터 시작, 10이 될 때까지 1씩 증가시킨다.

그리고 sum+=1 (sum = sum + i) 값은 변수 sum에 저장된다.

출력 결과는 다음과 같다.

 

tip printf()와 %d, \n 는 자바의 특수문자와 서식문자이다. 자세한 내용은 다음 글을 참고바란다.

https://soonipy.tistory.com/18

 

[JAVA 기초] 자바의 특수문자와 printf 서식문자

자바에서 백슬러쉬와 따옴표는 출력되지 않는 특수문자이다. 또한 printf를 사용해야만 하는 서식 문자도 있는데 이의 종류는 다음과 같다.  1 문자(역슬래쉬) \\ : \ \' : 작은 따옴표 \" : 큰 따옴표

soonipy.tistory.com

 

 

 

2. 다음 값을 출력하는 프로그램을 for문을 이용해 작성해라.

// 1 2 3 4 5

// 1 3 5 7 9

// 9 6 3 0 -3

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package java_practice;
 
public class For_135 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        // 1 2 3 4 5
        int i;
        for(i = 1; i<=5; i++) {
            System.out.printf(i + "\s");
        }
        System.out.println();    // 줄바꿈
        
        // 1 3 5 7 9
        for(int a = 1; a<10; a+=2) {
            System.out.printf(a + "\s");
        }
        System.out.println();    // 줄바꿈
 
        // 9 6 3 0 -3
        for(int b = 9; b>=-3; b-=3) {
            System.out.printf(b + "\s");
        }
    }
}
cs

 

 

 

 

3. 정수 하나를 입력 (n) --> n개 만큼 *을 출력

//(실행결과) 입력받은 정수 : 7 (enter)
// *******

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package java_practice;
 
import java.util.Scanner;
 
public class For_print {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        int input = sc.nextInt();
 
        System.out.println("입력받은 정수 : " + input);
 
        for(int i=1; i<=input; i++) {
            System.out.print("*");
        }
sc.close();
    }
}
cscs

 

 

 

 

 

Scanner 선언 후 int타입 변수 input에 입력 값을 받아 저장시킨다.

입력받은 값을 sysout으로 알려주고

for문을 통해 입력한 수 만큼 '*'을 출력하도록 조건을 걸어준다.

int i 1부터 시작하기 때문에 input 값과 동일해 질 때 까지 '*'의 출력을 반복해준다.

만약 여기서 i값이 0부터 시작할 경우 i<input; 으로 해줘야 한다.

 

 

 

4. 1부터 100까지 3의 배수인 수 출력하기. (for문과 if문 사용)

1
2
3
4
5
6
7
8
9
10
package java_practice;
 
public class For_3 {
    public static void main(String[] args) {
        for(int i = 1; i<=100; i++) {    // i값을 100까지 안의 내용을 반복
            if(i%3==0)        // i값이 3의 배수일 경우 출력
                System.out.print(i + " ");
        }
    }
}
cs

 

 

 

 

5. 정수를 입력받아서 !(factorial) 값을 출력받는 프로그램이다.

4! = 4 x 3 x 2 x 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package java_practice;
 
import java.util.Scanner;
 
public class For_Factorial {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        (Q)    정수 입력 : 4 (엔터)
//        출력 : 4! = 24
        
        Scanner sc = new Scanner(System.in);
        int input = sc.nextInt();
        int fac = 1;
        System.out.println("정수 입력 : " + input);
        for(int i = 1; i<=input; i++) {
            fac *= i;
        }
        System.out.printf("출력 : %d! = %d", input, fac);
        sc.close();
    }
}
 
cs

입력한 input값 4와 i값과 같아질 동안 fac값에 i을 곱해주고 fac에 저장한다.

tip input과 fac의 값을 fomat형태로 찍어줬다.

 

 

 

 

 

 

 2  다중 for문

 

모든 제어문이 중첩이 가능하듯, for문도 중첩이 가능하다. 방법은 다음과 같다.

for(초기화; 조건식; 증감식){
    for(초기화; 조건식; 증감식){
        sysout("조건식이 참일 때 실행되는 부분");
    }

}

 

 

 

1. 가로*세로가 9*8인 별을 만들어 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package java_practice;
 
public class For_Star {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for(int i = 1; i<=8; i++) {
            for(int j = 1; j<=9; j++) {
                System.out.print("☆ ");
            }
            System.out.println();
        }
    }
}
cs

결과를 보면 알 수 있다시피 첫번째 for문이 행을 나타내고 두번째 for문이 열을 나타내는 것을 알 수 있다.

j변수의 for문이 별 9개를 다 찍고 for문을 빠져나올 때, 줄바꿈을 해 주어야 i=2 열이 다음 줄에서 시작이 가능하다. 따라서 j변수의 for문이 빠져나왔을 때 sysout해준다.

 

이 구조만 파악하면 어떤 중첩 for문이든 사용이 가능하다.

 

 

 

 

 

 

2. 다음 내용을 for을 중첩하여 출력해보자.

2x1 3x1 4x1 5x1 6x1 7x1 8x1 9x1
2x2 3x2 4x2 5x2 6x2 7x2 8x2 9x2
2x3 3x3 4x3 5x3 6x3 7x3 8x3 9x3
2x4 3x4 4x4 5x4 6x4 7x4 8x4 9x4
2x5 3x5 4x5 5x5 6x5 7x5 8x5 9x5
2x6 3x6 4x6 5x6 6x6 7x6 8x6 9x6
2x7 3x7 4x7 5x7 6x7 7x7 8x7 9x7
2x8 3x8 4x8 5x8 6x8 7x8 8x8 9x8
2x9 3x9 4x9 5x9 6x9 7x9 8x9 9x9

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package java_practice;
 
public class For_For {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for(int a=1; a<=9; a++) {
            for(int b=2; b<=9; b++) {
                System.out.print(b + "x" + a + "\t");
            }
            System.out.println();
        }
    }
}
cs

 

열(세로) 구조를 살펴봤을 때 x 뒷 부분1,2,3,4,5,6,7,8,9 으로 증가하고 

행(가로) 구조를 살펴봤을 때 x 앞 부분2,3,4,5,6,7,8,9 이런식으로 증가하기 때문에

 

첫 번째 변수 a의 for문1부터 시작, 9로 끝나야 하며 1씩 증가하고

두 번째 변수 b의 for문2부터 시작, 9로 끝나야 한다.

 

이렇게 중첩 for문의 구조를 완성 시켰고 출력할 내용은 b x a 가 된다.

 

그리고 \t를 해주어 행을 구분해준다. 

 

 

 

 

 

 

 

3. 구구단 프로그램 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package java_practice;
 
public class For_Multi {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for(int i=1; i<=9; i++){
            for(int j=2; j<=9; j++) {
                System.out.print(j + "x" + i + "=" + j*+ "\t");
            }
            System.out.println();
        }
    }
}
 
cs

 

위 2.번의 내용을 응용한 것이다. =j*i 값만 추가해 준 구조이다.

 

 
 
 
 
 
 

4. 순차적으로 별을 찍는 프로그램


★★
★★★
★★★★
★★★★★

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package java_practice;
 
import java.util.Iterator;
 
public class For_Star1 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j <= i; j++) {
                System.out.print("★");
            }
            System.out.println();
        }
    }
}
cs
 
이 문제는 위의 문제들과는 다르게 행에서 별이 출력되는 갯수를 i에 맞춰야 한다는 것이다.
따라서 변수 j의 for문 조건식에서 <= i; 로 설정해줘야 한다.
 
 
 
 
 
 
 
 
 
 

5. 정수 n을 입력받고 순차적으로 별을 찍는 프로그램 (피라미드 구조 for문)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package java_practice;
 
import java.util.Scanner;
 
public class For_pyramid {
 
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
        int input = sc.nextInt();
        
        for(int i=0; i<input; i++) {
           for(int k=input; k>i; k--) {
                System.out.print(" ");
            }
            for(int j=0; j<=2*i; j++) {
                System.out.print("★");
            }
            System.out.println();
        }
    }
}
cs
 

input 값을 9로 입력한 상태.

1. 첫번째 for문의 i값이 0부터 시작 조건식(i<9)에 만족하므로 실행부분 안으로 들어간다.

2. 두번째 for문에서 k값은 9로 시작, k값이 i값인 0보다 클때 까지 " "내용이 출력되고, k값이 0이되면 빠져나온다. 따라서 " "은 10번 출력

3. 세번째 for문에서 j값이 0부터 시작, 조건식은 i값이 0이므로 2*0=0 j=0참이므로 한번 출력, 그후 j값이 1증가되어 j=0성립하지 않아 빠져나온다.

4. 빠져나온 후 System.out.println(); 만나 줄바꿈,

5. 첫번째 for문의 증감식으로 돌아가 i++을 만나 i값은 1이된다.

6. i=1이 input값인 9보다 여전히 작기 때문에 실행부분으로 들어간다.

7. 두번째 for문에서 k값이 9로 시작, i값인 1보다 작을 때 까지 " "내용이 출력되기 때문에 9~2 9번 출력된다. 그리고 k값이 계속 감소하여 1이 되면 for문을 빠져나온다.

8. 세번째 for문의 j값은 0 조건식은 j<=2 으로 성립하여 한번 출력후 j++되어 j값은 2가 된다. 이후에도 여전히 (j=2 <= 2)이 성립하기에 한번 더 출력된 후 j값은 3이 되어 for문을 빠져나온다.

9. 빠져나온 후 System.out.println(); 만나 줄바꿈 후,

10. 다시 첫번째 for문으로 돌아가 똑같이 반복한다.

 

 

 

 

 

 

 

 

 

6. 수를 입력받고 그 수만큼 순차적으로 증가하는 프로그램이다.

입력값 = 5


2 2 
3 3 3 
4 4 4 4 
5 5 5 5 5 

 

이 구조는 예제 4.의 구조와 같고, 출력값을 "★" 대신 i로 한 것이다. 따라서 코드는 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package java_practice;
 
import java.util.Scanner;
 
public class For_Number {
 
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
        System.out.println("정수를 입력하세요.");
        int input = sc.nextInt();
        
        for(int i=1; i<=input; i++) {
            for(int j=1; j<=i; j++) {
                System.out.print(i + " ");
            }
            System.out.println();
        }
    }
}
cs

위 코드로 다음 예제도 응용하여 풀 수 있다.

 

 

 

 

 

 

 

7. 다음 구조를 출력하기 위한 코드이다.

입력값 = 5


2 3 
3 4 5 
4 5 6 7 
5 6 7 8 9 

 

이 구조를 만드는 방식을 파악하기 위해 i=3 일 경우를 생각해보자. i=3일 때는 행의 세번째 줄이 실행되어야 한다. 따라서 j열은 3번 출력되어야 하며 3, 4, 5로 순차적으로 증가하기에 출력 값을 코드로 풀면 i+j-1이 된다.

 

이를 i=4일 경우에 대입해 봐도 위 구조와 같은 결과값이 나온다.

 

따라서 이대로 코드를 짜면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package java_practice;
 
import java.util.Scanner;
 
public class For_Number {
 
    public static void main(String[] args) {
        // (Q고급)     (실행결과) 입력 : 5
        // 1         1
        // 01        23
        // 101       345  --> i:3,j:1,2,3 ---> 345 출력:(i+j-1)
        // 0101      4567
        // 10101     56789       
        Scanner sc = new Scanner(System.in);
        System.out.println("정수를 입력하세요.");
        int input = sc.nextInt();
        
        for(int i=1; i<=input; i++) {
            for(int j=1; j<=i; j++) {
                System.out.print(i+j-1 + " ");
            }
            System.out.println();
        }
    }
}
cs
 

이를 한번 더 응용해보자.

 

 

 

 

 

8. 다음 구조를 출력해보자.

입력값 = 5

0 1 
1 0 1 
0 1 0 1 
1 0 1 0 1 

위 구조에서 2를 나눈 나머지 값으로 바꾼다면 나올 결과이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package java_practice;
 
import java.util.Scanner;
 
public class For_Number {
 
    public static void main(String[] args) {
        // (Q고급)     (실행결과) 입력 : 5
        // 1        1
        // 01       23
        // 101      345  --> i:3,j:1,2,3 ---> 345 출력:(i+j-1)
        // 0101     4567
        // 10101    56789        
        Scanner sc = new Scanner(System.in);
        System.out.println("정수를 입력하세요.");
        int input = sc.nextInt();
        
        for(int i=1; i<=input; i++) {
            for(int j=1; j<=i; j++) {
                System.out.print((i+j-1)%2 + " ");
            }
            System.out.println();
        }
    }
}
cs

 

 

 

 

 

 

위의 구조를 모두 완벽하게 이해해야 for문을 이해했다고 할 수 있다. 반복문의 경우 다른 언어에서도 많이 사용하는 것은 물론 이를 능수능란하게 사용할 줄 알아야한다. 따라서 한번 이해했다고 넘어가지 말고 몇번이고 반복해서 공부해야 하고 다른 응용문제들도 많이 접해봐야 한다.

반응형

댓글