'for'에 해당되는 글 1건

  1. 2007.07.23 제어문 (2) 1

3. for문
for은 반복문이라고 하여, 일정한 행위를 반복시키기 위한 구문이다. 이러한 반복은 수치에 의해 제어가 되는데, 이러한 방식은 다음과 같다
for(초기화영역;논리조건식영역;증감식영역){
반복실행될 구문 영역;
}
이러한 for 문의 사용법은 다음과 같이 여러방식으로 사용이 가능하다.
class Exam06_04 [
    public static void main(String[] args) {

       for(int i = 100; i <= 1000; i += 100) {          // ①
          ....
       }

       int i = 0;                                              // ②
       for(i = 100; i <= 1000; i += 100) {
          ....
       }

       int i = 100;                                           // ③
       for(; i <= 1000; i += 100) {
          ...
       }

       for(int i = 100, j = 200; i <= 1000; i += 100) {       // ④
          ...
       }

       for(int i = 100; ; i += 100) {                   // ⑤
          ...
       }

       for(int i = 100; true; i += 100) {             // ⑥
          ...
       }

       for(;;) {                                        // ⑦
          ...
       }
    }
}
① 번 방식
: 아주 기본적인 방식이다. 초기화를 100으로 잡아주고, 100이 100씩 커지면서 1000이 될때까지 반복하는 구문으로, for 문안에 ;로 구분한 3 영역이 모두 존재하는 방식

② 번 방식
: 역시, 기본적인 방식으로, 저레벨 렙업한 경우(-.-) 이다. 변수선언을 밖에서 해주었지만, for문 안에서 초기화 값을 잡아주며, ①번 방식과 동일해졌다.

③ 번 방식
: 초기화를 for문 밖에서 잡아주는 방식으로, for문 안에서 초기화를 잡아주는 영역을 공란으로 표시했다. 이때 주의할 점은, 공란 이후에 ; 를 꼭 집어넣어줘야 한다는 점. 그리고, 밖에서 변수 선언 및 초기화를 해주었기 때문에, 이는 for문에만 국한 된 것이 아닌 프로그램 전체에 국한이 되어 사용되어 진다는 점이다.

④ 번 방식
: 초기화 부분에, 두가지 변수를 동시에 초기화 시켜줄수 있다. 단, 초기화 시킬 자료형은 동일해야 하며, 여기서는 int 형으로 동일시해주었다.

⑤ 번 방식
: for문의 가운데 해당되는 부분은 논리 조건식 영역으로, 이 부분이 항상 참이면, for문은 항상 실행을 하게 될 것이다. 이를 우리는 무한 루프라고 부르는데, 가운데 논리 조건식 영역을 비워버리면, 이 for문은 항상 true 라는 값을 가지게 되고, 이는 이 for 문을 무한루프로 만들어 버리는 결정적인 역할을 부여해준다.

⑥ 번 방식
: ⑤번 방식과 마찬가지인데, 여기서는, 가운데, 논리 조건식 영역에, true 라는 값을, 아예 박아 놓아, 이 for 문을 무한 루프 시켜버리고 있다.

⑦ 번 방식
: 이 방식은, 아무것도 설정을 해놓지 않는 방법으로, 이 역시 무한 루프를 돌리는 또 다른 방법이다. 아무것도 설정을 해놓지는 않았지만, ;; 는 꼭 써놓아야 한다.

다음은 for 문에서 사용되는 break; 와 continue; 의 예시이다.

1//    class Exam06_05 {
2//        public static void main(String[] args) {
3//           for(int i = 1; i < 5; ++i) {
4//              if(i == 2) {
5//                 break;
6//                 // continue;
7//              }
8//                   System.out.println("*");
9//           }
10//        }
11//    }

5번째 라인
: break; 는 switch 문에서도 잠깐 살펴봤지만, if문을 제외한 가장 가까운 블록을 탈출시키라는 의미를 가지고 있다고 했었다. 즉, 여기서는, i값이 1일때 *를 한번 찍고, 2로 올라가면서 for문을 빠져나가도록 하는 역할을 해주고 있는게 여기서 break; 가 하고 있는 역할이다.

6번째 라인
: continue; 는 if 문을 제외한 가장 가까운 블록 끝으로 이동시키라는 의미를 가지고 있다. 여기서는, i 값이 1일때 *를 한번 찍어주고, 2일때는, if 문을 제외한 for문의 끝 블록 } 으로 이동, 8번째 라인의 *표를 찍는 구문을 실행시키지 않고, 3일때와 4일때, 다시 *표를 찍어주라는 이야기가 된다. 총 3개의 *가 찍히게 된다.

