Dico

[Java] 제어문

제어문

무조건 위에서 아래로 한 문장씩 순차적으로 진행되는 프로그램의 흐름을 바꾸는 역할을 하는 문장.

조건문반복문이 있다.

대게 조건식과 문장을 포함하는 블럭으로 구성되어 있다.

ControlStatement(condition){
	// condition == true
}

조건식의 결과는 반드시 true 또는 false이어야 한다.

중첩할 경우 횟수에 제한이 없다.

블럭 { }

여러 문장을 하나의 단위로 묶는다.

괄호 열기( { )로 시작해서 괄호 닫기( } )로 끝난다.

문장의 끝을 의미하는 세미콜론( ; )을 붙이지 않는다.

블럭 내의 문장이 하나뿐 일 때는 괄호를 생략할 수 있다.

하지만 나중에 새로운 문장을 추가할 때 괄호로 문장들을 감싸주어야 하는 걸 잊기 쉬우므로 가능한 사용하는 것이 바람직하다.

조건문

조건에 따라 다른 문장이 수행되도록 한다.

if문

조건식이 참이면 괄호 안의 문장들을 수행한다.

if (i > 10) {
    System.out.println("1은 10보다 크다.");
}
if (i <= 10) System.out.println("1은 10보다 작거나 같다.");
  • if-else문

     조건식의 결과가 거짓일 때 else블럭의 문장을 수행한다.

     두 조건식이 참과 거짓인 상반된 관계에 있을 때 사용할 수 있다.

if (i > 10) {
    System.out.println("1은 10보다 크다.");
} else {
    System.out.println("1은 10보다 작거나 같다.");
}
if (i > 10) System.out.println("1은 10보다 크다.");
else System.out.println("1은 10보다 작거나 같다.");
  • if-else if문

     한 문장에 여러 개의 조건식을 쓸 수 있다.

     결과가 참인 조건식을 만날 때까지 첫 번째 조건식부터 순서대로 평가한다.

     조건식의 결과가 참인 것이 하나도 없을 경우 else블럭의 문장이 수행된다.

     else블럭이 생략되어 있을 경우 if-else if문의 어떤 블럭도 수행되지 않을 수 있다.

if (i > 10) {
    System.out.println("1은 10보다 크다.");
} else if (i > 0) {
    System.out.println("1은 0보다 크고 10보다 작거나 같다.");
} else {
    System.out.println("1은 0과 같거나 작다.");
}

     조건식이 순차적으로 진행되므로 중복되는 조건은 생략한다.

     위의 if-else if문을 if문으로 분리시키면 다음과 같다.

if (i > 10) {
    System.out.println("1은 10보다 크다.");
}
if (i > 0 && i <= 10) {
    System.out.println("1은 0보다 크고 10보다 작거나 같다.");
}
if (i <= 0) {
    System.out.println("1은 0보다 작거나 같다.");
}

 

  • 중첩 if문

     if문의 블럭 내에 또 다른 if문을 포함시키는 것.

     괄호가 생략될 경우 else블럭은 가까운 if문에 속한 것으로 간주되기 때문에 괄호 생략에 더욱 조심해야 한다.

if (condition1) {
    // condition1 == true
    if (condition2) {
        // condition1, condition2 == true
    } else {
        // condition1 == true, condition2 == false
    }
} else {
    // condition1 == false
}

switch

단 하나의 조건식으로 많은 경우의 수를 처리할 수 있다.

조건식을 계산하여 나온 결과와 일치하는 case문으로 이동한다.

조건식의 결과값은 반드시 정수 또는 문자열(JDK1.7부터)이어야 한다.

case문의 값은 상수(정수)와 문자열(JDK1.7부터)만 가능하며 중복되지 않아야 한다.

조건식을 잘 만들어서 case문의 개수를 최소화하는 것이 중요하다.

switch (condition) {
    case value1: // condition == value1 
        break;
    case value2: // condition == value2  
        break;
    default: // condition == null
}

     

  • break문

     각 case문의 영역을 구분한다.

     생략될 경우 다른 break문을 만나거나 switch문 블럭의 끝(})을 만날 때까지 나오는 모든 문장들을 수행한다.

