Post

[Java Live Study] 4. 제어문(Control Statements)

백기선 강사님의 live study에 나온 주제들을 혼자 공부하고 정리하여 작성한 글입니다.⚓

📌 4주차 목표: Java 제공하는 제어문을 학습하기

소스코드

[0] 개요

프로그램은 일반적으로 위에서부터 아래 방향으로 실행되는데, 제어 흐름문을 사용하면 실행 흐름을 분리하여 조건에 따라 특정 코드 블록을 실행하도록 할 수 있다.

3가지로 나눌 수 있다.

  • 의사 결정문(Decision-Making Statements): if-then, if-then-else, switch
  • 반복문(Looping Statements): for, while, do-while
  • 분기문(Branch Statements): break, continue, return

[1] 의사 결정문(Decision-Making Statements)

if-then

  • if절의 결과가 true이면 then절을 실행하고, falsethen절을 건너 뛴다.
  • then절에 구문이 1개면 중괄호({...})를 생략할 수 있다.
1
2
3
if (isDeleted) // if clause
    // then clause
    System.out.println("This is already deleted!");

if-then-else

1
2
3
4
5
6
7
if (isDeleted) // if clause
    // then clause
    System.out.println("This is already deleted!");
else {
    deleted = true;
    System.out.println("Successfully deleted!");
}

if-then-elseif-else

1
2
3
4
5
6
7
8
9
10
11
12
int score = 70;
char grade;

if (score >= 90) {
    grade = 'A';
} else if (score >= 75) {
    grade = 'B';
} else if (score >= 60) {
    grade = 'C';
} else {
    grade = 'F';
}

switch

사용가능한 자료형

  • 기본형(Primitive Type)중에서 byte, short, char, int
  • 래퍼 클래스(Wrapper Class)중에서 Byte, Short, Character, Integer
  • Enum Types
  • String (Java 7 이상)

키워드

  • case value:: 각각의 경우를 나열
  • default:: 어느 case에도 속하지 않는 경우 (선택사항)
  • break: 이후의 case문을 실행하지 않고 switch문 종료

🔽 올바르게 작성된 switch문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int dayNum = 2;
String dayString = "";
switch (dayNum) {
    case 1:
        dayString = "Monday";
        break;
    case 2:
        dayString = "Tuesday";
        break;
    case 3:
        dayString = "Wednesday";
        break;
    case 4:
        dayString = "Thursday";
        break;
    case 5:
        dayString = "Friday";
        break;
    case 6:
        dayString = "Friday";
        break;
    case 7:
        dayString = "Friday";
        break;
    default:
        System.out.println("Invalid number for day");
}
    System.out.println(dayString); // "Tuesday"

🔽 break를 생략하면…

  • break를 만날 때까지 하위 case문을 거쳐 default문까지 모두 실행된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int dayNum = 2;
String dayString = "";
switch (dayNum) {
    case 1:
        dayString = "Monday";
    case 2:
        dayString = "Tuesday";
    case 3:
        dayString = "Wednesday";
    case 4:
        dayString = "Thursday";
        break;
    case 5:
        dayString = "Friday";
        break;
}
    System.out.println(dayString); // "Thursday"

🔽 여러 case 묶어 표현하기

1
2
3
4
5
6
7
8
9
10
11
12
13
int dayNum = 6;
String dayString = "";
switch (dayNum) {
    case 1: case 2: case 3: case 4: case 5:
        dayString = "Weekday";
        break;
    case 6: case 7:
        dayString = "Weekend";
        break;
    default:
        System.out.println("Invalid number for day");
}
    System.out.println(dayString); // "Weekend"

[2] 반복문(Looping Statements)

while

  • while문의 조건이 true이면 반복 수행한다.
1
2
3
4
5
int count = 1;
while (count < 3) {
    System.out.println("The count: " + count);
    count++;
}
1
2
The count: 1
The count: 2

do-while

  • do문을 먼저 실행한 후, while문의 조건이 true이면 다시 do문을 반복 수행한다.
  • do문이 최소 1회 실행되는 것을 보장한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int count = 4;

// while문
System.out.println("========== while ==========");
while (count < 3) {
    System.out.println("The count: " + count);
    count++;
}

// do-while문
System.out.println("========== do-while ==========");
do {
    System.out.println("The count: " + count);
    count++;
} while (count < 3)
1
2
3
========== while ==========
========== do-while ==========
The count: 4

