• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Java 정리 06

20 Nov 2018

Reading time ~7 minutes

Java 정리 06 - switch, 반복문 for


switch case

  • 특정 case만 사용하고 빠져나갈 때 분기문 break; 사용
    • break 는 필수아닌 옵션
    • case별로 break를 넣는게 처리행수를 줄이기 때문에 좋음
  • case값은 작은값에서 큰값순으로 배치하는게 좋음
    • 또한 규칙이 있는 증가값을 갖는게 좋음
swtich(변수명) {
    case 상수 : 
        // 실행될 코드 
        break; 
    ...

    default :
        // 상수와 같은 값이 아닐 때 실행될 코드
}
// switch~case를 사용한 학점 구하기
// 100~90점은 A, 89~80점은 B, 79~70점은 C, 69~60은 D, 59~0 F 학점을 부여
public class TestSwitchCase {
     
     public static void main(String[] args) {

           // char는 공백문자(white space)로 초기화
           // 공백문자 unicode '\u0000', 코딩으로 직접 쓸순 없다           // ''는 문자없음, error
           char grade = ' ';
           int score = Integer.parseInt(args[0]);
           
           // 자바에선 정수/정수 = 정수
           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';
           }
           System.out.println(score+"점은 "+ grade+" 학점");
     }
}

01

// 위에 코드를 ASCII를 사용해서 아래같이 짤 수도 있다
public class TestSwitchCase2 {
     public static void main(String[] args) {

           int score = 96;
           char grade = 64;

           // ASCII
           // 65-A, 66-B, 67-C, 68-D, 69-E, 70-F
           switch(score/10) {
           case 6: grade++; // 68
           case 7: grade++; // 67
           case 8: grade++; // 66
           case 9:
           case 10: grade++; break; // 65 - A
           default: grade+=6;   // 70 - F
           }
           
           System.out.println(score + "점은 " + grade + "  학점");
     }
}
// 이렇게 구현 시 가독성이 많이 떨어짐(6이 뭔데? 7은? 8은?..) = 나쁜코드
// case에 변수 못 들어옴, 상수를 쓰면 가독성이 떨어짐  -> Constant를 사용
// switch~case에는 상수보단 Constant를 넣어 가독성을 높이는게 좋은 코드!
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 = 96;
           char grade = 64;
           
           // case의 상수는 가독성이 떨어지기 때문에
           // 읽기 편하도록 Constant를 사용
           switch(score/10) {
           case TestSwitchCase2.GRADE_D: grade++; // 68
           case TestSwitchCase2.GRADE_C: grade++; // 67
           case TestSwitchCase2.GRADE_B: grade++; // 66
           case TestSwitchCase2.GRADE_A:
           case TestSwitchCase2.GRADE_A_PLUS: grade++; break; //  65 - A
           default: grade+=6;   // 70 - F
           }
           
           System.out.println(score + "점은 " + grade + "  학점");
     }
}
// if문으로 유효성 검사를 할 수 있다
if (score <= 100 && score >= 0) {
     ...
} else {
     System.out.println("점수는 0~100점 사이만 입력  가능");
}

반복문

  • 코드의 실행을 여러번 해야 할 때 사용
  • for, while, do~while
    • for - 시작과 끝을 알 때 사용
    • while - 시작과 끝을 모를 때 사용
      • while은 0~n번 수행
      • do ~while - while과 다르게 최소 1번은 수행
  • 조건을 잘못 부여하면 무한LOOP에 빠지게 됨

for

  • 시작과 끝을 알 때 사용
  • 비교식에 <= 는 작은지 한번 같은지 한번 두번 묻는다!
    • 추가연산발생하므로 가급적이면 <, >사용

02

