Language/Java

[Java] 자바 제어문 - If, Switch, While, For, Continue, Break, Label

재은초 2024. 4. 6. 22:21
반응형

제어문(control flow statements)

  • 프로그램의 순차적인 흐름을 제어해야만 할 경우가 생기는데 이때 사용하는 명령문을 제어문이라고 하며, 이러한 제어문에는 조건문, 반복문 등이 있다.
  • 이러한 제어문에 속하는 명령문들은 중괄호({})로 둘러싸여 있으며, 이러한 중괄호 영역을 블록(block)이라고 한다.

 

조건문(conditional statements)

  • 조건문은 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문이다.

if 문

  • if 문은 조건식의 결과가 참(true)이면 주어진 명령문을 실행하며, 거짓(false)이면 아무것도 실행하지 않는다.
  • if 문에서 실행될 명령문이 한 줄 뿐이라면 중괄호({})를 생략할 수 있다.
if (조건식) {
    조건식의 결과가 참일 때 실행하고자 하는 명령문;
}
if (ch >= 'a' && ch <= 'z') {
    System.out.println("해당 문자는 영문 소문자입니다.");
}

>> 해당 문자는 영문 소문자입니다.

if / else 문

  • if 문과 함께 사용하는 else 문은 if 문과는 반대로 주어진 조건식의 결과가 거짓(false)이면 주어진 명령문을 실행한다.
if (조건식) {
    조건식의 결과가 참일 때 실행하고자 하는 명령문;
} else {
    조건식의 결과가 거짓일 때 실행하고자 하는 명령문;
}
if (ch >= 'a' && ch <= 'z') {
    System.out.println("해당 문자는 영문 소문자입니다.");
} else {
    System.out.println("해당 문자는 영문 소문자가 아닙니다.");
}

>> 해당 문자는 영문 소문자가 아닙니다.

if / else if / else 문

  • if / else if / else 문은 두 개의 if / else 문이 연달아 나온 것뿐으로, 중첩된 if 문을 좀 더 간결하게 표현할 수 있다.
  • else if 문은 여러 번 나와도 상관없지만, if 문과 else 문은 단 한 번만 나올 수 있다.
if (조건식1) {
    조건식1의 결과가 참일 때 실행하고자 하는 명령문;
} else if (조건식2) {
    조건식2의 결과가 참일 때 실행하고자 하는 명령문;
} else {
    조건식1의 결과도 거짓이고, 조건식2의 결과도 거짓일 때 실행하고자 하는 명령문;
}
if (ch >= 'a' && ch <= 'z') {
    System.out.println("해당 문자는 영문 소문자입니다.");
} else if (ch >= 'A' && ch <= 'Z') {
    System.out.println("해당 문자는 영문 대문자입니다.");
} else {
    System.out.println("해당 문자는 영문자가 아닙니다.");
}

>> 해당 문자는 영문 대문자입니다.

삼항 연산자에 의한 조건문

  • 자바에서는 간단한 if / else 문은 삼항 연산자를 이용하여 간결하게 표현할 수 있다.
조건식 ? 반환값1 : 반환값2

switch 문

  • switch 문은 if / else 문과 마찬가지로 주어진 조건 값의 결과에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문이다.
  • switch 문은 if / else 문보다 가독성이 더 좋으며, 컴파일러가 최적화를 쉽게 할 수 있어 속도 또한 빠른 편이다.
  • switch 문의 조건 값으로는 int형으로 승격할 수 있는(integer promotion) 값인, byte형, short형, char형, int형의 변수나 리터럴을 사용할 수 있다. 또한, 이러한 기본 타입에 해당하는 데이터를 객체로 포장해 주는 래퍼 클래스(Wrapper class) 중에서 위에 해당하는 Byte, Short, Character, Integer 클래스의 객체도 사용할 수 있다. 그리고 enum 키워드를 사용한 열거체(enumeration type)와 String 클래스의 객체도 사용할 수 있다. 따라서 switch 문은 if / else 문보다는 사용할 수 있는 상황이 적다.
  • default 절은 조건 값이 위에 나열된 어떠한 case 절에도 해당하지 않을 때만 실행되며, 이 절은 반드시 존재해야 하는 것은 아니며 필요할 때만 선언할 수 있다. default 절은 위의 맨 마지막에 위치하는 것이 일반적이지만, case 절 사이에 위치해도 상관없다.
  • 각 case 절 및 default 절은 반드시 break 키워드를 포함하고 있어야 한다. break 키워드는 조건 값에 해당하는 case 절이나 default 절이 실행된 뒤에 전체 switch 문을 빠져나가게 해주는데, 만약 break 키워드가 없다면 조건에 해당하는 case 절 뿐만 아니라 그 이후의 모든 case 절이 전부 실행된다.
