4. 제어문에 대해 알아보자

2020. 12. 12. 03:00Java/live-study

목표

자바가 제공하는 제어문을 학습하세요.

제어문

제어문이란 무엇이며 자바가 제공하는 제어문은 어떤 것들이 있나?

The statements inside your source files are generally executed from top to bottom, in the order that they appear. Control flow statements, however, break up the flow of execution by employing decision making, looping, and branching, enabling your program to conditionally execute particular blocks of code.

[출처]: The Java™ Tutorials

소스파일의 코드들은 일반적으로 보이는 순서대로 위에서 아래로 실행됩니다. 하지만 제어문은 선택, 반복, 분기를 채택함으로써 이 흐름을 벗어나 프로그램이 특정 코드들을 조건부로 실행될 수 있게 해줍니다.

자바가 제공하는 제어문은 다음과 같습니다.

  • 선택문 (decision-making statements)
  • 반복문 (looping statements)
  • 분기문 (branching statements)

선택문과 선택문의 종류들

프로그램을 만들 때 사용자 혹은 프로그램의 상태 등 여러 상황에 해당하는 결과를 돌려줘야할 때가 있습니다. 선택문은 상태에 따른 특정 코드들을 실행함으로써 좀 더 범용적인 프로그램을 만들 수 있게 해줍니다.

선택문의 종류는 다음과 같습니다.

  • if-then
  • if-then-else
  • switch

if-then

if-then문은 가장 기본적인 제어문으로 조건식과 then절로 이루어져있습니다. 조건식이 true이면 then절을 실행하고 false이면 then절을 생략합니다.

if-then문의 구조

if(조건식) {
    //then...
    코드1;
    코드2;
    코드3;
    ...
}

또한 then절에 또다른 if-then문을 중첩해서 사용할 수 있습니다. 중첩의 제한은 없지만 다소 많은 중첩은 코드의 가독성을 떨어뜨립니다.

중첩 if-then문의 구조

if(조건식1) {
    // then...
    if(조건식2) {
        // then...(조건식1과 조건식2가 모두 true일 때 실행)
        코드1;
        코드2;
        코드3;
        ...
    }
}

if-then-else

if-then-else문은 조건식이 false일 때 특정 코드들이 실행되게 하기위한 else절을 제공합니다. 조건식이 true이면 then절을 실행하며 false이면 else절을 실행합니다.

if-then-else문의 구조

if(조건식) {
    // then...
    코드1
    코드2
    코드3
    ...
} else {
    // else...
    코드1
    코드2
    코드3
    ...
}

조건문이 true일 때 실행될 코드가 하나 밖에 없다면 다음과 같이 중괄호를 생략할 수도 있습니다.

if(조건문)
    코드;

하지만 무작정 생략하는 것은 코드의 흐름이 예상과 다르게 일어날 수 있게 합니다. 그리고 개인적으로는 중괄호를 생략하는 것은 깔끔해보일 수도 있지만 가독성 면에서는 좋지 않다고 생각합니다.

if(조건식1)
    if(조건식2)
        System.out.printLn("조건식1과 조건식2 모두 true입니다.");
else System.out.printLn("조건식1이 false입니다.");

위의 코드를 들여쓰기를 통해 보면 조건식1이 true이고 조건식2가 false일 때 아무 일도 일어나지 않을 것이라고 예상됩니다. 하지만 실제 결과는 조건식1이 false입니다.라는 결과가 출력됩니다.

이와 같은 결과가 나온 이유는 중괄호가 생략되었을 때if-then-else문의 else절은 매칭된 else절이 없는 if문 중 가까이 있는 if문과 매칭된다는 특징때문입니다.

따라서 위의 코드는 if-then-else문의 내부에 있는 if-then문이 아닌 if-then문의 내부에 있는 if-then-else문이 됩니다.

원래 예상했던 결과를 얻으려면 다음과 같이 중괄호로 else절이 어떤 if문과 매칭되는지 명시하여 코드를 작성하면 됩니다.

if(조건식1) {
    if(조건식2)
        System.out.printLn("조건식1과 조건식2 모두 true입니다.");
}else{
    System.out.printLn("조건식1이 false입니다.");
}

또한 else if절을 통해 우리는 다양한 조건식에 해당하는 특정 코드를 실행할 수 있습니다.

else if절을 사용한 if-then-else

if(조건식1) {
    // then...
    코드들...
}else if(조건식2) {
    // then...
    코드들...
} else if(조건식3) {
    // then...
    코드들...
} else {
    // else...
}

switch

switch문은 if문의 else if절과 같이 다양한 상태에 따른 코드를 실행하게 합니다.

switch문의 구조

switch(switchVar){
    case case1:
        // 코드들...
        break;
    case case2:
        // 코드들...
        break;
    ...
    case caseN:
        // 코드들...
        break;
    default:
        // 코드들...
        break;
}

switchVar은 비교하고자하는 변수로 primitive type 중에서는 byte, short, char, int (해당하는 Wrapper 클래스도 가능), Enum type, String 클래스가 올 수 있습니다.

case label의 각 case들은 switchVar의 타입에 해당하는 리터럴로 switchVarcase labal의 case를 비교하여 일치하면 해당 코드를 실행합니다.

default label은 모든 case label과 일치하지 않을 때 실행되는 코드를 갖고 있는 label입니다.