for (int i=0; i<5 ;i++) {
    System.out.println(i);
}
// i는 0, i<5와 비교 참, 0 출력, i++
// i는 1, i<5와 비교 참, 1 출력, i++
// i는 2, i<5와 비교 참, 2 출력, i++
// i는 3, i<5와 비교 참, 3 출력, i++
// i는 4, i<5와 비교 참, 4 출력, i++
// i는 5, i<5와 비교 거짓, 반복문 빠져나옴
public class TestFor2 {
     public static void main(String[] args) {
           
           int cnt = 0;
           // 1에서 부터 100까지 홀수만 출력
           for (int i=1; i<101; i++) {
                cnt++;
                if(i%2 == 1) {
                     System.out.print(i+" ");
                }
           }
           System.out.println();
           System.out.println(cnt); // 100
           
           // 증감소식은 변수에 값을 변환시키고 유지 시킬 수  있는
           // 모든 연산자를 사용할 수 있다.
           cnt = 0;
           for (int i=1; i<101; i+=2) {
                cnt++;
                System.out.print(i+" ");
           }
           System.out.println();
           System.out.println(cnt); // 50
     }
}

03

public class TestFor3 {
     
     public static void main(String[] args) {
           
           // 1~100까지 출력하기 3의 배수마다 숫자대신 "짝"을  출력
           for (int i=1; i<101; i++) {
                if (i%3 == 0) {
                     System.out.println("짝");
                     continue;
                }
                System.out.println(i);
           }
     }
}

04

public class TestFor4 {
     
     public static void main(String[] args) {
           
           // 1~100까지의 합 출력 : 1에서 100까지의 합은 5050
           int sum = 0;
           for (int i=1; i<101; i++) {
                sum += i;
           }
           System.out.println(sum);
     }
}
public class TestFor5 {
     
     public static void main(String[] args) {
           
           // A~Z까지 출력 65~90
           // ASCII casting 사용하는 방법
           for (int i=65; i<91; i++) {
                System.out.print((char)i+" ");
           }
           System.out.println();
           
           // char로 바로 하는 방법
           for (char c='A'; c<='Z'; c++) {
                System.out.print(c + " ");
           }
           System.out.println();
     }
}

05

다중 for

  • for안에 for문을 정의하는 것
for (초기값; 조건식; 증감식) {
    // 단일 for 영역
    for (초기값; 조건식; 증감식) {
        // 다중 for 영역
        // 바깥 for index와 안에있는 for index를 같이 사용가능 
    }
    // 단일 for 영역
}

06

for(int i=0;i<2;i++) {
    for(int j=0;j<3;j++) {
        System.out.println(i+"  "+j);
    }
}
public class TestFor7 {
      public static void main(String[] args) {
            
            // 구구단 전단 출력
            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+"단 끝");
            }
      }
}
/**
*  0 0
*  1 0 1 1
*  2 0 2 1 2 2
*  3 0 3 1 3 2 3 3
*  출력하기
*/
public class TestFor8 {
     public static void main(String[] args) {
           
           for(int i=0; i<4; i++) {
                for(int j=0; j<=i; j++) {
                     System.out.print(i+" "+j+" ");
                }
                System.out.println();
           }
     }
}

07

/**
*  0 1 0 2 0 3 0 4
*  1 2 1 3 1 4
*  2 3 2 4
*  3 4
*  출력하기
*/
public class TestFor9 {
     public static void main(String[] args) {
           
           for(int i=0;i<4; i++) {
                for (int j=i+1; j<5; j++) {
                     System.out.print(i + " " + j + " ");
                }
                System.out.println();
           }
     }
}

08


무한 LOOP

  • 종료되지 않는 프로그램을 작성 시 사용
  • 무한LOOP 아랫줄의 코드는 실행될 수 없기 때문에 코드를 작성하면 에러발생
  • break가 존재하면 반복문을 빠져나가는 조건이 있기 때문에 무한 loop가 아님
    • break는 가장 인근에 존재하는 반복문을 빠져나감
