Chapter 6. 제어문

SeungHyun Son·2021년 6월 21일
0

본 내용은 KH정보교육원 에서 제공한 교재 내용을 개인적인 공부를 위한 목적으로 작성되었습니다.
만약 아래의 내용을 무료로 배부하거나 상업적으로 이용할 경우 법적 처벌을 받을 수 있음을 경고합니다.

제어문이란?

프로그램의 실행 흐름을 제어하는 문장을 제어문이라고 한다. 프로그램의 실행 흐름은 메소드 블록 {} 안에서 작성한 순서대로 실행된다. 개발자가 원하는 방향으로 실행의 흐름을 바꾸는 것이 제어문이다. 제어문은 조건문, 반복문, 분기문으로 나뉜다.

조건문

조건식을 제시하고 조건식의 결과에 따라 다음 코드의 수행 여부를 결정하는 문장이다. 조건식은 반드시 true 또는 false의 결과가 나오게 작성하여야 한다. 조건문에는 if문switch문이 있다.

if문

  • 제시된 조건식의 결과가 true 일 때에만 { } 안의 문장들을 실행시킨다.
01 if (조건식) {
02     // 조건식이 참(true)일 경우 실행되는 문장들
03 }
  • true 조건식
    • boolean 타입 (true / false)로 결과 값이 반환되는 식
    • 일반적으로 true / false의 결과를 만드는 관계 연산자와 논리 연산자가 주로 사용된다.
조건식조건식이 참인 조건
x >= 1 && x <= 100변수 x가 가진 값이 1부터 100사이의 값이냐?
ch == 'y' II ch == 'Y'변수 ch가 가진 문자값이 소문자 'y' 또는 대문자 'Y'이냐?
ch >= 'a' && ch <= 'z'변수 ch가 가진 문자값이 영어 소문자이냐?

TestIf.java

01 public class TestIf {
02     public static void main(String[] args) {
03         int num = 100;
04
05         if(num > 0) // num이 양수일 떄
06         System.out.println("num은 양수이다.");
07     }
08 }

if - else문

if문의 조건식의 결과가 true 일 경우와 false일 경우 수행할 문장을 각각 지정한다. 제시된 조건식의 결과가 false 일 때를 의미하는 단어는 else 로 표현한다.

01 if(조건식) {
02 // 조건식이 참(true)일 경우 실행되는 문장들
03 } else {
04 // 조건식이 거짓(false)일 경우 실행되는 문장들
05 }

조건식의 결과가 true 이면 if문 블록만, 결과가 false이면 else문 블록만 수행한다.

TestIfElse.java

01 public class TestIfElse {
02     public static void main(String[] args) {
03         int num = 100;
04
05         if(num % 2 == 0) {
06             // num을 2로 나눈 나머지가 0 이냐? 즉 짝수냐?
07         System.out.println("num은 짝수이다.");
08         } else {
09             // num을 2로 나눈 나머지가 0이 아니냐? 즉 홀수냐?
10         System.out.println("num은 홀수이다.");
11         }
12     }
13 }

if - else if문

다중 if 문이라고도 하며 판단해야 하는 조건이 세 가지 이상인 경우에 사용한다.
첫 번째 if 문의 조건식을 판단하고 거짓이라면 다음 else if 문으로 넘어가서 계속해서 조건식을 판단한다. 조건식이 참(true)일 경우에는 다음으로 넘어가지 않고 해당 블록 안의 문장을 수행하고 구문이 종료되며 더 이상 다음 else if 문을 수행하지 않는다.

01 if(조건식1) {
02 // 조건식1이 참(true)일 경우 실행되는 문장들
03 } else if(조건식2) {
04 // 조건식1이 거짓(false)이고, 조건식2가 참(true)일 경우 실행되는 문장들
05 } else if(조건식3) {
06 // 조건식1, 2가 거짓(false)이고, 조건식3이 참(true)일 경우 실행되는 문장들
07 } else {
08 // 조건식 1, 2, 3 모두 거짓(false)일 경우 실행되는 문장들
09 }

