국비지원학원/Java

23일차

초코맛 2018. 11. 21. 01:31
반응형
*제어문
-switch~case
*반복문
-for
*분기문
-break, continue




*제어문 
  •  프로그램의 순차적인 흐름 변경(조건문-if/switch~case/반복문/분기문)
-switch~case 
switch(변수명){
case 상수 : 실행될 코드 ; [break;]
                      ...
default : 상수와 같은 값이 아닐때 실행될 코드;
}
  • =>일치하는 수를 찾아 그전까지의 코드를 건너뛰고 그아래로 내려온다.
  • =>상수에는 음수도 포함되는데, 변수의 데이터형에 크기와 타입에 따라 달라지게된다. (int로 음수까지 생각했을때 42억여개까지)
  • =>수는 섞어사용해도 상관없으나 작은값~큰값순인 오름차순이 보기에 좋다. 아니면 특정수를 뛴다면 (규칙을 가진 증가값) 그것도 좋음
  • =>Flow chart는 다중if 형태를 띄지, 다 같은층을 가진 플로우차트로 그리지 않는다..
  • =>break를 만나면 switch를 나감
  • ex) 성적에 대한 학점
===>100~90 - A  /  89 ~ 80 - B  /  79 ~ 70 - C  /  69 ~ 60 - D  /  59 ~0 - F

switch (변수명){
caes 100 : garde = 'A'; break;
caes 99: garde = 'A'; break;
caes 98: garde = 'A'; break;
caes 97: garde = 'A'; break;
caes 96: garde = 'A'; break;
...
default : 
 


========>
     이렇게
       가능
//바꾸는게 좋겠다 주석만
//바꾸면 내 일..ㅠ
switch (변수명){
caes 100 : 
caes 99: 
caes 98: 
caes 97: 
caes 96: garde = 'A'; break;
...
정수/정수=정수이므로 변수O
switch (변수명/10){
caes 10 : 
caes 9: garde = 'A'; break;
caes 8: garde = 'B'; break;
caes 7: garde = 'C'; break;
                 ...
default : grade = 'F'; break;
}
===>해당문제의 flow chart)

 

<패키지명은 원래는 역주소도메인..우리는 편의상.. 나중에 여러일 해야하면..

 

===>해당문제 소스코드
package day1120;
/**
* switch~case를 사용한 학점 구하기
* @author owner
*/
public class TestSwitchCase2 {
     
     public static final int GRADE_A_PLUS=10;
     public static final int GRADE_A=9;
     public static final int GRADE_B=8;
     public static final int GRADE_C=7;
     public static final int GRADE_D=6;
     public static void main(String[] args) {
           
           int score = 109; //<score/10의 문제는 101~109까지 10이  나온다는것
           //<ㄸㄹㅇ 가 쓴다고 생각하고 유효성 검증..
//         char grade = ' ';    //char는 문자를 저장한다. ''는  문자가 없다 라는것으로
                                //' '공백문자(white space)-  unicode \u0000(~\uFFFF)
                              //<코드셋에 존재하지 않아 들어가지  않는다.Error
                              //<(int)Character.MIN_VALUE =  \u0000  MAX_VALUE = \uFFFF
          //<System.out.println((int)Character.MIN_VALUE+"/"+Character.MIN_VALUE)
           char grade=64;
           
           //case의 상수는 가독성이 떨어지기 때문에 Constant를  사용하려 한다..
           if(0<=score && score<=100) {
                switch(score/10) {
     /*         case 10 :
                case 9 : grade = 'A'; break;
                case 8 : grade = 'B'; break;
                case 7 : grade = 'C'; break;
                case 6 : grade = 'D'; break;
          default : grade = 'F';     */
          //break; default는 아랫줄에 실행될 코드가 없으므로  분기문을 사용하지않는다. 줄일수있닷
                
                case TestSwitchCase2.GRADE_D: grade++;     //64->65
                case TestSwitchCase2.GRADE_C: grade++;     //65->67
                case TestSwitchCase2.GRADE_B: grade++;
                case TestSwitchCase2.GRADE_A:
                case TestSwitchCase2.GRADE_A_PLUS:  grade++;break;  //<이렇게 해야 가독성이 좋은 코드
                default : grade+=6;
                //<a=65,b=66 ~ F=70
                //<break 있는 위의 코드가 이경우에서는 더 좋다.  한줄하고 나가니깐, 여러줄수행 안해서
                //<case i 는 변수라 안돼고 상수를 쓰면 가독성이  떨어진다. constant를 넣어주는게 좋다.
                //<6이 무언지 7이 무언지 알수 없어서?=>나쁜코드
                
                }//end switch
           
                System.out.println(score +" 점의 학점은  "+grade);
           } else {
                System.out.println("점수는 0~100점 사이만 입력  가능!!! 입력점수["+score+"]");
           }
     }//main
}//class
=>스위치 자체가 가독성이 떨어져 상수의 좋은 사용이 중요


*반복문
  • <사람이 하기 번거로운걸 하기에 얘만한게 없당
  • 코드의 실행을 여러번 반복해야 할때
  • for, while, do~while (looping문이라고도..)
  • <조건을 잘못주엇을때 무한루프 주의=> 인터럭트interuct
  • for : 시작과 끝을 알때
  • while(do~while) : 시작과 끝을 모를때 (do는 꼭 한번은 실행해서 PL/SQL 의  loop와 동일)
  • 조건을 잘못 부여하면 무한루프에 빠지게 된다.
  • <일부러 주는 경우도 있다 ex)시계, 서버, (가용성,신뢰도 문제)
  • 반복문을 빠져 나갈때는 분기문인 break를 사용
  • 반복문의 수행을 건너뛸때에는 분기문인 continue 사용.