for

1
2
3
for (initialization ; termination ; increment) {
    statements
}
  • initialization은 최초 1회만 실행된다.
  • terminationtrue면 반복 수행한다.
  • increment는 매 라운드 후에 실행된다.
1
2
3
for (int count = 3 ; count > 0 ; count--) {
    System.out.println("The count: " + count);
}

🔽 각각의 요소는 문법적으로 생략이 가능하다.

1
2
3
4
5
6
7
8
9
int count = 3;
for (;;) {
    if (count > 0) {
        System.out.println("The count: " + count);
        count--;
    } else {
        break;
    }
}
1
2
3
The count: 3
The count: 2
The count: 1

Enhanced for

  • Collections배열([])에 사용할 수 있다.
1
2
3
4
int[] nums = {1, 2, 3};
for (int num : nums) {
    System.out.println("The number: " + num);
}
1
2
3
The number: 1
The number: 2
The number: 3

forEach

  • Java 8 이상부터 사용 가능하다.
  • Collections에 사용 가능하다.
1
2
List<Integer> list = Arrays.asList(1, 2, 3);
list.forEach(n -> System.out.println("The number: " + n));
1
2
3
The number: 1
The number: 2
The number: 3

[3] 분기문(Branching Statements)

break

  • 반복문을 종료할 때 사용한다.
  • unlabeled breaklabeled break가 있다.

예제로 비교해보면 이해가 쉽다.

unlabeled break

  • break를 하면 가장 안쪽에 위치한 switch, for, while, do-while를 종료한다.
1
2
3
label:
    ... // statements
    break label;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int[][] nums = { { 32, 87},
                 { 12, 1076},
                 { 622, 127 } };
int searchfor = 12;
int i;
int j = 0;
boolean isfound = false;

for (i = 0; i < nums.length; i++) {
    for (j = 0; j < nums[i].length; j++) {
        if (nums[i][j] == searchfor) {
            isfound = true;
            break;
        }
    }
}

if (isfound) {
    System.out.println("Found " + searchfor + " at " + i + ", " + j);
} else {
    System.out.println(searchfor + " not in the array");
}
1
Found 12 at 3, 2
  • 안쪽 for문만 종료되기 때문에 찾고자하는 값을 찾은 이후 i = 1에 대한 탐색은 건너뛰지만 i = 2는 실행된다. (예제에서 보면 32 -> 87 -> 12 -> 622 -> 127에 대해서 탐색함)

labeled break

  • break label_name를 하면 바깥쪽에 위치한 실행문을 종료한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int[][] nums = { { 32, 87},
                 { 12, 1076},
                 { 622, 127 } };
int searchfor = 12;
int i;
int j = 0;
boolean isFound = false;

search:
    for (i = 0; i < nums.length; i++) {
        for (j = 0; j < nums[i].length; j++) {
            if (nums[i][j] == searchfor) {
                isFound = true;
                break search;
            }
        }
    }

if (isFound) {
    System.out.println("Found " + searchfor + " at " + i + ", " + j);
} else {
    System.out.println(searchfor + " not in the array");
}
1
Found 12 at 1, 0
  • (1, 0)에서 찾고자하는 값을 찾은 후 for문이 바로 종료되는 것을 확인할 수 있다.

continue

  • 반복문에서 현재 라운드를 넘길(skip) 때 사용한다.
  • unlabeled continuelabeled continue가 있다.

🔽 oracle - labeled continue 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String string = "search super substring";
String searchTerm = "sub";
boolean isFound = false;

int max = string.length() - searchTerm.length();

search:
    for (int i = 0; i <= max; i++) {
        int n = searchTerm.length();
        int j = i;
        int k = 0;
        while (n-- != 0) { // searchTerm의 길이 만큼 순회하면서
            if (string.charAt(j++) != searchTerm.charAt(k++)) { // searchTerm의 문자 하나하나씩 비교하여 다르면
                continue search; // 다음 i로 이동
            }
        }
        isFound = true;
        break search; // 바깥쪽 for문 종료
    }
    System.out.println(isFound ? "Found it" : "Didn't find it");

return

  • 값을 반환하거나
1
return i;
  • 계산 값을 반환하거나
1
return i++;
  • 아무것도 반환하지 않을 수 있다.(메서드 리턴타입이 void일 때 사용)
1
return;

🚧과제 추가중🚧

참고

This post is licensed under CC BY 4.0 by the author.