switch (level) {
    case 5:
        HardModeOpen();    // 4, 1의 문장들도 수행되어 모든 난이도를 할 수 있다.
    case 4:
        MediumModeOpen();  // 1의 문장도 수행되어 중간 난이도와 보통 난이도를 할 수 있다.
    case 1:
        NormalModeOpen();  // 보통 난이도만 할 수 있다.
}

     중첩으로 사용할 경우 break문을 빼먹지 않도록 주의한다.

반복문

조건식이 거짓이 될 때까지 블럭 내의 문장을 반복 수행한다.

for문

반복횟수를 알고 있을 때 사용한다.

초기화, 조건식, 증감식, 블럭. 총 4부분으로 이루어져 있다.

for (initialization; condition; increment;) {
	// condition == true
}
    • 초기화

         처음에 단 한번만 반복문을 제어할 변수를 초기화한다.

         쉼표( , )를 구분자로해서 같은 타입인 둘 이상의 변수를 사용할 수 있다.

    • 조건식

         조건식이 참인 동안 블럭의 문장을 반복한다.

         생략되면 참으로 간주되어서 무한 반복문이 되고, 조건식이 잘못 될 경우에도 무한 반복에 빠질 수 있다.

    • 증감식

         반복문을 제어하는 변수의 값을 증가 또는 감소시킨다.

         매 반복마다 수행된다.

         쉼표를 이용해서 두 문장 이상을 하나로 연결해서 사용할 수 있다.

    for (int i = 0, j = 0; i < 10; ++i) ;
    for (; ; ) ;    // 초기화, 조건식, 증감식 모두 생략 가능
    for (int i = 0; i < 10; ++i, j *= 3) ;
      • 빈 문장

           블럭 내에 세미콜론( ; )만 두거나 괄호 안을 비워둔다.

           아무 일도 하지 않는 채 조건식과 증감식을 반복하며 시간을 보낸다.

      for (int i = 0; i < 10; ++i) {
          ;
      }
      for (int i = 0; i < 10; ++i) ;
      for (int i = 0; i < 10; ++i) {
      }
        • for-each 루프

             변수에 배열/컬렉션의 요소가 차례대로 대입되면서 반복된다. (JDK1.5부터 추가)

        for (variable : 배열/컬렉션) {
        	// statements
        }

             일반적인 for문과 달리 배열/컬렉션에 저장된 값들을 읽어오는 용도로만 사용할 수 있다.

        int[] arr = {1, 2, 3, 4};
        
        // 일반
        for (int i = 0; i < arr.length; i++) {
            j = arr[i];
        }
        
        // 읽어오는 용도
        for (int tmp : arr) {
            j = tmp;
        }

              

        while문

        초기화나 증감식이 필요하지 않는 경우 사용한다.

        while (condition) {
            // condition == true
        }

        조건식을 생략할 수 없다.

        • 무한 반복문

             조건식이 항상 참이 되도록 할 경우 true를 넣는다.

             반드시 블럭 안에 조건문을 넣어서 특정 조건을 만족하면 무한 반복문을 벗어날 수 있도록 한다.

        • do-while문

             while문의 변형으로, 조건식과 블럭의 순서를 바꿔놓은 것이다.

             처음 한 번은 반드시 수행된다.

        do {
            // condition == true
        } while (condition);

             끝에 세미콜론( ; )을 잊지 않도록 주의한다.

             반복적으로 사용자의 입력을 받아서 처리할 때 유용하다. ex) 숫자 맞추기

        break문

        자신이 포함된 가장 가까운 반복문을 벗어난다.

        무한 반복문에는 항상 조건문과 같이 사용된다.

        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (i == j) break;   // 현재 for문이 중단되고 상위 for문의 다음 문장이 진행된다.
            }
        }
        while (i < 10) {
            if (i == 5) break;  // while문을 중단한다.
            i++;
        }

        continue문

        반복문의 끝으로 이동하여 다음 반복으로 넘어간다.

        for문의 경우 증감식으로, while문과 do-while문의 경우 조건식으로 이동한다.

        전체 반복 중에 특정조건을 만족하는 경우를 제외할 때 유용하다.

        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0) continue;
            System.out.println(i);  // 홀수만 출력한다.
        }

         

        반복문에 이름 붙이기

        반복문 앞에 이름을 붙여주어 break/continue문을 수행할 반복문을 임의로 지정해줄 수 있다.

        하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.

        Loop:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (j == 5) continue Loop;
            }
        }

        참고 서적: 자바의 정석 3판 - 남궁 성 지음