-for
  • 시작과 끝을 알때
  • <단일 for, 다중 for를 쓰기도 한다.
  • 문법) 
          for(초기값; 조건식; 증/감소식) {
                  반복수행 문장;
          }
  • {}생략도 가능한데, 반복수행 문장이 1문장이라면 생략가능
  • 초기값-조건식-반복수행-증감소식-조건식-반복수행-증감소식-조건식 순서로 반복=> 조건이 맞지않으면 for문 나감
  • ex)
  • for (int i=0; i<5; i++){
  •       System.out.println(i);
  • }
  • <    =>0부터 5까지 어떻게 가야하지 하는게 for
  • <index놀음, 잘관리하기 위해 사용..
  • ex) for 문의 flow chart


=>정보처리에서의 switch의 flow chart

  • ex)문제와 for문 flow chart 설명
=>flow chart

=>설명

  • ex)
package day1120;
/**
* for : 시작과 끝을 알 때 사용하는 반복문
* 문법 : for(시작값; 끝값; 증가|감소식)
*          반복 수행 문장;
*      }
* @author owner
*/
public class TestFor {
     public static void main(String[] args) {
           //0~에서부터 10보다 작을 때까지 반복수행하는 for
           for(int i=0; i<10; i++) {
                System.out.println(i+"번 안녕 ");
           }//end for
           
           //1에서 부터 1씩 증가하며 100까지 반복수행 하는 for
           //<반복문에서 i<=100쓰면 작은지1번 같은지2번 더  하게되어서 가급적이면 i<101이 좋다.요즘HDD가 좋아져서..별차이가  없김함..
           for(int i=1; i<101; i++ ) {
                System.out.println(i);
           }//end for
           
           //1에서 부터 1씩 증가하며 100까지 짝수만 옆으로 출력  for
           for(int i=1; i<101; i++ ) {
                if(i%2==0)
                     System.out.print(i+" ");
           }//end for
           System.out.println(); //<위에서 줄안건너서 그냥  건너,아무것도 없이도 가능 맞았당~
           
           //1에서 부터 100까지 홀수만 옆으로 출력
           int cnt = 0;
           for(int i=1; i<101; i++ ) {
                cnt++;
                if(i%2==1)
                     System.out.print(i+" ");
           }//end for
           System.out.println("\n"+cnt+"번");
           
           
           //1에서 부터 100까지 홀수만 옆으로 출력
           int cnt1 = 0;
           //증/감소식은 변수에 값을 변화시키고 유지시킬수 있는  모든 연산자를 다 사용할 수 있다.
           //< i++ 후위연산 = i+=1 = i=i+1 => 이렇게 사용함으로  절반으로 줄었다.
           //<i&=2  i^=2 도 다 상관은 없다. 단지 돌뿐..가장  적합한걸 쓰면된다.
           for(int i=1; i<101; i+=2 ) {
                cnt1++;
                     System.out.print(i+" ");
           }//end for
           System.out.println("\n"+cnt1+"번");
           
           //1~100까지 출력하기 3의 배수 마다 숫자대신 "짝"을 출력
           for(int i=1; i<101; i++) {
                if(i%3==0) {
                     System.out.println("짝");
                }else {
                     System.out.println(i);
                }//end if            
           }//end for
           
           //1~100까지의 합 출력 : 1에서 부터 100까지의 합은 5050
           int sum=0;
           for(int i=1; i<101; i++) {
                sum=i+sum;
           }//end for
           System.out.println("1에서 부터 100까지의 합은 "+sum);
                
           //A~Z까지 출력
           for(char i=65; i<91; i++) {
         //for(char c ='A'; c<='Z'; c++) 도 가능
           //for(int i=65; i<91; i++) => (char)c로 출력
                System.out.println(i);
           }//end for
           
           //for 에서 1~9까지 구구단2단
           for(int i=1; i<10; i++) {
                System.out.println("2*"+i+" = "+ 2*i);
           }//end for
           
     }//main
}//class



