[Java] 제어문
본문 바로가기
Java

[Java] 제어문

by IYK2h 2023. 4. 24.
728x90

제어문

프로그램의 흐름을 제어할 수 있도록 도와주는 실행문

  • Decision-Making Statements: if, if-else, switch
  • Looping Statements: for, while, do-while
  • Branching Statements: break, continue, return

Decision-Making Statements

if statement

if (condition) { /* code */ }

condition이 true일 때 code블럭 실행

if-else statement

if (condition) { /* code1 */ }
else { /* code2 */ }

condition이 true이면 code1 실행, 아니면 code2 실행

switch statement

switch/case 문

아래와 같은 switch문이 있을 때..

public enum Day { SUNDAY, MONDAY, TUESDAY,
    WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; }
​
// ...
​
    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);

자바 12부터는 콜론(:) 대신 화살표(->) 연산자를 사용할 수 있다.

int numLetters = 0;
Day day = Day.WEDNESDAY;
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> numLetters = 6;
    case TUESDAY                -> numLetters = 7;
    case THURSDAY, SATURDAY     -> numLetters = 8;
    case WEDNESDAY              -> numLetters = 9;
    default -> throw new IllegalStateException("Invalid day: " + day);
};
System.out.println(numLetters);

그리고 자바 13부터는 break 대신 yield를 사용한다.

Day day = Day.WEDNESDAY;
int numLetters = switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        yield 6;
    case TUESDAY:
        System.out.println(7);
        yield 7;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        yield 8;
    case WEDNESDAY:
        System.out.println(9);
        yield 9;
    default:
        throw new IllegalStateException("Invalid day: " + day);
};
System.out.println(numLetters);

case TUESDAY -> 7;에서 7을 System.out.println(7)이나 "Seven" 등으로 바꾸면 int type이 아니므로 에러가 발생한다. 위에서는 콜론(:)이 있는 구문에서 yield가 빠지면, 런타임 에러가 발생한다. 하지만 아래와 같이 화살표(->) 연산자를 사용할 경우에는 yield가 빠지면, 컴파일 에러가 발생하여 미리 알 수 있기 때문에 화살표(->) 연산자를 사용할 것을 권장한다. yield 예약어는 case 라벨(:)에도 사용 가능합니다.

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> {
        System.out.println(6);
        yield 6;
    }
    case TUESDAY -> {
        System.out.println(7);
        yield 7;
    }
    case THURSDAY, SATURDAY -> {
        System.out.println(8);
        yield 8;
    }
    case WEDNESDAY -> {
        System.out.println(9);
        yield 9;
    }
    default -> {
        throw new IllegalStateException("Invalid day: " + day);
    }
};  

열거 타입(enum)을 사용하는 이유

static int switchError(String s) {
    return switch (s) {
        case "MONDAY", "FRIDAY", "SUNDAY"    -> 6;
        case "TUESDAY"                    -> 7;
        case "THURSDAY, SATURDAY"        -> 8;
        case "WEDNESDAY"                -> 9;
        default                        -> -1;
    };
}

위의 메서드에서 default를 주석 처리하면 "'switch' expression does not cover all possible input values" 에러 메시지를 볼 수 있다. 가능한 모든 값에 대하여 일치하는 case 라벨이 하나라도 없으면 위와 같은 에러를 볼 수 있습니다.

따라서 default를 사용하거나, 필요한 값들로 열거 타입(enum)을 만들어서 사용해야 합니다.

ZetCode , GeeksforGeeks , OracleDocs

Looping Statements

while (expression) { statement; }
do { statement; } while (expression)
for (초기값; 조건; 방향&간격) { statement; }
for (<type> <instance>: <type-iterable>) { statement; }

Branching Statements

break statement

while, for 또는 switch문을 끝낼 수 있는 구문이다.

continue statement

loop문에서 continue문이 실행되면 그 아래 코드들은 스킵한 뒤에 다음 스텝의 루프를 실행한다.

Guide to Control Flow Statements in Java

728x90

댓글