Control Flow Statements
프로그램의 흐름을 원활하게 제어하기 위해 사용하는 명령문
조건문 Conditional statements
if
, else
, switch
반복문 Iteration statements
Looping statements
for
, while
, do-while
분기문 Branching statements
break
, continue
, return
Conditional statements
if
문true
이면 명령문을 실행하고, false
이면 실행하지 않는다.if (조건식) {
명령문;
}
if - else
문true
이면 if
코드블록의 명령문을 실행하고, false
이면 else
코드블록의 명령문을 실행한다.if (조건식) {
명령문1; // 조건식의 결과가 true 인 경우 실행된다.
} else {
명령문2; // 조건식의 결과가 false 인 경우 실행된다.
}
if - else if - else
문조건이 복수로 주어지고 각 조건에 대해 다른 수행이 필요할 때 사용한다.
각 조건은 상호 배타적이다.
if (조건식1) {
명령문1; // 조건식1이 true 인 경우 명령문1이 수행되고 전체 조건문을 빠져나간다.
} else if (조건식2) {
명령문2; // 조건식2가 true 인 경우 명령문2가 수행되고 전체 조건문을 빠져나간다.
} else if (조건식3) {
명령문3; // 조건식3이 true 인 경우 명령문3이 수행되고 전체 조건문을 빠져나간다.
} else {
명령문4; // 위의 조건이 모두 false 인 경우 명령문4가 수행된다. (default 조건)
}
명령문5; if - else if - else 문이 끝나면 수행된다.
예시) 조건식2가 true 인 경우 명령문2 -> 명령문5 순서로 수행된다.
if
문if
문 안에 if
문을 중첩해서 사용할 수 있다.if (조건식1) {
명령문1 // 조건식1이 true, 명령문1이 수행된다.
if (조건식2) {
명령문2; // 조건식1이 true 여서 명령문1 수행되고
//조건식2가 true 인 경우 명령문2가 수행된다.
} else {
명령문3; // 조건식1이 true 여서 명령문1 수행되고
// 조건식2가 false 인 경우 명령문3이 수행된다.
}
} else {
명령문4; // 조건식1이 false 인 경우 명령문4가 수행된다.
}
if
문 코드블록 {
}
if
문의 명령문이 단일 명령문이면 코드블록 { }
을 생략해도 된다.int i = 5; int i = 5;
if (i<10) { if (i<10)
i = i + 5; i = i + 5;
} else if (i>10) { ===> else if (i>10)
i = i + 10; i = i + 10;
} else { else
i = i + 20; i = i + 20;
}
switch
문if
- else if
- else
문을 사용할 때 복잡한 부분을 간결하게 표현할 수 있다.
비교 조건이 특정 값
, 문자열
인 경우 사용한다.
case
문의 변수는 char
, byte
, short
, int
, enumeration
, 문자열
case
문의 종료는 :
을 사용하고 명령문은 없어도 오류가 발생하지 않는다.
명령문 다음에 break
문을 통해 switch
문을 강제로 빠져나오게 한다.
break
문이 없으면 다음 case
문을 실행하게 된다.
default
: if
문의 else
와 같은 기능을 한다. case
문과 일치하지 않을 때 실행된다.
문자 '
'
, 문자열 "
"
로 감싼다.
if
문과 같이 switch
문도 case
문에 switch
문을 넣어 중첩이 가능하다.
Java 14 부터 case
문에서 쉼표 ,
로 구분해 복수의 조건 값을 사용할 수 있고, yield 키워드를 통해 값을 반환할 수도 있다.
switch (조건) {
case 값1:
명령문1; // 조건이나 조건의 결과가 값1과 일치하면 명령문1이 실행된다.
break;
case 값2:
명령문2; // 조건이나 조건의 결과가 값2와 일치하면 명령문2가 실행된다.
break;
case 값3:
명령문3; // 조건이나 조건의 결과가 값3과 일치하면 명령문3이 실행된다.
// break문이 없기 때문에 switch문을 빠져나가지 못하고 명령문4까지 실행된다.
default:
명령문4; // 조건이나 조건의 결과와 일치하는 case가 없으면 명령문4가 실행된다.
}
// 특정 월의 일 수 ( case문의 변수가 값인 경우 )
int month = 11;
int day;
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
day = 31;
break;
case 4: case 6: case 9: case 11:
day = 30;
break;
case 2:
day = 28;
break;
default:
System.out.println(month + "월은 없습니다")
}
System.out.println(month + "월은 " + day + "일 입니다.");
// 문자열
String str = "ABCD";
switch (str) {
case "ABCD":
System.out.println("일치");
break;
default:
System.out.println("불일치");
break;
}
// 문자
char ch = 'a';
switch (ch) {
case 'a':
System.out.println("일치");
break;
default:
System.out.println("불일치");
break;
}
Iteration statements
Iteration statements
, Looping statements
주어진 조건이 true
인 동안 반복문 코드블록의 명령문을 반복해서 수행한다.
반복할 때마다 조건을 확인하고 false
인 경우 반복수행을 멈춘다.
while
문while
문의 수행문을 수행하기 전 조건을 확인하고 결과가 true
인 동안 수행문을 반복수행한다.while (조건식) {
명령문1;
}
명령문2;
// 조건식의 결과가 true 인 동안 명령문1을 반복수행한다.
// 반복수행하다 조건식의 결과가 `false` 가 되면 반복을 멈추고 while문을 빠져나온다.
// 명령문2를 수행한다.
int n = 1;
int answer = 0;
while ( n <= 10 ) {
answer = answer + n;
n = n + 1;
}
// n 이 10보다 작거나 같으면 true.
// answer = 0 + 1 , n = 2
// answer = 0 + 1 + 2 , n = 3
// answer = 0 + ~ + 10 , n = 11
// while 문 종료.
// 무한반복
while(true) {
}
do - while
문while
문은 조건을 먼저 확인하고 반복적인 수행을 했다면 do - while
문은 do
코드블록의 명령문을 조건에 상관없이 한 번 수행하고 while
문의 조건을 확인한다.do {
명령문;
}
while (조건식);
// 명령문을 조건에 상관없이 한 번 수행한다.
// 그 후에 조건식을 확인해서 true 인 동안 명령문을 반복수행한다.
int num = 0;
do {
System.out.print(num + " ");
num++;
} while(num>3);
// do 코드블록을 한 번 수행해서 0 을 print 하고 num 값이 0 에서 1이 된다.
// 조건식 num>3 은 false 이므로 do-while 문은 종료된다.
int num = 0;
while(num>3) {
System.out.print(num + " ");
num++;
}
// 조건식 num>3 은 false 이므로 while 문은 종료된다.
// 코드블록, 조건식은 같지만 결과가 다른 것으로 while문과 do-while문의 차이를 확인할 수 있다.
for
문초기화식
, 조건식
, 증감식
이 모두 포함된 반복문이다.for(초기화식; 조건식; 증감식) {
명령문;
}
sum = 0;
for(int i=0;i<3;i++) {
sum += i;
}
// 결과는 sum = 0 + 1 + 2 = 3 이다.
// i = i + 1 은 i++ 로 표현할 수 있다.
// i = i - 1 은 i-- 로 표현할 수 있다.
// sum = sum + i 는 sum += i 로 표현할 수 있다.
,
를 이용해서 복수의 초기화식
, 증감식
을 사용할 수 있다.int sum = 0;
for(int i=1, j=10; i<=j; i++, j--) {
sum += i + j;
}
for
문의 초기화식
, 조건식
, 증감식
은 생략할 수 있다.//초기화식 생략 //조건식 생략 //증감식 생략
int i = 0; for(int i=0;i<3;i++){ for(int i=0;i<3;){
for(; i<3; i++){ 명령문; 명령문;
명령문; if(조건식) break; i++;
} } }
for( ; ; ){
명령문;
}
for-each
문for-each loop
는 J2SE 5.0 부터 도입되었다.array
,collection
의 element
를 순차적으로 대입, 반복하는 for loop
이다.for(datatype variable : array(or collection)){
명령문;
}
int[] arr = {10, 20, 30, 40, 50};
for(int element : arr){
System.out.println(element);
}
// Output
// 10
// 20
// 30
// 40
// 50
반복문 안에 또 다른 반복문을 쓸 수 있다.
여러 겹으로 중첩할 수 있다. ( 코드 실행시간에 문제가 발생할 수 있다. )
각 반복문 간의 변수 값의 변화를 주의해야 한다.
int col = 3 ;
int row = 5 ;
int cCount = 0;
int rCount;
while (cCount < col) {
rCount = 0;
while(rCount < row){
System.out.print("*");
rCount++;
}
System.out.println();
cCount++;
}
/* Output
*****
*****
*****
*/
int col = 3 ;
int row = 5 ;
for(int cCount=0; cCount < col; cCount++) {
for(int rCount=0; rCount < row; rCount++){
System.out.print("*");
}
System.out.println();
}
/* Output
*****
*****
*****
*/
Branching statements
continue
continue
를 만나면 그 반복문의 시작점으로 이동시킨다.break
break
를 만나면 그 반복문을 종료시킨다.label
label
을 지정해서 break
, continue
에 label
을 지정하면 그 위치로 이동된다.label1:
for(초기화;조건식;증감식){
명령문1;
label2:
for(초기화;조건식;증감식){
명령문2;
label3
for(초기화;조건식;증감식){
명령문3;
if(조건식)
break(or continue) label1;
명령문4;
}
}
}
// 명령문3을 수행하고 if 조건식이 true 이면 명령문4는 수행하지 않고
// label1 으로 이동되고 break 된다.
// continue의 경우도 마찬가지로 label3 인 반복문의 시작점으로 가는 것이 아닌
// label1 인 반복문의 시작점으로 이동된다.
return
method
를 종료시키고 method
를 호출한 수행문의 위치로 이동한다.public class Test {
public static void main(String[] args) {
if (조건식1) {
for (초기화식; 조건식; 증감식) {
if (조건식2) return;
명령문1;
}
명령문2;
}
명령문3;
}
}
// ' main ' method를 수행하다 if 조건식2에서 조건식2가 true 이면
// return을 만나면 break 처럼 for문만 탈출하는 것이 아니고
// if(조건식1) 문을 감싸는 ` main ` method를 종료시킨다.
// 즉, 조건식2가 true가 되는 순간
// return 뒤에 있는 명령문1, 명령문2, 명령문3은 수행되지 않고 method가 종료된다.