-다중for


 
  • for문 안에 for문 정의
  • 문법)
for(초기값; 조건식; 증,감소식){
    //단일 for 영역
        for(초기값; 조건식; 증,감소식){
            //다중 for 영역-밖의 인덱스와 있는곳의 인덱스를 다 쓸수 있다.
        }
    //단일 for 영역
}

 
  • ex)


for (int i=0; i<2; i++){
     for (int j=0; j<3; j++){
          system.out.println(i + " " +j);
     }
}


i   j
0   0
0   1                                       밖에서 들어오면 안에for 가 여러번 돈다
0   2                                       한번돌떄 안이 얼마나 도는지 잘세면 된다.
1   0
1   1
1   2
<flow chart에서 길때>

 
  • ex)
 
package day1120;
/**
* 다중 for : 인덱스를 여러개 사용해야하는 경우
* 문법) for(시작값; 끝값; 증가,감소식){
*           for(시작값; 끝값; 증가,감소식){
*             반복수행문장들;
*          }
*      }
*
* @author owner
*/
public class TestFor1 {
     public static void main(String[] args) { //<실행해서  결과볼꺼니까 메인
           for(int i=0; i<6; i++) {
                //<단일for의 영역으로 안의 for문 돌기 전에 출력할  것 적는다.
                for(int j=0; j<7; j++) {//다중for <쓸떄 안쪽  변수는 밖의 인덱스 변수명과 달라야 한다.
                     System.out.println("i : "+i+", j : "+j);
                }//end for
                //<단일 for 영역
                System.out.println("==============");
           }//end for
           
           //구구단 전단 출력
           for(int i=2; i<10; i++) {  //단
                System.out.println(i+"단 시작");
                for(int j=1;j<10; j++) {
                     System.out.println(i+"*"+j+" = "+i*j);
                }
                System.out.println(i+"단 끝");
           }//end for
           
//         ijijijij
//         00
//         1011
//         202122
//         30313233
           for(int i=0; i<4; i++) {
                for(int j=0; j<i+1; j++) {
                     System.out.print(i+""+j);
                }
                System.out.println();
           }//end for
           
           System.out.println("============");
           
//         ijijijij
//         121314
//         2324
//         34
           for(int i=1; i<4; i++) {
                for(int j=i+1; j<5; j++) {
                     System.out.print(i+""+j);
                }
                System.out.println();
           }//end for
                     
     }//main
}//class




-다양한for

    -무한 loop
  • 종료되지 않아야하는 program 작성(시계, 서버)
  • <증가하는 수를 세거나 그냥 루프
  • 무한 loop 문법
for( ; ; ){
    반복 수행 문장;
}
    -증가하는 수를 세는 무한 loop
for (초기값; ; 증,감소식) {
}
//여기에 코드가 있어도 실행될수없다=>Error
  • 무한 loop 아래쪽의 코드는 정상적으로 실행될 수 없기때문에 코드 작성하면 Error발생
  • <분기문이 있으면 무한루프라 할수 없다.
    -초기값을 여러개 설정 하는 for
for(초기값, 초기값; 조건식; 증감소식,,,){
}
ex)
for(int i=0; j=0; k=10; i<10; i++, j--,k+=2){
}
  • 이떄 처음나오는쪽에만 데이터형을 적고 뒤엔 적지않는다.Error
  • 변수중 하나로만 조건식, 그리고 조건식은 단 하나만 갖는다
    -개선된, 향상된 for loop
  • <여태까지는 처음에 나왔던 for / JDK1.5버전부터는 향상된 for 문이 있다.
  • JDK 1.5에서 추가된 문법
  • 이전엔 인덱스를 얻기위해 사용했으나 얘는 인덱스를 사용할수 없다.
  • <배열(=PL/SQL의 table_순차적으로 나열하여 쓰기위해서(자바는 동일데이터를))  
  • Array, Collection(List, Set) 의 모든방(0~끝방)의 값을 출력하기 위해 제공되는 for
  • 많은 양의 데이터를 출력할때, 기존의 for보다 느리다.
  • 문법)
