ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 선택문과 제어문
    Programming/Java 2021. 4. 5. 12:57

    Java언어에서 flow control을 담당하는 선택문과 제어문을 공부해보자!


    과제 회고

    자바의 기본적인 문법은 알고 있었지만, 속성식으로 빠르게 배웠기 때문에 깊이가 없다고 생각했다.

    그래서 이번 과제의 목표를 다음과 같이 잡았다.

    • oracle documentation과 예제보고 키워드 사용법 제대로 이해하기
    • 새롭게 업데이트 된 부분 공부하기

    문서와 예제를 통해 공부를 하니까, 이미 알고있던 키워드도 더 잘 활용하는 방법을 배울 수 있었다.

    또 새롭게 알게 된 내용도 많았다.

    • forEach 메서드
    • 새로운 Switch문 사용법
      • ->yield문 사용

    배운 내용을 잘 활용하면, 좀 더 가독성 있는 코드를 짤 수 있을 거 같다.

     

    프로그램의 흐름을 제어하는 선택문과 제어문

    Java언어에서 프로그램의 흐름을 제어하기 위해서, 다음과 같은 키워드를 사용할 수 있다.

    1. 조건 확인 : if, else, switch
    2. 반복 사이클 생성 : while, for
    3. 사이클 제어 : break, continue

    keyword의 쓰임을 예제를 통해 살펴보자.


    1. if : 표현식이 참인지 판별

    기본적인 형식은 다음과 같다.

    if (표현식 expression){
        명령문 statement;
    }
    • if표현식이 참인지를 판별하는 키워드이다.
    • 만약 참이라면, 명령문이 실행된다.
    • 명령문이 여러줄 인 경우, block을 사용하여 모든 명령문를 묶어준다.

    예제1 : 생성한 난수가 양수인지 판별하기

    package javastudy;
    
    import java.util.Random;
    
    public class IFStatement {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Random r = new Random();
            int num = r.nextInt();
    
            if (num > 0) {
                //statement가 다수인 경우 블록을 사용
                System.out.println("생성한 ");
                System.out.println("난수가 ");
                System.out.println("양수입니다.");
    
            }
    
            //statement가 하나인 경우
            if (num > 0) System.out.println("양수라구요.");  
        }
    
    }

     

    2. else

    else 키워드를 사용하여 간단한 분기문을 만들 수 있다.

    if (expression){
        statement;
    } else {
        statement2;
    }
    • if 키워드의 표현식거짓인 경우, else 키워드 뒤의 명령문이 자동으로 실행된다.

    예제2 : 생성한 난수가 양수인지 아닌지 판별하기

    package javastudy;
    
    import java.util.Random;
    
    public class Branch {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Random r = new Random();
            int num = r.nextInt();
    
            if (num > 0) {
    
                System.out.println("양수입니다.");
    
            }
            else {
    
                System.out.println("양수가 아닙니다.");
    
            }
    
        }
    
    }

     

    3. else if

    else if를 사용하면 좀 더 복잡한 분기문을 만들 수 있다.

    if (expression){
        statement;
    } else if (expression2){
        statement2;
    } else if (expression3){
        statement3;
    }    .
        .
        .
    else {
        statement10;
    }
    • else if 키워드는 앞의 조건들이 모두 거짓일 경우에 또 다른 조건을 시험할 수 있는 키워드이다.
    • ifelse와 달리, 여러번 사용하여 분기를 만들 수 있다.

    :point_right: 예제3 : 생성한 난수가 양수인지 0인지 음수인지 판별하기

    package javastudy;
    
    import java.util.Scanner;
    
    public class MultipleBranches {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            System.out.println("숫자를 입력하세요:");
    
            Scanner sc = new Scanner(System.in);
            int num = sc.nextInt();
    
            if (num > 0) {
    
                System.out.println("양수입니다.");
    
            } else if (num == 0) {
    
                System.out.println("0 입니다.");
    
            } else {
    
                System.out.println("음수입니다.");
    
            }
    
        }
    
    }
    숫자를 입력하세요:
    -3
    음수입니다.
    
    숫자를 입력하세요:
    1
    양수입니다.
    
    숫자를 입력하세요:
    0
    0 입니다.

     

    4. switch

    switch는 선택을 제어하는 키워드이다.

    여러가지 분기를 만들 수 있다는 점에서 if-else if와 유사하지만, 보다 간단하고 가독성이 높은 형태로 구현할 수 있다.


    기본형태는 다음과 같다.

    switch(domain){
        case 1:
            break;
        case 2:
            break;
            .
            .
            .
        default:
            break;
    }
    • switch는 대괄호 안에 오는 변수표현식을 기준으로, 각 분기에 해당하는 값들을 비교한다.
    • case 키워드 뒤에 각 분기에 해당하는 값을 제시하고, 만약 변수 혹은 표현식해당 case의 값과 일치할 경우 case 뒤의 명령문이 실행된다.
    • 일치 하는 값이 없을 경우에는 아무 명령문도 실행되지 않거나, default 옵션을 사용해서 일치하는 case가 없을 경우 실행할 명령문을 지정해 줄 수 있다.
    • 각각의 분기는 break 키워드로 종료한다.
      • break문이 없다면, 해당 case하단에 모든 case들이 실행된 후 종료된다.
    • 여러가지 case를 그룹화하여 사용할 수 있다. (예제5)

     

    예제4 : 국가 판별하기

    package javastudy;
    
    import java.util.Scanner;
    
    public class SwitchStatement {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            System.out.println("도메인을 입력하세요:");
    
            Scanner sc = new Scanner(System.in);
            String domain = sc.nextLine().toLowerCase();
    
            switch (domain) {
    
                case "kr":
                    System.out.println("대한민국");
                    break;
    
                case "us":
                    System.out.println("미국");
                    break;
    
                case "cn":
                    System.out.println("중국");
                    break;
    
                case "jp":
                    System.out.println("일본");
                    break;
    
                default:
                    System.out.println("알 수 없는 나라");
                    break;
    
            }
        }
    }
    
    도메인을 입력하세요:
    kr
    대한민국
    
    도메인을 입력하세요:
    de
    알 수 없는 나라

     

     

    예제5 : 어느 구인지 판별하기

    package javabasic;  
    
    import java.util.Scanner;  
    
    public class SwitchDemo2 {  
        public static void main(String[] args){  
            Scanner sc = new Scanner(System.in);  
      System.out.print("동을 입력하세요>>");  
      String district = sc.nextLine();  
    
     switch(district.trim()){  
                case "방배동": case "양재동": case "서초동":  
                case "반포동": case "잠원동":  
                    System.out.println(district + " in 서초구");  
     break; case "합정동": case "망원동": case "연남동":  
                case "아현동": case "서교동":  
                    System.out.println(district + " in 마포구");  
     break; default:  
                    System.out.println("unknown");  
      }  
        }  
    }
    동을 입력하세요>>망원동
    망원동 in 마포구
    
    동을 입력하세요>>서교동
    서교동 in 마포구
    
    동을 입력하세요>>대학동
    unknown

     

    4.1. Java SE 12 switch expressions

    References

    자바 12에 break대신 yield문arrow를 사용한 switch문이 소개되었다.

    • yield : case의 결과로 반환하고 싶은 값이 있을 경우. yield를 사용한다.
    • ->: :대신 사용할 수 있다.

    예제6 : arrow 사용전후 코드 비교

        public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; }  
    
            // 기존의 switch문  
          int numLetters = 0;  
          Day day = Day.WEDNESDAY;  
          switch (day) {  
                case MONDAY:  
                case FRIDAY:  
                case SUNDAY:  
                    numLetters = 6;  
                    break; 
                case TUESDAY:  
                    numLetters = 7;  
                    break; 
                case THURSDAY:  
                case SATURDAY:  
                    numLetters = 8;  
                    break; 
                case WEDNESDAY:  
                    numLetters = 9;  
                    break; 
                default:  
                    throw new IllegalStateException("Invalid day: " + day);  
          }  
           System.out.println(numLetters);  
    
           // arrow 사용한 switch문  
          Day day = Day.WEDNESDAY;  
          System.out.println(  
                    switch (day) {  
                        case MONDAY, FRIDAY, SUNDAY -> 6;  
                        case TUESDAY                -> 7;  
                        case THURSDAY, SATURDAY     -> 8;  
                        case WEDNESDAY              -> 9;  
                        default -> throw new IllegalStateException("Invalid day: " + day);  
                  }  
    );
    

     

    :point_right: 예제7 : yield문을 사용하여 정수값을 반환

        Day day = Day.WEDNESDAY;
        // numLetters case문 실행 결과값 numLetter에 삽입
        int numLetters = switch (day) {
            case MONDAY:
            case FRIDAY:
            case SUNDAY:
                System.out.println(6);
                yield 6; // `월, 금, 일`인 경우 6을 yield하여 numLetter변수 초기화
            case TUESDAY:
                System.out.println(7);
                yield 7;// `화`인 경우 7을 yield하여 numLetter변수 초기화
            case THURSDAY:
            case SATURDAY:
                System.out.println(8);
                yield 8; // `목,토`인 경우 8을 yield하여 초기화
            case WEDNESDAY:
                System.out.println(9);
                yield 9;
            default:
                throw new IllegalStateException("Invalid day: " + day);
        };
        System.out.println(numLetters);

     

    5. while

    while은 대괄호 안에 주어진 boolean값의 상태에 따라, 반복을 제어할 수 있는 키워드이다.


    기본형태는 다음과 같다.

    while (표현식 expression){
        명령문 statement;
    }
    • 표현식이 참인 경우 명령문을 계속해서 수행한다.

    예제8 : 더하기 연산 반복하기

    package javastudy.fourth;
    
    public class WhileStatement {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            int i = 0;
            int sum = 0;
    
            while (i < 10) {
    
                i++;
                sum += i;
                System.out.println("i : " + i);
                System.out.println("sum : " + sum + "\n");
    
            }
        }
    }
    
    i : 1
    sum : 1
    
    i : 2
    sum : 3
    ...
    i : 9
    sum : 45
    
    i : 10
    sum : 55

     

    6. do while

    do whilewhile문의 방식을 살짝 수정해서 사용할 수 있는 키워드이다.

    • 명령문이 최소 1번 실행된 후에, while문 뒤에 있는 표현식을 확인하여 반복여부를 결정한다.

    예제9 : 횟수 카운팅하기

    package javastudy.fourth;
    
    public class DoWhile {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            int count = 0;
    
            do {
    
                System.out.println("횟수 : " + count);
    
            } while (count != 0);//expression이 false이므로 break
    
        }
    
    }
    횟수 : 0

     

    7. for

    for은 반복할 횟수가 주어져 있을 경우 반복을 제어할 수 있는 키워드이다.


    기본형태는 다음과 같다.

    for (카운팅 변수 초기화; 표현식 ; 명령문) {
        statement;
    }
    //예시
    for (int i = 0; i < 10 ; i++) {
        System.out.println(i);
    }

    for는 기본적으로 4단계의 과정을 거친다.

    변수 초기화 -> 표현식 참/거짓 확인 -> statement 실행 -> 괄호 안의 statement 실행

    1. int i = 0 : 카운팅 변수 i를 0으로 초기화
      • 이 단계는 오직 한번만 시행된다.
    2. i < 10 : 해당 조건이 참인지를 판별한다.
      • 참일 경우 다음 단계로 넘어가고,
      • 거짓일 경우 반복문에서 나간다.
    3. System.out.println(i) : for가 감싸고 있는 명령문을 실행한다.
    4. i++ : 괄호 안의 변수 i를 1 증가시키는 명령을 시행한다.

    2단계의 조건이 거짓이 될 때까지 시행을 반복한다.


    예제 10 : 배열 원소 출력하기

    package javastudy.fourth;
    
    public class ForStatement {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            String[] ch = { "내", " ", "이", "름", "은", " ", "이", "효", "리", "\n" };
    
            for (int i = 0; i < ch.length; i++) {
    
                System.out.print(ch[i]);
    
            }
    
            System.out.print("거꾸로 해도 ");
    
            for (int i = ch.length - 1; i >= 0; i--) {
    
                System.out.print(ch[i]);
    
            }
    
        }
    
    }
    
    내 이름은 이효리
    거꾸로 해도 
    리효이 은름이 내

     

    괄호 안에 2개 이상의 명령문을 사용할 수도 있다

    예제 11 : 난수의 합 구하기

    • for문의 각 시행마다 i++sum += num 연산을 함께한다.
    • block안에 sum을 구하는 명령문을 따로 넣을 필요 없이, 괄호 안에서 연산할 수 있다.
    package javastudy.fourth;
    
    import java.util.Arrays;
    import java.util.Random;
    
    public class ForStatement2 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Random r = new Random();
    
            int[] values = new int[10];
            int num;
            int sum = 0;
    
            for (int i = 0; i < 10; i++, sum += num) {// i++, sum += num
    
                num = r.nextInt(10);// 10 아래의 난수를 생성
                values[i] = num;// 배열의 각 방에 초기화
    
            }
    
            System.out.println(Arrays.toString(values));
            System.out.println("합은 " + sum + "입니다");
    
        }
    
    }
    
    [6, 8, 5, 7, 2, 8, 2, 2, 0, 5]
    합은 45입니다

     

    배열의 원소를 하나씩 빼오는 형태로 사용할 수도 있다.

    :point_right: 예제 12 : 배열 원소 출력하기

    package javastudy.fourth;
    
    public class ForStatement3 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            String[] str = { "내", " ", "이", "름", "은", " ", "이", "효", "리", "\n" };
    
            for (String s : str) {
    
                System.out.print(s);
    
            }
    
        }
    
    }

     

    (추가1) 무한루프

    // infinite loop
    for ( ; ; ) {
    
        // your code goes here
    }

    (추가2) forEach 메서드

    // 기존의 forEach문
    for (String name : names) {
        System.out.println(name);
    }
    // arrow를 사용하는 새로운 forEach 함수
    names.forEach( name -> { // name 배열을 순회하며 꺼내온 값을 `name` 변수에 삽입하고, 매 시행마다 블럭을 실행
        System.out.println(name);
    });

     

    8. break

    break는 반복을 종료할 수 있는 키워드이다.

    • while, for, switch와 함께 쓰인다.

    예제13 : 특정숫자일 경우 반복 종료하기

    package javastudy.fourth;
    
    import java.util.Random;
    
    public class BreakStatement {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Random random = new Random();
    
            while (true) {
    
                int num = random.nextInt(50);
                System.out.print(num + " ");
    
                if (num == 22) {
    
                    break;//while문을 빠져나간다
                }
            }
    
            System.out.print('\n');
    
        }
    
    }
    
    20 19 46 49 16 49 18 6 47 31 38 38 31 24 36 33 43 37 9 22

     

    9. continue

    continue는 반복 중 특정 조건하에서 명령문 실행을 skip할 수 있는 키워드 이다.

    • for, while과 함께 쓰인다.

    예제14 : 홀수만 출력하기

    package javastudy.fourth;
    
    public class ContinueStatement {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            int num = 0;
    
            while (num < 30) {
    
                num++;
    
                if ((num % 2) == 0) {//짝수일 경우 뒤의 명령은 시행하지 않는다
    
                    continue;
    
                }
    
                System.out.println(num + " ");
            }
    
            System.out.println('\n');
    
        }
    
    }
    1 
    3 
    5 
    ...
    25 
    27 
    29 



    References



    댓글

Designed by black7375.