// 무한LOOP
for(;;) { 
    반복수행문장;
}
// 증가하는 수를 세는 무한 LOOP
for(초기값;;증감소식) {

}
// 하나의 for문에서 index를 여러개 사용가능
// 초기값을 여러개 설정가능
for(초기값, 초기값, .. ; 조건식 ; 증감식,.. ) {

}
public class TestFor10 {
     
     public static void main(String[] args) {
           
           // 무한루프
           for(;;) {
                System.out.println("무한루프");
           }
           
           // System.out.println("무한루프 다음코드");
           // Unreachable code error발생
     }
}

09

// 증가하는 수를 세는 무한 LOOP
for (int i=0;;i++) {
     System.out.println("무한루프" + i);
}
for (int i=0;;i++) {
     System.out.println("무한루프" + i);
     
     // 다중 for의 경우 break는 가장 가까이 있는 for만 빠져나감
     if (i==50)
           break;
}
// 여러개의 초기값을 사용하는 for
for(int i=0, j=10, k=30; i<10; i++, j++, k--) {
     System.out.println(i+" "+j+" "+k);
}
// 조건식을 잘못 설정하면 무한루프
for(int i=0; i < 10; i--) {
     System.out.println("무한루프 " + i);
}
// for문 뒤에 ;가 있는 경우 한번 실행됨
// for문 수행 후 sysout 한번 수행
int i = 0;
for(i=0; i< 10; i++); {
     System.out.println("반복문"+i);
}

향상된 for

  • jdk 1.5에서 추가된 문법
  • 이전 for는 인덱스를 얻기 위해 사용
  • 향상된 for는 인덱스를 사용할 수 없음
    • Array, Collection(List, Set)의 모든 방(요소)의 값을 출력하기 위해 제공되는 for
  • 많은 양의 데이터를 출력할 때 기존 for보다 느리다.
for (데이터형 변수명 : 배열명|Collection명) {
    // 변수에는 배열 또는 Collection의 요소 값이 저장됨
}
public class EnhancedFor01 {
     public static void main(String[] args) {
           
           int[] arr = {10, 20, 300, 15};
           
           System.out.println("기존 for");
           // 기존 for의 i는 요소의 인덱스
           for(int i=0; i<arr.length;i++) {
                System.out.println(arr[i]);
           }
           
           System.out.println("향상된 for");
           
           // 향상된 for에선 i가 요소의 값을 갖게 됨
           for(int i:arr) {
                System.out.println(i);
           }
     }
}

10

import java.util.ArrayList;
import java.util.List;
public class EnhancedFor3 {
     
     public static void main(String[] args) {
           
           // Collection
           List<Integer> list = new ArrayList<>();
           
           list.add(10);
           list.add(20);
           list.add(110);
           list.add(1);
           
           System.out.println("---------List 이전  for----------");
           for(int i=0; i<list.size();i++) {
                System.out.println(list.get(i));
           }
           
           System.out.println("---------List 개선된  for----------");
           for(int i : list) {
                System.out.println(i);
           }
     }
}

11


jdk 컴파일 버전 변경

  • 프로젝트 선택 - Properties(Alt+Enter) - Java Compiler - 기존 1.8 check 풀면 다른 컴파일러 버전 선택가능
    • 향상된 for문은 1.5부터 사용가능
    • 이전 버전 컴파일러 선택 시 사용불가능해지는 기능들이 있음

12

13


continue

  • 반복문의 실행을 건너 뛸 때 사용
    • 조건문으로 묶어서 사용
    • 반복수행 코드 위에 정의한다.
for (int i=0; i<10; i++) {
    // if 없이 사용하면 에러발생
    continue;
    System.out.println("안녕"); // Unreachable code error!
}

14

public class TestContinue {
     public static void main(String[] args) {
           
           // 0~100까지 홀수만 출력
           for(int i=0; i<100; i++) {
                
                if (i%2 == 0) {
                     continue;
                }
                System.out.println("i = " + i);
           }
     }
}

숙제풀이1 숙제풀이1 flowchart

숙제풀이2



Java