Coding(Java)/Java(이론)2021. 8. 24. 20:00
반응형

[Java] 9. for문

 

 

자바 반복문에는 for문, while문, do-while문이 있고, 그 중 for문이 가장 많이 사용된다. 

 

for문은 반복문으로 특정 명령들을 원하는 만큼 반복처리할 때 사용하는 제어문이다. 조건을 만족할 때 실행 명령문을 처리하고 그렇지 않으면(조건을 만족하지 못하면) for문을 빠져나가게 되어있다.

 

for(초기식; 조건식; 증감식){
       실행문1;
       실행문2;
       ...
}

초기식은 가장 먼저 실행하는 부분이고, 두 번 다시 실행되지 않는다(다중 for문에서는 실행될 수 있다).

조건식은 초기식 다음으로 실행하는 부분이고, 루프(loop)가 돌 때마다 한 번찍 비교해 반복을 실행할 지 벗어날 지를 결정한다.

증감식은 루프를 실행할 때마다 조건식에서 비교하기 전 항상 실행하고 조건식에 사용되는 변수값을 증가하거나 감소하게 해 루프를 원활하게 실행하거나 무한루프를 피하게 한다.

*루프는 프로그램의 실행흐름을 뜻한다.

*주의할 점은 C언어처럼 초기식, 조건식, 증감식 사이에 콤마(,)를 써서 구분할 수 없고, 세미콜론(;)을 써야 한다.

 

다음은 for문을 이용해 문자를 여러번 출력하고, 1부터 10까지의 합을 구하는 프로그램이다.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package mymain;
 
public class _3_for문1 {
 
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        for(int i=0;i<3;i++//0, 1, ... , n-1(n개)
        {
        //i는 지역변수({}안에서만 사용됨, block안에서만 사용가능, 바깥에서 정의되면 block바깥에서도 사용가능)    
        System.out.println("나는 수학 연구가:"+i);
        }
        
        int s = 0//값을 누적시킬 변수
 
        for (int i = 1; i <= 10; i++) {
 
            System.out.print(i);
 
            if (i != 10)
                System.out.print('+');
            else
                System.out.print('=');
            
            s = s + i; //i값을 누적
 
            Thread.sleep(1000); // 1초씩 대기
        }
        System.out.printf("%d\n", s);
        
        //다른 방법(순서를 거꾸로함)
        s=0;
        int n=10;
        for(int i=n; i>=0; i--) { //i=10, 9, 8, 7,..., 0
            s=s+i;
        }
        System.out.println(s);
                
    }
 
}
cs

이 프로그램의 실행결과는 다음과 같다.

나는 수학 연구가:0
나는 수학 연구가:1
나는 수학 연구가:2
1+2+3+4+5+6+7+8+9+10=55
55

문자 출력 부분에서