TestMultiIfElse.java

01 public class TestMultiIfElse {
02 public static void main(String[] args) {
03 int score = 89;
04 char grade = '';
05
06 if(score >= 90) { // 90점 이상일 경우 A학점
07 grade = 'A';
08 } else if(score >= 80) { // 90점 미만 80점 이상일 경우 B학점
09 grade = 'B';
10 } else if(score >= 70) { // 80점 미만 70점 이상일 경우 C학점
11 grade ='C';
12 } else { // 70점 미만일 경우 F학점
13 grade = 'F';
14 }
15
16 System.out.println("점수 :" + score + ", 학점 :" + grade);
17 }
18 }

중첩 if 문

if 문의 블록 내에 다른 if 문을 포함시키는 구문이며, 중첩 횟수에는 제한이 없다.

01 if(조건식1) {
02 // 조건식1이 참(true)일 경우 실행되는 문장들
03 if(조건식2) {
04 // 조건식1이 참(true)이고 조건식2가 참(true)일 경우 실행
05 } else {
06 // 조건식1이 참(true)이고 조건식2가 거짓(false)일 경우 실행
07 }
08 } else {
09 // 조건식1이 거짓(false)일 경우 실행되는 문장들
10 }

TestDupIf.java

01 public class TestDupIf (
02     public static void main(String[] args) {
03         int score = 89;
04         String grade = "";
05    
06         if(score >= 90) { // 90점 이상일 경우 'A' 대입
07             grade = "A";
08             if(score >= 98) { // 90점 이상인 값 중 98점 이상일 경우 '+' 추가
09                 grade += "+";
10             }
11         } else if(score >= 80) { // 80점 이상일 경우 'B' 대입
12             grade = "B";
13             if(score >= 88) { // 80점 이상인 값 중 88점 이상일 경우 '+' 추가
14                 grade += "+";
15             }
16         } else if(score >= 70) { // 70점 이상일 경우 'C' 대입
17             grade = "C";
18             if(score >= 78) { // 70점 이상인 값 중 78점 이상일 경우 '+' 추가
19                 grade += "+";
20             }
21         } else { // 그 이하 점수일 경우 'F' 대입
22                 grade += "F";
23         }
24
25         System.out.println("점수 : " + score + ", 학점 : " + grade);
26     }
27 }

switch문

switch문은 if문과 다르게 값에 따라 준비된 구문이 수행되게 하는 구조를 가진 조건 선택문이다. if문의 조건식과 다르게 값이 무엇인지를 묻는 계산식이나 변수를 제시하여 case문의 값을 비교하여 실행할 문장을 선택 결정한다. case문에 제시되는 값은 정수형 데이터, 문자형 데이터, 문자열 값만 사용된다.

01 switch(선택표현식) {
02     case1 :
03         // 조건식의 결과가 값1과 같은 경우 수행되는 문장들
04     break;
05     case2 :
06         // 조건식의 결과가 값2와 같을 경우 수행되는 문장들
07     break;
08     case... :
09     default;
10         // 조건식의 결과와 일치하는 case가 없을 경우 수행되는 문장들
11 }

TestSwitch.java

01 public class TestSwitch {
02     public static void main(String[] args) {
03         int score = 89;
04         char grade = '';
05
06         switch(score / 10) {
07         case 10:
08         case 9: grade = 'A';
09                 break;
10         case 8: grade = 'B';
11                 break;
12         case 7: grade = 'C';
13                 break;
14         default: grade ='F';
15         }
16
17         System.out.printl("점수 : " + score + ", 학점 : " + grade);
18     }
19 }

switch문에서의 break문은 각 case문의 영역을 구분하는 역할을 하며, break문을 생략하면 case문 사이의 구분이 없어지므로 다음 break문을 만나거나 switch문 블록 { }의 끝을 만날 때까지 다른 case에서 수행될 모든 문장을 수행하면서 내려간다. 이러한 fall throught 현상을 이용하여 일부러 break문을 사용하지 않고 switch문을 작성하는 경우도 있으나, 일반적으로 case문에는 반드시 실행 구문 마지막에 break문을 넣어주어야 한다.