for(데이터형의 변수명 : 배열명|collection명 ){
            변수명;    //배열,collection의 방의 값이 저장된다.
}

for (int i: arr){    //i는 방
    system.out.println(i);
}
for (int i=0; i<arr.length; i++){    //i는 인덱스
    system.out.println(i);
}
  •  i arr)
10
20
300
15
  •  i arr 배열
  • =>이 하나하나 방을 방,요소, Element
  • =>속도는 훨씬 느리나 훨신 간단해서 많이 사용

<JDK 1.5에서 추가된 문법이라 컴파일러를 하위버전으로 변경한 뒤에 실행하면 이런 설명이 뜬다.(Error)


 

  • ex)다양한 for
package day1120;
/**
* 다양한 for의 형태
* @author owner
*/
public class TestFor2 {
     public static void main(String[] args) {
           //무한 loop
//         for( ; ; ) {
//              System.out.println("무한 loop");
//              //자원이 고갈될때까지
//         }//end for
//         System.out.println("");//Error
           //증가하는 수를 세는 무한loop
//         for(int i=0;;i++){
//              System.out.println("무한 loop" + i);
//         }//end for
//         //마찬가지로 여기에 코드오면 Error
           
           //증가하는 수를 세는 무한loop일때 break
           for(int i=0; ;i++) {
                System.out.println("무한 loop" + i);
                if(i==50) {
                     break;     //가장 인근에 존재하는 반복문을  빠져 나간다.
                }//end if
           }//end for
           System.out.println("");    //여기는와도 에러나지  않는다.
           //break를 쓸떄는 if문이 붙어 있지 않으면 그냥 막 나가  버려서 => break는 꼭 조건문과 함께 사용!!
           //특정 조건을 만족하면 나가라~~그런,
           
           
           //증가하는 수를 세는 무한loop일때, if위치 바꾸어 보고,  i변수가 밖으로 나가지 않는걸 봄..
           //int i=0;
           for(int i=0; ;i++) {
                System.out.println("무한 loop" + i);
           //}//end for
                if(i==50) {
                     break;     //가장 인근에 존재하는 반복문을  빠져 나간다.=>Error if만이면 반복문없어서?
                }//end if
           System.out.println("");
           }//end for
           //for 에 i를 쓸때는 선언하지 않는다. HDD가 워낙에 빨라  ???
           
           //여러개의 초기값을 사용하는 for
           for(int i=0,j=10,k=30; i<10 && j==30; i++,j++,k--) {
                //<그냥은(컴마로는) 쓸수없고 &&연산자로 i<10 &&  j==30 붙여줄수 있다.
                System.out.println(i+" "+j+" "+k);
           }//end for
     
     
           //조건식을 잘못 설정하면 무한loop
//         for(int i=0; i<10; i--) {
//              System.out.println(i);
//         }//end for 조건은 주었으나 조건에 맞는 코드가 아니라  무한루프.
           
           
           int i=0;
           for(i=0;i<10;i++);{  //<세미콜론이 들어있어 가장  마지막 값을 보긴한다.(지역변수라 가능한듯)
                System.out.println("반복문 " +i);//이렇게  세미콜론을 잘못 쓰는 경우가 발생하기도 한다.
           }//<중괄호가 인스턴스 영역이라는걸 나중에 알게된다.
           
     }//main
}//class

  • ex) 향상된 for 문