switch 를 제외한 다른 제어문과 마찬가지로, 이 for 문도 여러번 사용될수가 있으며, 이를 다중 for 문이라고 한다.
다음은 다중 for문의 예제이다.
1//    class Exam06_06 {
2//        public static void main(String[] args) {
3//           for(char a ='A'; a <= 'Z'; ++a) {
4//              System.out.print(a + " : ");
      
5//              for(char b = 'A'; b < a; ++b) {
6//                 System.out.print(" ");
7//              }
         
8//              for(char c = a; c <= 'Z' - (a - 65); ++c) {             // ①
9//              // for(char c = a; c <= 'Z'; ++c) {                       // ②
10//              // for(char c = 'A'; c <= 'Z' - (a - 65); ++c) {      // ③
11//              // for(char c = 'A'; c <= 'Z'; ++c) {                    // ④
12//                 System.out.print(c);
13//              }
14//                 System.out.println();
15//           }
16//        }
17//    }
위의 예제는 다중 for문을 사용함으로써 나타낼수 있는 여러가지 형태를 보여주고 있다. 이러한 다중 for문은, 행렬에 빗대어 생각할수가 있는데, 첫번쨰 for 문이 사용된 3번째라인은, 행에 해당되는 부분이며, 그 안에 사용된 for문들을 열에 해당된다고 할수가 있다.

8번째 라인 ~ 11번째 라인
: 여기는 가능한 여러 형태의 for문으로 보여주고 있다. 8번째 라인 대신, 9번째 라인이, 혹은 10번째 라인이, 혹은 11번째 라인의 for문을 작성할수가 있는데, 먼저, 8번째 라인의 for문을 사용하면 어떻게 되는지 보면 다음과 같다.
사용자 삽입 이미지

9번째 라인의 for 문을 보자.

사용자 삽입 이미지

10번째 라인의 for문은 이렇다.

사용자 삽입 이미지

11번째의 for문은 이렇다.

사용자 삽입 이미지

8번째 라인의 for문을 사용해서 모래시계 형태로 알파벳을 출력시키는게 가능하다.
1//    class SandClock {
2//        public static void main(String[] args)    {
3//           for(char a = 'A'; a <= 'M'; ++a) {
4//              System.out.print(a + " : ");
      
5//              for(char b = 'A'; b < a; ++b) {
6//                 System.out.print(" ");
7//              }
      
8//              for(char c = a; c <= 'Z' - (a - 65); ++c) {
9//                 System.out.print(c);
10//              }

11//              System.out.println();
12//           }

13//           for(char d = 'N'; a <= 'Z'; ++d) {
14//              System.out.print(d + " : ");

15//              for(char e = 'N'; e > d; --e) {
16//                 System.out.print(" ");
17//              }

18//              for(char f = d; f >= 'Z' - (d-65); --f) {
19//                 System.out.print(f);
20//              }

21//              System.out.println();
22//           }
23//        }
24//    }
3번째 라인 ~ 12번째 라인
: 이 부분은, 역 삼각형 모양이 된다. 만약 첫번째 for 문이 없다면, 각 출력문장마다 붙는 A :, B : 이런 부분을 없앨수 있지만, 걍, 놔두었다.

첫번째 for 문에서, 반복을 'M' 이 될때까지만 실행되도록 설정을 해놓았고, 이 지점은, 역삼각형이 완료되는 바로 그 지점이 된다.

13번째 라인 ~ 21번째 라인
: 이 부분은, 역 삼각형 모양이 끝나는 지점부터, 정 삼각형 모양을 출력하는 소스코드이다. 반복을 M에서 끝나게 했으니, N부분에서부터 반복을 다시 시작하게 해주었으며, 역삼각형으로 출력할때는, 역삼각형에서 시작부분부터, 끝부분까지, 양쪽으로 감소시키며 들어갔으나, 이 부분에서는, 정삼각형으로 출력하면서, 정삼각형 시작부분부터, 끝부분까지 양쪽으로 증가시키며 출력을 해나간다.

고로, 역삼각형 코딩부분의 5번째 라인 ~ 7번째 라인, 8번째 라인 ~ 10번째 라인이, 정삼각형 코딩부분의 15번째 라인 ~ 17번째 라인, 18번째 라인 ~ 20번째 라인에서 원칙적으로 반대로 작성이 된다. 증감영역에서 증가를 시켜주었던 것이, 감소를 시켜주는 방향으로, 작을때까지가 클때까지로등으로, 구문이 작성이 되어야 한다.(무슨 말인지 원통....어차피 나혼자만 알아들으면 되니까.. -0-)

이상을 출력하면 다음과 같이 된다.

사용자 삽입 이미지

