제어문(Control Statement)

  • 프로그램의 흐름(flow)을 바꾸는 역할을 하는 문장

  • 조건문과 반복문이 있음

    • 조건문 : 조건에 따른 문장이 수행하도록 함

    • 반복문 : 특정 문장들을 반복해서 수행



조건문

  • 조건식과 문장을 포함하는 블럭 { } 으로 구성되어 있음

  • 조건식의 연산 결과에 따라 실행할 문장이 달라져서 프로그램의 실행 흐름을 변경할 수 있음

  • 조건문은 if와 switch문 두 가지가 있음

  • 주로 if문 사용

  • 처리할 경우의 수가 많을때는 switch 문이 효율적이지만, if문보다 제약이 많음



if문

  • 가장 기본적인 조건문 : ‘만일(if) 조건식이 참(true)이면 괄호 { } 안의 문장들을 수행하라’라는 의미

  • 조건식 → 조건식의 결과는 반드시 true 또는 false여야 함

  • 블럭 { }

    • 괄호를 이용하여 여러 문장을 하나의 단위로 묶은 것

    • 블럭 내의 문장들은 탭(tab)으로 들여쓰기(indentation)를 해서 블럭 안에 속한 문장이라는 것을 알기 쉽게 해주는 것이 좋음

    • 블럭 안에는 보통 여러 문장을 넣지만, 한 문장만 넣거나 아무런 문장도 넣지 않을 수 있음

    • 한 문장만 넣을 때는 괄호를 { } 생략할 수 있지만 가능하면 생략하지 않는 것이 바람직함
      → 새로운 문장을 추가할 때 { }를 써줘야하는데, 잊기가 쉽기 때문

if (조건식) {
    // 조건식이 참(true)일 때 수행될 문장들을 적음
}

/* 수행될 문장이 한 문장 이하면 생략도 가능(권장하진 않음) */
// 1
if (조건식) // 조건식이 참(true)일 때 수행될 문장
// 2
if (조건식)
    // 조건식이 참(true)일 때 수행될 문장
    



if-else문

  • else : ‘그 밖에 다른’ = ‘위의 조건식이 false일 때,’

  • if를 두 개 쓰는 것은 연산을 두 번 해야하지만, else를 쓰면 연산을 한 번만 해도 되므로 더 효율적이고 간단함

  • else를 생략하는 경우엔 아무것도 수행되지 않을 수 있음

if (조건식) {
    // 조건식이 참(true)일 때 수행될 문장들을 적음
} else {
    // 조건식이 거짓(false)일 때 수행될 문장들을 적음
}



if-else if문

  • else if : ‘위의 조건식이 false이고, 만일(if) 조건식이 참(true)이면 괄호 { } 안의 문장들을 수행하라’라는 의미

  • 그 이전의 조건식이 false이고 && 지금 조건식이 참일 때(true)라고 적지 않고, 지금 조건식이 참일 때(true)만 적어도 무관함
    → 이미 해당 블럭으로 내려온 것은 이전의 조건식이 false이기 때문

  • 예시

    • if (score >= 90) { } else if (80 <= score && score < 90) { }

    • if (score >= 90) { } else if (80 <= score) { }

    • 첫 번째처럼 작성하지 않고 두 번째처럼 작성하는게, 연산을 한 번 덜하기 때문에 효율적이고 간단함

if (조건식A) {
    // 조건식A가 참(true)일 때 수행될 문장들을 적음
} else if (조건식B) {
    // 조건식B가 참(true)일 때 수행될 문장들을 적음
} else if (조건식C) {
    // 조건식C가 참(true)일 때 수행될 문장들을 적음
} else { /* 마지막은 보통 else로 끝나지만, else 조건이 필요 없으면 생략도 가능 */
    // 조건식A, B, C 모두 거짓(false)일 때 수행될 문장들을 적음
}



중첩 if문

  • if문을 중첩해서 사용도 가능함

  • 중첩된 if문에서는 가독성때문에 들여쓰기가 중요하고, { } 괄호 생략을 안하는 것을 권장

if (조건식A) {
    // 조건식A가 참(true)일 때 수행될 문장들을 적음
    if (조건식A') {
    	// 조건식A가 참(true)이고 조건식A'도 참(true)일 때 수행될 문장들을 적음
	} else {
    	// 조건식A가 참(true)이고 조건식A'가 거짓(false)일 때 수행될 문장들을 적음
	}
} else {
    // 조건식A가 거짓(false)일 때 수행될 문장들을 적음
}