switch (조건 값) {
    case 값1:
        조건 값이 값1일 때 실행하고자 하는 명령문;
        break;
    case 값2:
        조건 값이 값2일 때 실행하고자 하는 명령문;
        break;
    ...
    default:
        조건 값이 어떠한 case 절에도 해당하지 않을 때 실행하고자 하는 명령문;
        break;
}
char ch = 'i';

switch (ch) {
    case 'a':
        System.out.println("해당 문자는 'A'입니다.");
        break;
    case 'e':
        System.out.println("해당 문자는 'E'입니다.");
        break;
    case 'i':
        System.out.println("해당 문자는 'I'입니다.");
        break;
    case 'o':
        System.out.println("해당 문자는 'O'입니다.");
        break;
    case 'u':
        System.out.println("해당 문자는 'U'입니다.");
        break;
    default:
        System.out.println("해당 문자는 모음이 아닙니다.");
        break;
}

>> 해당 문자는 'I'입니다.

 

반복문(iteration statements)

  • 반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문이다.
  • 프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문 중 하나입니다.

while 문

  • while 문은 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행합니다.
  • while 문은 우선 조건식이 참(true)인지를 판단하여, 참이면 내부의 명령문을 실행한다. 내부의 명령문을 전부 실행하고 나면, 다시 조건식으로 돌아와 또 한 번 참인지를 판단한다. 이렇게 조건식의 검사를 통해 반복해서 실행되는 반복문을 루프(loop)라고 한다.
  • while 문에서 실행될 명령문이 한 줄 뿐이라면 중괄호({})를 생략할 수 있다.
while (조건식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}
int i = 0;

while (i < 5) {
    System.out.println((i + 1) + "번째 반복 실행 중");
    i++;                                           // 이 부분을 삭제하면 무한 루프에 빠짐
}

System.out.println("while 문이 종료된 후 변수 i의 값은 " + i);

>> while 문이 1번째 반복 실행 중
>> while 문이 2번째 반복 실행 중
>> while 문이 3번째 반복 실행 중
>> while 문이 4번째 반복 실행 중
>> while 문이 5번째 반복 실행 중
>> while 문이 종료된 후 변수 i의 값은 5

do / while 문

  • while 문은 루프에 진입하기 전에 먼저 조건식부터 검사하지만, do / while 문은 먼저 루프를 한 번 실행한 후에 조건식을 검사한다. do / while 문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행한다.
do {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
} while (조건식);
int i = 1, j = 1;

do {
    System.out.println("do / while 문이 " + i + "번째 반복 실행 중");
    j++;                                    // 이 부분을 삭제하면 무한 루프에 빠짐
} while (j < 1);

System.out.println("do / while 문이 종료된 후 변수 j의 값은 " + j);

>> do / while 문이 1번째 반복 실행 중
>> do / while 문이 종료된 후 변수 j의 값은 2

for 문

  • for 문은 while 문과는 달리 자체적으로 초기식, 조건식, 증감식을 모두 포함하고 있는 반복문이다.
  • for 문을 구성하는 초기식, 조건식, 증감식은 각각 생략할 수 있다.
for (초기식; 조건식; 증감식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}
for (i = 0; i < 5; i++) {
    System.out.println("for 문이 " + (i + 1) + "번째 반복 실행 중");
}

System.out.println("for 문이 종료된 후 변수 i의 값은 " + i);

>> for 문이 1번째 반복 실행 중
>> for 문이 2번째 반복 실행 중
>> for 문이 3번째 반복 실행 중
>> for 문이 4번째 반복 실행 중
>> for 문이 5번째 반복 실행 중
>> for 문이 종료된 후 변수 i의 값은 5