반복문 (LOOP문)

문장들을 반복해서 여러 번 수행되게 할 때 사용하는 구문이다. 구문 상에 반복되는 구간을 루프(Loop)라고 하며, 루프가 있는 문장이라고 하여 루프(Loop)문이라고도 한다.

for문

가장 많이 사용되는 반복문으로 정확한 반복 횟수가 정해져 있을 때 주로 사용한다.
배열이나 컬렉션의 연속 데이터 처리에 주로 사용된다.
for문은 초기식, 조건식, 증감식으로 구성되며, 조건식이 참(true)일 동안 계속 반복되는 구조로 작동되는 구문이다.

01 for (초기식; 조건식; 증감식) {
02     // 반복 수행될 코드 작성 영역
03     // 조건식이 참(true)일 경우 수행되는 문장들
04 }

for문에서 초기식은 반복하는 횟수 카운트용 변수 선언과 동시에 카운트 초기값을 지정하는 부분으로 딱 한 번 실행된다.
반복 조건식은 반복할 카운트의 종료값을 제시하며 조건식이 참(true)이면 아래의 블록 { } 안의 내용이 수행되며, 조건식이 거짓(false)이면 반복을 종료한다.
증감식은 블록 { } 안의 내용이 수행이 끝나면 카운트용 변수의 값에 증감 연산이 수행되고, 다시 앞의 조건식이 수행된다.
for문은 항상 조건식을 판별한 후에 끝난다. 즉 for문은 초기식 -> 조건식 -> 수행코드 -> 증감식 -> 조건식 -> 수행코드 -> 증감식의 순서로 진행되며, 증감식의 값의 증감량에 따라 for문의 반복횟수를 조절할 수 있다.

TestFor.java

01 public class TestFor {
02     public static void main(String[] args) {
03         int sum = 0;
04         for (int i = 1; i <= 100; i++) {
05             sum += i;
06         }
07         System.out.println("1부터 100까지 정수들의 합계 : " + sum);
08     }
09 }
------
1부터 100까지 정수들의 합계 : 5050

while

횟수가 정해지지 않은 반복 처리에 주로 사용되는 반복문으로, for문과 다르게 반복에 대한 조건식만 제시되며 조건식의 결과가 true일 동안 수행 영역 안의 내용이 반복적으로 실행되는 구조로 동작하는 구문이다. 조건식의 결과가 false일 때 반복을 종료한다.

01 while(조건식) {
02     // 조건식이 참(true)일 경우 실행되는 문장들
03 }

while문을 for문처럼 사용할 수도 있는데, 초기식과 증감식을 따로 지정하면 가능하다. 초기식은 while문 사용 전에 선언하고 증감식은 { } 안에 수행할 내용 마지막에 추가하면 된다.

TestWhile.java

01 public class TestWhile {
02     public static void main(String[] args) {
03         int i = 1; // 초기식
04         sum = 0;
05         while (I <= 100) { // 조건식
06             sum += i;
07             i++; // 증감식
08         }
09         System.out.println("1부터 100까지 정수들의 합 : " + sum);
10     }
11 }

do ~ while

do { } 안의 내용을 일단 한 번 실행한 다음, 아래에 있는 while 조건식의 결과에 따라 블록 { } 안의 내용에 대한 반복 실행을 결정하는 반복문이다.

01 do {
02     // 반복 조건이 참일 때 수행되는 문장들
03 } while(조건식); // 마지막에 세미콜론(;)을 반드시 표기해야 한다.

TestDoWhile.java

01 import java.util.Scanner;
02
03 public class TestDoWhile {
04     public static void main(String[] args) {
05         int value = 0, sum = 0;
06         Scanner sc = new Scanner(System.in);
07
08 do {
09     System.out.println("정수 숫자를 입력하세요. (종료는 : 99) : ");
10         value = in.nextInt();
11             sum += value;
12     } while(select != 99); // 루프 마지막에 조건을 비교하여 반복여부를 결정!
13
14        System.out.println("입력된 정수 값들의 합계 : " + sum);
15     Systemo.out.println("프로그램 종료!");
16     }
17 }