for(int i=0;i<3;i++//0, 1, ... , n-1(n개)
        {
        //i는 지역변수({}안에서만 사용됨, block안에서만 사용가능, 바깥에서 정의되면 block바깥에서도 사용가능)    
        System.out.println("나는 수학 연구가:"+i);
        }

초기식 부분은 i=0, 조건식 부분은 i<3, 증감식 부분은 i++(1씩 증가)로 되어있다. 

각각 i=0, i=1, i=2(총 3회)일 때 실행되어 문자열이 총 3번 출력된다.

 

1부터 10까지의 합 부분에서

int s = 0//값을 누적시킬 변수

        for (int i = 1; i <= 10; i++) {

            System.out.print(i);

            if (i != 10)
                System.out.print('+');
            else
                System.out.print('=');
            
            s = s + i; //i값을 누적

            Thread.sleep(1000); // 1초씩 대기
        }
        System.out.printf("%d\n", s);
        
        //다른 방법(순서를 거꾸로함)
        s=0;
        int n=10;
        for(int i=n; i>=0; i--) { //i=10, 9, 8, 7,..., 0
            s=s+i;
        }
        System.out.println(s);

위의 for문은 초기식이 i=1, 조건식이 i<=10, 증감식이 i++(1씩 증가)로 되어있고, 실행문은 i를 출력(엔터치지 않음)하는데 i를 출력한 다음에 i가 10이 아니면 +를 출력하게 하고, 그렇지 않으면(10이면) =를 출력하게 하는 if문이 있다. 

 

또한 s=s+i라고 되어있는데 이 부분은 s=0이고 i=1이므로 0+1을 s에 대입한다,

그 다음으로 s=1이고 i=2이므로 1+2=3을 s에 대입한다.

그 다음으로 s=3이고 i=3이므로 3+3=6을 s에 대입한다.

그 다음으로 s=6이고 i=4이므로 6+4=10을 s에 대입한다.

...

마지막으로 s=45이고 i=10이므로 45+10=55를 s에 대입한다.

그러면 s=55이고, 이것이 1부터 10까지의 합이다. 

=이 나온 다음에는 s를 출력하라는 명령이 있으므로 1+2+...+9+10=55가 출력된다.

 

다른 방법을 보면 s=0이고 n=10으로 설정한 후 for문 초기식에 i=n, 조건식에 i>=0, 증감식에 i--(1씩 감소)로 되어있다. 이 방법은 10부터 1까지 거꾸로 더하는 방법이다. 

 

여기서 Thread.sleep(1000)이라고 입력했는데 이것은 1초씩 대기하라는 명령어이다. 참고로 Thread.sleep(1)은 1/1000초 대기하라는 명령어이고 이 명령어를 입력하면 에러가 뜨는데 다음과 같이 조치하면 된다.

에러가 난 상태에서 원인이 된 코드인 Thread.sleep(10)에 마우스를 갖다대면 위 그림처럼 창이 뜨는데 왼쪽에

Add throws declaration(위)과 Surround with try/catch(아래)가 뜰 것이다. 위에 있는 throws를 클릭한다. 

클릭했다면 InterruptedException이 뜨는데 중간에 있는 Exception을 클릭한다. 그러면 끝이다.

*Thread.sleep(1000)부분은 주석처리해도 무난하다.

 

다음은 각각 1부터 11까지의 홀수만의 합, 짝수만의 합을 구하는 프로그램이다. 

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
27
28
29
30
31
32
33
34
35
36
package mymain;
 
public class _3_for문2 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        // n까지 홀수의 합 구하기
        int s = 0// 값을 누적시킬 변수
        int n = 11;
 
        for (int i = 1; i <= n; i++) {
            // i<=n 만족하면 실행
            //i값을 누적
            if(i%2==1//홀수면 누적
            s = s + i;
        }
        System.out.printf("1부터 %d까지의 홀수들의 합: %d\n",n,  s);
        
        //n까지 짝수의 합 구하기
        s = 0// 값을 누적시킬 변수
        n = 11;
 
        for (int i = 1; i <= n; i++) {
            // i<=n 만족하면 실행
            //i값을 누적
            if(i%2==0//짝수면 누적
            s = s + i;
        }
        System.out.printf("1부터 %d까지의 짝수들의 합: %d\n",n,  s);
        System.out.println("참고: 1부터 10까지의 합은 55이다");
 
    }
 
}
 
cs

이 프로그램의 실행결과는 다음과 같다.

1부터 11까지의 홀수들의 합: 36
1부터 11까지의 짝수들의 합: 30
참고: 1부터 10까지의 합은 55이다

홀수를 2로 나누면 그 나머지가 1이고, 짝수는 2로 나누어 떨어진다(나머지가 0). 이 성질을 이용해서 for문 안에 

if문을 설정하고, 그 조건문에 2로 나눈 나머지가 1이면 홀수가 됨을 이용하고, 나머지가 0이면 짝수가 됨을 이용했다.

 

마지막으로 다음은 알파벳에 특정한 규칙을 주어 순서대로 출력하는 프로그램이다.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package mymain;
 
public class _3_for문3 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //A-Z까지 출력
        
                System.out.println("ABCD....XYZ");
                
                //A  B  C  D  E ...
                //65 66 67 68 69...
                
                //방법 1
                for(int i=65; i<91 ;i++) {// i=65, 66, ..., 90
                    System.out.printf("%c", i);
                }
                System.out.println();
                
                //방법 2
                for(int i='A'; i<='Z' ;i++) {// i='A', 'B', ..., 'Z'
                    System.out.printf("%c", i);
                }
                System.out.println();
                
                // 방법 3
                for (int i = 0; i < 26; i++) {// i=0, 1, 2, 3, ..., 25
                    System.out.printf("%c"'A' + i);
 
                }
                System.out.println();
                
                //대소대소대소
                //AbCdEfGh...
                for (int i = 65; i < 91; i++) {// i=65(A), 66(B), ..., 90(Z), 97(a), 98(b)
 
                    if (i % 2 == 1)// 홀수
                        System.out.printf("%c", i);// 대문자
                    else
                        System.out.printf("%c", i + 32);// 소문자
                }
                System.out.println();
                
                //0123456789012
                //AbcDefGhiJklM....(대소소대소소대소소)
                for (int i = 0; i < 26; i++) {// i=0, 1, 2, 3, ..., 25
                    
                    if(i%3==0)
                    System.out.printf("%c"'A' + i);
                    else
                    System.out.printf("%c"'A' + i+32);
 
                }
                System.out.println();
                
                //012-345-678-901-
                //ABC-DEF-GHI-JKL-...
                for (int i = 0; i < 26; i++) {// i=0, 1, 2, 3, ..., 25            
                    
                    if(i%3==2 && i!=0)
                    System.out.printf("%c-"'A' + i);
                    else
                    System.out.printf("%c"'A' + i);            
                }
                System.out.println();
 
    }
 
}
 
cs

이 프로그램을 실행하면 다음과 같이 출력된다.

ABCD....XYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
AbCdEfGhIjKlMnOpQrStUvWxYz
AbcDefGhiJklMnoPqrStuVwxYz
ABC-DEF-GHI-JKL-MNO-PQR-STU-VWX-YZ

위 코드에서 방법 1은 for문으로부터 알파벳의 아스키코드를 입력받아 문자로 출력하는 방법이 이용되었고, 방법 2는 for문에 알파벳 문자를 초기값과 조건값에 설정하는 방법이, 방법 3은 A문자에 0부터 25까지 더하는 방법이 이용되었다.

 

그 밑에서 3개의 줄에는 알파벳이 A부터 Z까지 다음의 규칙에 따라 출력되었는데

1. 홀수번째 알파벳은 대문자, 짝수번째 알파벳은 소문자

2. 3의 배수번째 알파벳(초기식은 i=0이다.)은 대문자, 그 나머지는 모두 소문자

3. 3으로 나눈 나머지가 2가 되는번째 알파벳(초기식은 i=0이다.) 뒤에 하이픈(-) 문자넣기

모두 for문 안에 if문을 넣어 나누기 연산의 성질(어떤 수를 어떤 수로 나누면 몫과 나머지가 존재)을 이용해서 if문의 조건문을 만들었다.

반응형

'Coding(Java) > Java(이론)' 카테고리의 다른 글

[Java] 11. do-while문, continue문  (0) 2021.08.30
[Java] 10.while문  (0) 2021.08.25
[Java] 8. switch문  (0) 2021.08.23
[Java] 7. if문  (0) 2021.08.23
[Java] 6. 시프트, 관계, 이진논리, 일반논리, 3항, 대입연산자  (0) 2021.08.20
Posted by skywalker222