4. 제어문 Control Flow Statements


  • 프로그램의 흐름을 원활하게 제어하기 위해 사용하는 명령문

  • 조건문 Conditional statements

    • if , else , switch
  • 반복문 Iteration statements Looping statements

    • for , while , do-while
  • 분기문 Branching statements

    • break , continue , return

4.1 조건문 Conditional statements


  • 주어진 조건에 따라 명령이 실행되는 제어문

4.1.1 if

  • 조건식의 결과가 true 이면 명령문을 실행하고, false 이면 실행하지 않는다.
if (조건식) {
	명령문;
}

4.1.2 if - else

  • 조건식의 결과가 true 이면 if 코드블록의 명령문을 실행하고, false 이면 else 코드블록의 명령문을 실행한다.
if (조건식) {
	명령문1;	// 조건식의 결과가 true 인 경우 실행된다.
} else {
	명령문2;	// 조건식의 결과가 false 인 경우 실행된다.
}

4.1.3 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 문이 끝나면 수행된다.

예시) 조건식2true 인 경우 명령문2 -> 명령문5 순서로 수행된다.

4.1.4 중첩 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가 수행된다.
    
}

4.1.5 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;
}

4.1.6 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 (조건) {
	case1:	
    	명령문1;	// 조건이나 조건의 결과가 값1과 일치하면 명령문1이 실행된다.
        break;
    case2:
    	명령문2;	// 조건이나 조건의 결과가 값2와 일치하면 명령문2가 실행된다.
        break;
    case3:
    	명령문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;
}

4.2 반복문 Iteration statements


  • Iteration statements , Looping statements

  • 주어진 조건이 true 인 동안 반복문 코드블록의 명령문을 반복해서 수행한다.
    반복할 때마다 조건을 확인하고 false 인 경우 반복수행을 멈춘다.

4.2.1 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) {

}

4.2.2 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문의 차이를 확인할 수 있다.

4.2.3 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( ; ; ){
 
    명령문;
    
}

4.2.4 for-each

  • for-each loop 는 J2SE 5.0 부터 도입되었다.
  • array,collectionelement를 순차적으로 대입, 반복하는 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

4.2.5 중첩 반복문

  • 반복문 안에 또 다른 반복문을 쓸 수 있다.

  • 여러 겹으로 중첩할 수 있다. ( 코드 실행시간에 문제가 발생할 수 있다. )

  • 각 반복문 간의 변수 값의 변화를 주의해야 한다.

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

*****
*****
*****

*/

4.3 분기문 Branching statements


  • 프로그램 흐름에 오류가 발생할 수 있으므로 주의해야 한다.

4.3.1 continue

  • 반복문 수행 중에 continue 를 만나면 그 반복문의 시작점으로 이동시킨다.

4.3.2 break

  • 반복문 수행 중에 break 를 만나면 그 반복문을 종료시킨다.

4.3.3 label

  • 반복문에 label을 지정해서 break , continuelabel을 지정하면 그 위치로 이동된다.
label1:
for(초기화;조건식;증감식){
	명령문1;
    
	label2:
	for(초기화;조건식;증감식){
		명령문2;

		label3
		for(초기화;조건식;증감식){
			명령문3;
            if(조건식)
            	break(or continue) label1;
            명령문4;
        }
    }
}

// 명령문3을 수행하고 if 조건식이 true 이면 명령문4는 수행하지 않고
// label1 으로 이동되고 break 된다.
// continue의 경우도 마찬가지로 label3 인 반복문의 시작점으로 가는 것이 아닌
// label1 인 반복문의 시작점으로 이동된다.

4.3.4 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가 종료된다. 
profile
real.great.code

0개의 댓글