Enhanced for 문

  • JDK 1.5부터는 배열과 컬렉션의 모든 요소를 참조하기 위한 Enhanced for 문이라는 반복문이 새롭게 추가되었다.
  • Enhanced for 문은 명시한 배열이나 컬렉션의 길이만큼 반복되어 실행된다. 루프마다 각 요소는 명시한 변수의 이름으로 저장되며, 명령문에서는 이 변수를 사용하여 각 요소를 참조할 수 있다.
  • Enhanced for 문은 요소를 참조할 때만 사용하는 것이 좋으며, 요소의 값을 변경하는 작업에는 적합하지 않다. Enhance for 문 내부에서 사용되는 배열 요소는 배열 요소 그 자체가 아닌 배열 요소의 복사본으로, Enhance for 문에서 배열 요소의 값을 변경하여도 원본 배열에는 아무런 영향을 주지 못한다.
 for (타입 변수이름 : 배열이나컬렉션이름) {
    배열의 길이만큼 반복적으로 실행하고자 하는 명령문;
}
int[] arr = new int[]{1, 2, 3, 4, 5};

for (int e : arr) {
    System.out.print(e + " ");
}

>> 1 2 3 4 5

 

기타 제어문

  • 일반적으로 조건식의 루프에 진입하면, 다음 조건식을 검사하기 전까지 루프 안에 있는 모든 명령문을 실행한다. 하지만 continue 문과 break 문은 이러한 일반적인 루프의 흐름을 사용자가 직접 제어할 수 있도록 도와준다.

continue 문

  • continue 문은 루프 내에서 사용하여 해당 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식의 판단으로 넘어가게 해준다. 보통 반복문 내에서 특정 조건에 대한 예외 처리를 하고자 할 때 자주 사용된다.
for (int i = 1; i <= 100; i++) {
    if (i % 5 == 0 || i % 7 == 0) {
        System.out.println(i);
    } else {
        continue;
    }
}

>> 5
>> 7
>> 10
>> 14
>> 15
>> ...
>> 95
>> 98
>> 100

break 문

  • break 문은 루프 내에서 사용하여 해당 반복문을 완전히 종료시킨 뒤, 반복문 바로 다음에 위치한 명령문을 실행하게 한다. 즉 루프 내에서 조건식의 판단 결과와 상관없이 반복문을 완전히 빠져나가고 싶을 때 사용한다.
int num = 1, sum = 0;

while (true) {                        // 무한 루프
    sum += num;
    if (num == 100) {
        break;
    }
    num++;
}

System.out.println(sum);

>> 5050

이름을 가지는 반복문(break with label)

  • 일반적인 break 문은 단 하나의 반복문만을 빠져나가게 해준다. 따라서 여러 반복문이 중첩된 상황에서 한 번에 모든 반복문을 빠져나가거나, 특정 반복문까지만 빠져나가고 싶을 때에는, 반복문에 이름(label)을 설정해 한번에 빠져나오는 방법을 사용한다.
  • 가장 바깥쪽 반복문이나 빠져나가고 싶은 특정 반복문에 이름을 설정한 후, break 키워드 다음에 해당 이름을 명시하면 된다. 그러면 해당 break 키워드는 현재 반복문이 아닌 해당 이름의 반복문 바로 다음으로 프로그램의 실행을 옮겨준다.
  • 단 이때 라벨 이름(label)은 가리키고자 하는 반복문의 키워드 바로 앞에 위치해야 하며, 이름과 반복문의 키워드 사이에 명령문이 존재하면 오류가 발생한다.
allLoop :
for (int i = 2; i < 10; i++) {
    for (int j = 2; j < 10; j++) {
        if (i == 5) {               // i가 5가 되면 두 개의 for 문을 모두 빠져나와 종료
            break allLoop;
        }
        System.out.println(i + " * " + j + " = " + (i * j));
    }
}

>> 2 * 2 = 4
>> 2 * 3 = 6
>> 2 * 4 = 8
>> 2 * 5 = 10
>> ...
>> 4 * 6 = 24
>> 4 * 7 = 28
>> 4 * 8 = 32
>> 4 * 9 = 36

 

Reference

반응형