switch문

  • 처리할 경우의 수가 많은 경우에는 if문보다 switch문으로 작성하는 것이 좋음

    • if문은 조건식의 결과가 참과 거짓, 두 가지밖에 없기 때문에 경우의 수가 많아질수록 else-if를 계속 추가해야 하기 때문에 조건식이 많아서 복잡해지고, 여러 개의 조건식을 계산해야 하므로 처리시간도 많이 걸림

    • switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현이 간결하므로 알아보기 쉬움

  • switch문은 제약조건이 있기 때문에, 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 경우도 있음

    • switch문의 조건식 결과는 정수 또는 문자열이어야 한다

    • case문의 값은 정수 상수 및 문자열 상수(JDK 1.7 ~)만 가능하며 중복되지 않아야 한다

  • 문자 상수(→ 정수 상수와 동일), 정수 상수, 문자열 상수, 정수 사용 가능

    • case ‘1’: // 문자 상수(= 정수 상수 ‘49’)

    • case ONE: (final int ONE = 1) // 정수 상수

    • case “YES”: // 문자열 상수

    • case 1: // 정수

    • case num: (int num = 1) // 정수 변수 (X)

    • case 1.0: // 실수 (X)

    • 변수 불가, 실수 불가

  • switch문

    • 조건식을 먼저 계산

    • 조건식의 결과와 일치하는 case문으로 이동

    • 이후의 문장들을 수행

    • break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나감

  • 예제 1. break 사용 → break를 만나면 탈출하기

switch (조건식) {
    case 1:
        // 조건식의 결과가 값 1과 같을 경우 수행
        // ...
        break; // 조건식 탈출
    case 2:
        // 조건식의 결과가 값 2와 같을 경우 수행
        // ...
        break;
    default:
        // 조건식의 결과와 일치하는 case문이 없을 때 수행
        // ...
        // 마지막이므로 break를 사용하지 않아도 됨
}
  • 예제 2. break 미사용 → 밑의 case도 다 확인해 보기
switch (조건식) {
    case 1:
        // 조건식의 결과가 값 1과 같을 경우 수행
        // ... ↓ break문이 없기 때문에 아래로 내려감
    case 2:
        // 조건식의 결과가 값 2와 같을 경우 수행
        // ... ↓ break문이 없기 때문에 아래로 내려감
    default:
        // 조건식의 결과와 일치하는 case문이 없을 때 수행
        // ...
        // 마지막이므로 break를 사용하지 않아도 됨
}
  • 예제 3. case문 붙이기 (아래로)
switch (조건식) {
    case 1:
    case 2:
        // 조건식의 결과가 값 1 또는 2와 같을 경우 수행
        // ...
        break; // 조건식 탈출
    default:
        // 조건식의 결과와 일치하는 case문이 없을 때 수행
        // ...
        // 마지막이므로 break를 사용하지 않아도 됨
}
  • 예제 4.
switch (조건식) {
    case 1: case 2:
        // 조건식의 결과가 값 1 또는 2와 같을 경우 수행
        // ...
        break; // 조건식 탈출
    default:
        // 조건식의 결과와 일치하는 case문이 없을 때 수행
        // ...
        // 마지막이므로 break를 사용하지 않아도 됨
}
  • 예제 5. switch문의 중첩 : 주의) break문을 빼먹지 않도록
switch (조건식A) {
    case 1: case 2:
        // 조건식A의 결과가 값 1 또는 2와 같을 경우 수행
        switch (조건식B) {
            case 3:
                // 조건식A의 결과가 값1 또는 값 2와 같을 경우, 조건식 B의 값이 값 3과 같으면
                break; // 조건식B 탈출
            default:
                // 조건식A의 결과가 값1 또는 값 2와 같을 경우, 조건식 B와 일치하는 case문이 없다면
                // ...
                // 마지막이므로 break를 사용하지 않아도 됨
        }
        break; // 조건식A 탈출 (주의! 잊지말기)
    default:
        // 조건식의 결과와 일치하는 case문이 없을 때 수행
        // ...
        // 마지막이므로 break를 사용하지 않아도 됨
}