반복문중에는 Label 이라는 구문을 사용하는 문장도 있다. 다음과 같은 문장에서 말이다.
1//    class Exam06_07 {
2//        public static void main(String[] args) {
3//          aaa : for(int i = 0; i < 5; ++i) {
4//                      bbb : for(int j = 0; j < 5; ++j) {
5//                                  if(j == 2)
6//                                     break;
7//                                     continue;
8//                                     break aaa;
9//                                     continue aaa;
10//                                  {
11//                                      break;                  // 에러
12//                                      System.out.print("*");
13//                                  }
14//                               }
15//                      System.out.println();
16//                   }
17//        }
18//    }
여기서 몇가지 처음보는 구문들이 있을 것이다.

바로 3번째 라인 과 4번째 라인일텐데, 여기서 사용된 것들이 바로 Label 이라는 기능이다.

3번째 라인 ~ 4번째 라인
: 첫번째 for문에 Label aaa 를 붙여 주었다. 이것은 첫번째 for 문을 aaa 라는 이름으로 지정해주겠다는 의미이다. 4번째 라인도 마찬가지다. 두번째 for 문을 bbb 라는 이름으로 지정해주겠다는 의미이다.

6번째 라인 ~ 9번째 라인
: 여기서 사용된 4줄의 문장을 모두 작성한다면, 이 프로그램은 에러가 발생한다. 즉, 4문장중, 한문장만 상황에 맞게 사용하라는 이야기다.

6 번째 라인에서 break; 를 사용하였기에, 이것은, if 를 제외한 가장 가까운 블록을 벗어나라는 이야기이다. 즉, 두번째 for문에 의해 j가 0일때 * 하나, 1일때 * 하나 찍어주고, 2일때는, 가장 가까운 블록에 해당되는 문장, 즉 두번쨰 for 문을 벗어나서, 첫번째 for 문을 실행시키라는 의미이다. 이는 다음과 같이 찍히게 된다.
**
**
**
**
**
7 번째 라인에서는 continue 문이 사용되었다. continue; 는 if문을 제외한 가장 가까운 마지막 블록 } 로 이동하라는 의미이다. 즉, 여기서는, j가 0일때 * 찍고, 1일때 * 찍고, 2일때는, if 문을 제외한 가장 가까운 마지막 블록, 즉 두번째 for문의 끝 블록 } 으로 이동하고, 다시 j가 3일때 * 찍고, 4일때 *를 찍어주게 된다. 이는 다음과 같이 찍히게 된다.
****
****
****
****
****
8 번째 라인에서, 사용된 break aaa; 는 aaa 라는 Label 을 가진 블록, 즉 첫번째 for 문을 탈출하라는 의미이다. 여기서는, j가 0일때 *, 1일때 * 찍고, 2일때는 aaa 라는 Label 을 가진 블록, 즉 첫번째 for문을 탈출하고, 바로 종료가 되어버리는 프로그램이다.
**
9번째 라인에서, 사용된 continue aaa; 는 aaa라는 Label 을 가진 블록, 즉 첫번째 for 문의 마지막 블록 } 으로 돌아가라는 의미가 된다. 즉, 두번쨰 for 문에서 j가 0일때 *, 1일때 * 찍고, 2일때는, aaa라는 Label 을 가진 블록, 즉 첫번째 for 문의 마지막 블록 } 으로 넘어가서, i 값을 하나 증가 시키고, 두번째 for문을 또 실행시킨다. 이렇게 되면, 결국 15번째 라인의 System.out.println(); 이 실행될수 없게 된다.
**********
11 번째 라인에서도, break; 문을 작성해주었는데, 이렇게 작성이 되면 에러가 발생하게 된다. 이유는 if문의 {} 안에서, 그것도 처음으로 사용이 되어졌기 때문이다. 그래서, if 안의 실행문인, System.out.print("*"); 부분을 실행시킬수 없다며, 에러가 발생한다.

Label 은 제어문에게 이름을 주고, 그 이름을 이용하여, 직접 이동시켜 실행시켜주는 역할을 하고 있으며, 루프문에서 주로 사용되지만, 그렇게 많이 사용되지는 않는듯싶다.


p.s 위의 글들은, 김승현 강사님열혈강의 Java Programming 의 Round 6-3, 4, 동영상 강좌에 기초한 내용입니다.
:

BLOG main image
아무거나 공부하자!!! by Young79

공지사항

카테고리

분류 전체보기 (79)
Programing (29)
English (31)
Graphic (4)
Saying on T"We"tter (15)

최근에 올라온 글

최근에 달린 댓글

글 보관함

달력

«   2024/05   »
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
Total :
Today : Yesterday :