break 문은 각 label의 코드들을 실행하고 switch문을 벗어날 때 사용합니다. break문이 없으면 일치하는 label의 코드들을 실행하고 그 후의 case label들이 일치 여부와 관계 없이 실행됩니다. 따라서 의도하지 않는 이상 label의 코드들을 실행한 후 switch문을 벗어날 수 있도록 break문을 작성해야합니다.

반복문과 반복문의 종류들

반복문은 조건이 true일 때 특정 코드 블록을 반복해서 실행하는 구문입니다. 반복문으로 우리는 어떤 코드들을 반복해서 작성하는 것이 아닌 조건의 제어만으로 코드를 반복해서 수행할 수 있습니다.

반복문의 종류들

  • while
  • do-while
  • for

while

while문은 자바의 기본 반복문 중 하나입니다. 조건이 false가 되기 전까지 특정 코드 블록을 반복해서 실행합니다.

while문의 구조

while(조건식) {
    // 코드들...
}

while문은 가장 먼저 조건식의 결과(조건식의 결과는 반드시 boolean 타입)를 확인합니다. 만약 조건식이 false면 특정 코드 블록은 생략한 뒤 그 다음 구문들을 실행합니다.

반대로 조건식의 결과가 true면 코드 블록의 코드들이 실행되며 실행이 모두 끝나면 다시 조건식으로 돌아와서 결과를 확인합니다. 마찬가지로 조건식의 결과가 truefalse냐에 따라 코드 블록을 실행한 뒤 조건식의 결과를 다시 확인하거나 다음 구문을 실행합니다.

이러한 반복은 조건식이 true를 반환하는 동안 계속되며 보통은 특정 코드 블록 내에 조건식의 결과에 영향을 미치는 코드를 작성함으로 반복을 벗어나게 합니다. 만약 특정 코드 블록 내에 조건식의 결과에 영향을 미치는 코드가 없다면 이 while문은 프로그램이 종료될 때까지 무한히 반복됩니다.

do-while

do-while문은 while문과 비슷한 반복문입니다.

do-while문의 구조

do {
    // 코드들...
}while(조건식);

차이점은 while문은 코드 블록을 실행하기 전에 조건식의 결과를 확인하지만 do-while문은 코드 블록을 먼저 실행한 후에 조건식의 결과를 확인합니다. 따라서 do-while문의 코드 블록은 적어도 한번은 실행된다는 특징이 있습니다.

또한 do-while문의 끝은 코드 블록이 아닌 while(조건식)이 나타내므로 do-while문의 끝에는 세미콜론을 붙여줘야합니다.

for

for문은 무한한 반복을 원하지 않는 이상 while문이나 do-while문보다 좀 더 편리하게 반복문을 제공합니다.

for문의 구조

for(변수 초기화; 종료 조건식; 변수 변화식) {
    // 코드들...
}

for문의 구조를 보면 왜 while문이나 do-while문보다 좀 더 편리한지 알 수 있습니다. for문을 처음 작성할 때 조건식에 사용할 변수의 초기화, for문의 종료를 판단할 조건식, 종료 조건식에 영향을 미치는 변수 변화식을 명시함으로써 우리의 실수로 무한 반복을 발생시키는 상황을 줄여줍니다. (물론 for문을 사용한다고 무한 반복의 실수가 아예 일어나지 않는 것은 아닙니다.)

for문이 실행되는 순서는 다음과 같습니다.

  1. 변수를 초기화합니다. 변수 초기화는 for문이 처음 실행될 때만 실행됩니다.
  2. 종료 조건식으로 변수가 해당 조건식에 대한 결과를 확인합니다. true면 코드 블록을 실행, falsefor문을 벗어나 다음 구문을 실행합니다.
  3. 코드 블록을 실행한 후 변수 변화식이 실행됩니다. 변수 변화식으로 종료 조건식의 결과에 영향을 미치는 변화가 일어납니다.
  4. 종료 조건식의 결과가 false가 나올 때 까지 2번과 3번의 실행이 반복됩니다.

분기문과 분기문의 종류들

이전에 어떠한 조건에 따라 특정 코드를 실행, 혹은 반복했던 선택문과 반복문과 달리 분기문은 분기문 자체만으로 코드의 흐름을 제어합니다.

분기문의 종류

  • break
  • continue
  • return

break

break문은 break문을 담고 있는 코드 블록을 즉시 벗어나는 구문입니다. 앞서 보았듯이 break문은 switch문에서 사용할 수 있으며 더불어 다른 제어문 (if문, while, do-while, for문)에서 사용할 수 있습니다.

continue

continue문은 반복문에서 사용하는 구문으로 현재의 반복을 생략하는 구문입니다. 생략 후 continue문과 가장 가까운 반복문의 조건식부터 코드를 실행합니다.

return

return문은 현재의 메서드를 빠져나오는 분기문입니다. return문에 의해 메서드를 빠져나오면 제어 흐름은 메서드를 호출한 곳으로 돌아갑니다.

return문에는 두가지 형태가 있는데 하나는 값을 돌려주는 형식, 다른 하나는 그냥 메서드를 호출한 곳으로 돌아가는 형식이 있습니다.

값을 돌려주려면 단순히 return문 이후 돌려주고자 하는 값을 작성하면 됩니다.

return 돌려주고자 하는 값

'Java > live-study' 카테고리의 다른 글

4. 과제1 - live-study의 대시 보드  (0) 2020.12.12