package day1120;
import java.util.ArrayList;
import java.util.List;
/**
* 개선된/향상된 for : 배열이나 Collection들의 모든 방의 값을  처음부터 끝까지 순차적으로 출력하기 위해 제공되는 for.
*                 개선된 for문은 JDK1.5에서부터 사용가능, 그때  나왔다
* 문법) for(데이터형 변수명 : 배열명(Collection명)) {
*           변수명;(배열(Collection)방의 값을 사용할수  있다.)
*      }
*     // 인덱스는 쓸수 없다.
* @author owner
*/
public class ImprovementFor {
     public static void main(String[] args) {
           
           int[] tempArr= {2018,11,20,16,5};    //05는 8진수
           
           //이전의 for로 모든 방의 값을 출력
           for(int i=0; i<tempArr.length; i++) {
                System.out.println(tempArr[i]);
           }//end for
           
           System.out.println("--------------개선된  for---------------");
           
           //개선된 for 로 모든 방의 값 출력
           for(int value : tempArr) {
                System.out.println(value);
           }//end for 끝방부터 찍어라 이런거 못함 짝수번째  이런것도 ㄴㄴ무조건 처음부터 끝까지
           
           //Collection인데 list? <나중에 JCF할때??
           List<Integer> list = new ArrayList<>();     //<1.7이상..
           list.add(10);
           list.add(20);
           list.add(110);
           list.add(1);
           list.add(1000);
           System.out.println("==============List 이전     for==============");
           for(int i=0; i<list.size(); i++) {
                System.out.println(list.get(i));
           }//end for
           
           System.out.println("==============List 향상된  for==============");
           for(int i : list) {
                System.out.println(i);
          }//end for
           //<이전의 기본 for와 향상for문은 결과는 같다. 코드의  간편함이 다름
           
     }//main
}//class


*분기문
  • break
  • continue : 반복문의 실행을 건너 뛸때 사용
    -Continue
  • 반복문의 실행을 건너 뛸떄 사용
  • ex)
for(int i=0; i<10; i++){ 
      //if() 
      continue;
      system.out.println(i);
      //continue;
}//=>Error 
  • <항상 if랑 함께쓰고 물어서 그조건을 만족할때 건너뛰어야하고
  • <아래쪽에 적을시에는 건너뛸게 없어서 아무소용이 없게된다.
  • 조건문으로 묶어서 사용
  • 반복수행코드 위에 정의한다. (아래면 쓰나마나 아무런 역할 못함)
  • break는 빠져나가고 , continue는 건너뜀
  • ex)
package day1120;
/**
* continue : 반복문내의 반복 실행 코드의 수행을 건너 뛰는 일.
*    
* @author owner
*/
public class TestContinue {
     public static void main(String[] args) {
            //0~100까지 홀수만 출력하고 싶을때
            for(int i=0; i<100; i++) {
                 //System.out.println("i ="+i); <반복수행코드  사이에 들어갈수도 있다.가능..
                 if(i%2==0){
                      continue;
                 }//end if
                      
                 //continue;//<이것만 있으면 아래코드를 무조건  건너 뛰어서  Error
                 System.out.println("i ="+i);
                 //continue;//아래쪽에 코드가 없어서 건너뛸게  없어 실행시 똑같이 나온다.
            }//end for
           
     }//main
}//class


<<<숙제>>>
package day1120;
/**
*
* @author owner
*/
public class Work18 {
     public static void main(String[] args) {
//         숙제 1.
//         구구단 출력 (flowchart 그리고 )
//         2x1=2    3x1=3  4x1=4  ...            9x1=9
//         .
//         .
//         .
//         2x9=18                                     9x9=81
           for(int i=2; i<3; i++) {
                for(int j=1; j<10; j++) {
                     System.out.println(i+"x"+j+" = "+(i*j)+"     "+
                                (i+1)+"x"+j+" = "+((i+1)*j)+"     "+
                                (i+2)+"x"+j+" = "+((i+2)*j)+"     "+
                                (i+3)+"x"+j+" = "+((i+3)*j)+"     "+
                                (i+4)+"x"+j+" = "+((i+4)*j)+"     "+
                                (i+5)+"x"+j+" = "+((i+5)*j)+"     "+
                                (i+6)+"x"+j+" = "+((i+6)*j)+"     "+
                                (i+7)+"x"+j+" = "+((i+7)*j)+"     "    );
                }
           }
          System.out.println("=====================2번=============================");
//         숙제2.
//         0 0
//          1 0 1 1
//            2 0 2 1 2 2
//              3 0 3 1 3 2 3 3
           for(int i=0; i<4; i++) {
                for(int j=0;j<=i;j++) {
                     System.out.print(i+" "+j+" ");
                }
                System.out.println();
                for(int j=0;j<=i;j++) {
                     System.out.print("  ");
                }
           }
            
            
     }//main
}//class


 

 

반응형

'국비지원학원 > Java' 카테고리의 다른 글

25일차  (0) 2018.11.23
24일차  (0) 2018.11.23
22일차  (0) 2018.11.21
21일차  (0) 2018.11.21
20일차  (0) 2018.11.18