Control Flow Statement
흐름 제어문
- Java 에서 지원하는 흐름 제어문들은 아래와 같다:
if
Statement (if
문)switch
Statement (switch
문)while
Statement (while
문)do-while
Statement (do-while
문)for
Statement (for
문)
if Statement (if 문)
- 기본적으로, if
문은 boolean
타입의 Test 결괏값에 따라 프로그램의 실행 흐름을 다르게 하는 기능을 제공한다.
if-then Statement
- if-then 문은 프로그램이 특정 경우에만 특정 영역을 수행할 수 있게 하는 흐름 제어 기법을 제공한다.
- then Clause에 하나의 Statement만 위치할 경우, Braces({ }
)를 생략할 수 있으나,
Logical Error 예방을 위해 Braces 를 명시할 것이 권고된다.
Example. if-then Statement
void applyBrakes() {
// the "if" clause: bicycle must be moving
if (isMoving){
// the "then" clause: decrease current speed
currentSpeed--;
}
}
if-then-else Statement
- if-then-else 문은 if-then 문에서 제공하지 못하는 Secondary Path 의 기능을 제공하는데,
쉽게 말하면 if
Clause 의 평가 결과가 false
인 경우 수행될 로직을 명시할 수 있게 한다.
Example. if-then-else Statement
void applyBrakes() {
if (isMoving) {
currentSpeed--;
} else {
System.err.println("The bicycle has already stopped!");
}
}
- 또한 else if
Clause 를 통해 여러 Case 를 처리할 수 있는데,
상단에 우선적으로 명시된 조건이 true
로 평가되어 먼저 처리되면, 그 아래에 명시된 조건들은 고려되지 않는다:
class IfElseDemo {
public static void main(String[] args) {
int testscore = 76;
char grade;
if (testscore >= 90) {
grade = 'A';
} else if (testscore >= 80) {
grade = 'B';
} else if (testscore >= 70) {
grade = 'C';
} else if (testscore >= 60) {
grade = 'D';
} else {
grade = 'F';
}
System.out.println("Grade = " + grade);
}
}
- 예를 들어, testscore
의 값이 76
인 경우, testscore >= 70
이 true
로 평가되어 grade = 'C'
문장이 수행되고,
그 아래에 문장들은 수행되지 않는다.
switch Statement (switch 문)
- if-then-else 문과 달리, switch 문은 평가의 결과값에 정확히 일치하는 case
로
Execution Path 를 분기한다.
- 이떄, 평가식의 결괏값의 타입은 아래와 같다:
byte, short, char, int, long
Typeenum
TypeString
ClassCharacter, Byte, Short, Integer
타입들로 Wrap 된 Special Class
- switch
문은 평가식을 평가한 결과에 해당되는 case
로 프로그램 실행 흐름을 분기시키고,
만약 부합되는 case
가 없을 경우, default
문으로 분기시킨다.
- case
의 끝에는 break
문이 위치하여 swtich
문을 탈출할 수 있게 해야 하며,
break
가 없으면, 평가식 값에 관계없이 다음 case
문이 연달아 실행된다,
Example. swtich
Statement
public class SwitchDemo {
public static void main(String[] args) {
int month = 8;
String monthString;
switch (month) {
case 1: monthString = "January";
break;
case 2: monthString = "February";
break;
case 3: monthString = "March";
break;
case 4: monthString = "April";
break;
case 5: monthString = "May";
break;
case 6: monthString = "June";
break;
case 7: monthString = "July";
break;
case 8: monthString = "August";
break;
case 9: monthString = "September";
break;
case 10: monthString = "October";
break;
case 11: monthString = "November";
break;
case 12: monthString = "December";
break;
default: monthString = "Invalid month";
break;
}
System.out.println(monthString);
}
}
Switch Expression (Java SE 12)
- break
문을 사용할 필요가 없고, 화살표와 중괄호를 사용하여 가독성을 높인 Syntax 이다.
- 마찬가지로, 중괄호에 실행문이 한 줄만 있는 경우엔 중괄호를 생략할 수 있다.
(그러나, 중괄호 생략은 권고되지 않는다.)
char grade = 'B';
switch(grade) {
case 'A', 'a' -> {
System.out.println("Grade : A");
}
case 'B', 'b' -> {
System.out.println("Grade : B");
}
default -> {
System.out.println("Grade : C");
}
}
yield
Statement (Java SE 13)
- Java SE 12 부터는 switch
Block 의 결과를 바로 변수에 대입할 수 있게 되었다.
(이 경우, 중괄호를 사용할 수 없고, case
에 결부되는 문장은 단일 문장이어야 한다.)
- Java SE 13 부터는 case
에 결부되는 문장이 두 개 이상인 경우 yield
키워드를 통해 변수에 값을 대입할 수 있게 되었고,
이 경우에는 default
가 반드시 존재해야 한다.
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);
}
};
while Statement (while 문)
while ( expression ) {
statement(s)
}
- while
문은 expression
이 true
일 경우, 해당 Block 을 수행하고, 다시 expression
을 평가하며,
expression
의 결괏값이 false
가 될 때 까지 statement(s)
를 반복한다
- 이때, exrpession
의 반환값의 타입은 boolean
형 이어야 한다.
Example. Infinite Loop using the while Statement
while ( true) {
// your code goes here
}
- expression
값을 true
로 설정하여, 무한루프를 구성할 수 있다.
do-while Statement (do-while 문)
do {
statement(s)
} while ( expression );
- do-while
문에서는 do
Block이 항상 먼저 수행된 이후에 expression
이 평가된다.
(그러므로, expression
의 결괏값에 관계없이 초기에 do
Block 이 무조건 한 번은 수행된다는 차이가 있다.)
- 마찬가지로, do-while
문에서도 expression
의 결괏값이 false
가 될 때 까지 statement(s)
를 반복한다.
for Statement (for 문)
for ( initialization; termination; increment ) {
statement(s)
}
initialization
Expression
- Loop 에 사용되는 변수들을 초기화하는 수식이다.
- Loop 가 시작될 때 한 번만 수행된다.
termination
Expression
-termination
의 결괏값이false
이면, Loop 반복을 종료한다.
increment
Expression
- 각 Iteration 마다 적용되는 수식이다.
- Loop 에 연관된 어떠한 값을 증가시키거나 감소시키는 문장이 위치하게 된다.
Example. for
Loop
for(int i=1; i<11; i++){
System.out.println("Count is: " + i);
}
Example. Infinite Loop using the for
Statement
for ( ; ; ) {
// your code goes here
}
Iteration through Collections and arrays
int[] numbers = {1,2,3,4,5,6,7,8,9,10};
for (int item : numbers) {
System.out.println("Count is: " + item);
}
- 위와 같이, for
문을 통해 Container 를 간편히 Iteration 할 수 있다.
- Oracle 에서는 일반적인 for
문 형태를 통해 Iteration 하는 것 보다는
가능하면 위와 같은 형태로 Iteration 할 것을 권고하고 있다.
Reference: Oracle, The if-then and if-then-else Statements, URL, 2023년 2월 25일 검색
Reference: Oracle, The switch Statement, URL, 2023년 2월 25일 검색
Reference: Oracle, Switch Expressions, URL, 2023년 2월 26일 검색
Reference: Oracle, The while and do-while Statements, URL, 2023년 2월 25일 검색
Reference: Oracle, The for Statement, URL, 2023년 2월 25일 검색
Reference: 신용권, 임경균; 이것이 자바다(개정판); 한빛미디어; 2022