중첩 반복문

반복문도 중첩해서 사용할 수 있다. for문 안에 for문 또는 while문 안에 while문, for문 안에 while문, while문 안에 for문 등 반복문 종류에 상관없이 다양하게 중첩시킬 수 있다.

TestDupFor.java

01 public class TestDupFor {
02     public static void main(String[] args) {
03         for(int i = 2; i <= 9; i++) { // 2 ~ 9까지 열 반복
04 for(int j = 1; j <= 9; j++) { // 1 ~ 9까지 행 반복
05 System.out.print(i + " * " + j + " = " + (i * j) + "\t");
06 }
07 System.out.println();
08 }
09 }
10 }
------
2 x 1 = 2    2 x 2 = 4    2 x 3 = 6    2 x 4 = 8 ... 2 x 9 = 18
3 x 1 = 3    3 x 2 = 6    3 x 3 = 9    3 x 4 = 12 ... 3 x 9 = 27
...
9 x 1 = 9    9 x 2 = 18    9 x 3 = 27    9 x 4 = 36 ... 9 x 9 = 81

break

반복문의 실행 흐름에 변화를 줄 수 있는 문장으로, if문과 함께 사용되며 break문을 만나면 해당 반복문이 강제로 종료된다.

TestBreak.java

01 public class TestBreak {
02     public static void main(String[] args) {
03         int sum = 0;
04         for (int i = 1;   ; i++) { // 조건이 없으면 참으로 판별, 무한 반복
05             sum += i;
06             
07             if(i == 100) // i가 100일 때 for문 강제 종료
08             break;
09             }
10
11         System.out.println("1부터 100까지의 정수들의 합 : " + sum);
12     }
13 }
------
1부터 100까지의 정수들의 합 : 5050

break문은 for, while, do-while 모든 반복문에서 사용할 수 있다.
break를 포함하는 반복문 한 개만 종료시킬 수 있다. 중첩 반복문일 경우 범위가 가까운 반복문 한 개만 종료시킨다.

continue

break문과 마찬가지로 반복문의 흐름에 변화를 주는 문장이며, 반복할 내용의 중간 생략용으로 이용할 수 있다. 주로 if문과 함께 사용되며 조건식의 결과가 참일 때 continue를 실행하며 continue 아래의 반복 수행 구문을 생략하고 for문 일 때는 증감식으로, while문 일 때는 조건식으로 이동한다.

TestContinue.java

01 public class TestContinue {
02     public static void main(String[] args) {
03         int sum = 0;
04         for (int i = 1; i <= 100; i++) {
05             // 홀수들의 합계만 처리할 경우, 짝수는 건너뛰게 처리하려면
06             if(i % 2 == 0) continue;
07             System.out.print(i + " + ");
08         }
09         System.out.println("\n 1부터 100까지의 홀수들의 합 : " + sum);
10     }
11 }

점프 break, continue (Labeled break, continue)

break와 continue가 한 개의 반복문만 탈출하는 특성을 보완하기 위해 나온 구문으로 for, while, do-while문에 사용할 수 있으며, 한 번에 여러 단계의 중첩 반복문을 빠져나가게 할 때 이용할 수 있다. 각각 for 구문 앞, while 구문 앞, do 구문 앞에 이름(Label)을 표시해 두고 사용해야 한다.
이름은 'LABEL 명:' 으로 표시하면 된다.

TestMultiBreak.java

01 public class TestMultiBreak {
02     public static void main(String[] args) {
03         label;
04         for( ;  ; ) {
05             for (int i = 0; i < 10; i++) {
06                 System.out.println(i);
07                 if(i == 5) break label; // i값이 5가 되면 반복을 종료
08             }
09         }
10     }
11 }

0개의 댓글

관련 채용 정보