Home Java 기초 - 제어문(Control Flow Statements)
Post
Cancel

Java 기초 - 제어문(Control Flow Statements)

Overview

일반적으로 코드의 흐름은 위에서 아래로 향합니다. 제어문을 사용하면 코드의 흐름을 개발자가 원하는 방향으로 바꿀 수 있습니다. 제어문은 if문, switch문을 사용하는 조건문과 for문, while문, do while문을 사용하는 반복문으로 분류된다.

  • 조건문 : if문, switch
  • 반복문 : for문, while문, do while

학습 목표

  • 조건문 기초, 실습
    • if 와 else if , else, switch를 이해하고 활용할 수 있다.
    • 논리연산자(&&, ||, ! …)를 활용하여 복잡한 조건을 간결하게 작성할 수 있다.
  • 조건문 문제로 배우는 알고리즘
    • 복잡한 조건문을 활용하여, 실생활에서 마주하는 문제를 해결하기 위한 알고리즘을 구현할 수 있다.
  • 반복문 기초 / 실습
    • 반복문을 활용하여 단순한 기능을 반복하여 수행할 수 있다.
    • 반복문과 문자열, 숫자를 이용해 반복적으로 코드를 실행시킬 수 있다.
    • 반복문을 다양하게 응용하여 활용할 수 있다.
    • for문과 while문의 공통점과 차이점을 이해할 수 있다.
    • 반복문에 조건문을 적용하여 특정 조건에서만 코드가 실행되도록 할 수 있다.
    • 이중 for문이 무엇인지 이해하고 활용할 수 있다.

1. 조건문

1.1. if 문

  • if문의 소괄호 안에는 boolean 값으로 평가될 수 있는 조건식을 넣어주고
  • 중괄호 안의 실행 블록에는 조건식이 참일 때 실행하고자 하는 코드 작성
1
2
3
if (조건식) {
	//조건식이 참이라면 실행되는 블록입니다.
}

블록(block): 중괄호({})를 이용해 여러 문장을 하나의 단위로 묶음

1.2. if…else문

  • if...else문은 조건식의 결과에 따라 실행블록을 선택
  • if문의 조건식이 true이면 해당 블록이 실행되고, 조건식이 false이면 다음으로 넘어가 else if 문의 조건식을 검사
  • else if문의 모든 조건식이 false라면, 나머지 경우를 의미하는 else 블록이 실행
1
2
3
4
5
6
7
8
9
10
if(조건식1) {
	//조건식1이 참이라면, 실행되는 블록입니다.
}
else if (조건식2) {
	//조건식1이 참이 아니면서 조건식2가 참일 때, 실행되는 블록입니다.
}
else {
	//조건식1과 2가 모두 참이 아닐 때, 실행되는 블록입니다.
	//else문은 생략 가능합니다.
}
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
29
30
31
32
package com.company;

import java.util.Scanner;

public class Main {
    static Scanner myInput = new Scanner(System.in);
    public static void main(String[] args) {
        String dice = myInput.nextLine(); //주사위 번호 입력값을 받아옵니다.

        if (dice.equals("1")) { // 입력한 주사위 번호가 1이면 다음 블록을 실행
            System.out.println("1번"); // 콘솔에 "1번"을 출력
        }
        else if (dice.equals("2")) {
            System.out.println("2번");
        }
        else if (dice.equals("3")) {
            System.out.println("3번");
        }
        else if (dice.equals("4")) {
            System.out.println("4번");
        }
        else if (dice.equals("5")) {
            System.out.println("5번");
        }
        else if (dice.equals("6")) {
            System.out.println("6번");
        }
        else {
            System.out.println("없는 숫자! " + dice);
        }
    }
}

1.3. 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
29
30
31
32
33
34
package com.company;

import java.util.Scanner;

public class Main {
    static Scanner myInput = new Scanner(System.in);
    public static void main(String[] args) {
        String dice = myInput.nextLine(); //주사위 번호 입력

        switch (dice) {
            case "1":
                System.out.println("1번");
                break; //다음 case를 실행하지 않고, switch문 탈출!
            case "2":
                System.out.println("2번");
                break;
            case "3":
                System.out.println("3번");
                break;
            case "4":
                System.out.println("4번");
                break;
            case "5":
                System.out.println("5번");
                break;
            case "6":
                System.out.println("6번");
                break;
            default: //switch문의 괄호 안 값과 같은 값이 없으면, 여기서 실행문 실행
                System.out.println("없는 숫자! " + dice);
                break;
        }
    }
}
  • 괄호 안의 값과 동일한 값을 갖는 case로 가서 실행문을 실행
  • 만약 괄호 안의 값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행(default는 생략 가능)
  • case안의 실행문을 실행하고 실행이 완료되면 break를 통해서 switch문을 탈출
  • fall through: break문을 작성하지 않으면 switch문을 탈출하지 않고 모든 case문을 실행하게 되어 원하는 방식으로 동작하지 않음
  • switch문에는 int 뿐만 아니라, char 타입 변수도 사용가능하고, 자바 7부터는 String 타입의 변수도 올 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 직급을 입력받아 값에 따라 해당하는 월급을 출력하는 예제
package com.company;

public class Main {
    static Scanner userInput = new Scanner(System.in);

    public static void main(String[] args) {
        String yourPosition = userInput.nextLine(); //입력받기

        switch(yourPosition){
            case "Senior" : // Senior일 경우
                System.out.println("700만원");
                break;

            case "Junior" :  //Junior 또는 Manager일 경우
            case "Manager" : //실행문이 같으면 이렇게 작성 가능
                System.out.println("500만원");
                break;
            default:
                System.out.println("300만원");
                break;
        }
    }
}

자바 14에서 표준화된 향상된 switch문(enhanced switch문)

  1. 여러조건에 따라, , 로 구분하여 한 번에 처리할 수 있다.
  2. : 대신에 > 를 사용하고, break문이 생략 ( > 람다식과 유사하게 화살표를 사용하여 람다 스타일 구문이라고도 함)
  3. > 를 사용했다면 실행문이 2개 이상이거나, 반환값이 존재할 경우 중괄호 블록({ })을 사용( :을 사용하면, 실행문이 여러개라 할지라도 중괄호 블록({ })을 사용하지 않아도 됨 )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//직급별 월급 출력하기
package com.company;

public class Main {
    static Scanner userInput = new Scanner(System.in);

    public static void main(String[] args) {
        String[] positionList = {"Manager", "Senior", "Junior"};
        String yourPosition = userInput.nextLine(); // 입력 받기

        switch (yourPosition) {
            case "Senior" -> System.out.println("700만원");
            case "Junior", "Manager" -> System.out.println("500만원");
        }
    }
}

2. 반복문

반복문은 코드들이 반복적으로 실행되도록 할 때 사용

  • for문 (반복횟수를 알고 있을 때 주로 사용)
  • while문 (조건에 따라 반복할 때 주로 사용)
  • do-while

2.1. for문

조건식이 참인 동안 주어진 횟수만큼 실행문을 반복적으로 수행

1
2
3
4
5
6
7
8
9
10
public class Main {
  public static void main(String[] args) {
    int sum = 0;
    // for (초기화; 조건식; 증감식)
    for(int num = 0; num < 10; num++) {
      sum += num;
    }
    System.out.println(sum); // 1~9의 합인 45가 출력됩니다.
  }
}

향상된 for문 (Enhanced for 문)

향상된 for문은 반복실행을 하기 위해 카운터 변수와 증감식을 사용하지 않는다.

배열 및 컬렉션 항목의 개수만큼 반복하고 자동적으로 for문을 빠져나간다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class EnhancedForLoop {
  public static void main(String[] args) throws Exception {
    String[] names = {"kimcoding", "javalee", "ingikim"};
    for(String name : names) { // 배열에서 꺼낸 항목을 저장할 변수 선언, 콜론( : ), 그리고 사용할 배열이 작성
      System.out.println(name + "님은 자바를 공부중 입니다.");
    }
  }
}
/*
kimcoding님은 자바를 공부중 입니다.
javalee님은 자바를 공부중 입니다.
ingikim님은 자바를 공부중 입니다.
*/

2.2. while문

for문이 정해진 횟수만큼 반복한다면, while문은 조건식이 true일 경우에 계속해서 반복

1
2
3
4
5
(초기화); // 필요가 없다면 생략 가능
while(조건식) {
  실행문; //조건식이 참인 동안 실행
  증감식; // 필요가 없다면 생략 가능
}
1
2
3
4
5
6
int num = 0, sum = 0; // 정수 타입의 변수를 선언하고 초기값으로 0을 대입
while(num <= 10) { // num이 10인 경우까지 반복
  sum += num; //sum = sum + num과 같은 식, 복합 대입 연산자 "+="를 사용한 표현 -> sum이 현재의 num만큼 증가하고
  num++; //  num이 1 증가
}
System.out.println(sum);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
  public static void main(String[] args) {
  boolean run = true;
  int num = 1;

    while(run){ // while(true) 조건문
      num++; // 실행문
      System.out.println(num); // 실행문

      if(num == 22) { // 조건문, num이 22가 되면 탈출! 얏호!
        run = false;
      }
    }
  }
}

2.3. do-while문

  • 조건식에 의해 반복 실행한다는 점에서는 while문과 동일
  • 블록 내부의 실행문을 우선 실행시키고 실행 결과에 따라서 반복 실행을 계속 할지 결정
1
2
3
do {
  (1)실행문 //처음 한 번은 무조건 실행
} while((2)조건식);

do-while문이 처음 실행될 때

  • (1)실행문을 먼저 실행합니다.
  • (1)실행문이 모두 실행되면 (2)조건식을 평가
  • 그 결과가 true이면 (1)실행문 → (2)조건식으로 반복 실행
  • false이면 do-while문을 종료
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 1~10 사이의 정수를 변수 randomNum에 저장하고 이 값을 맞출 때까지 반복하는 do-while문
import java.util.Scanner;

public class Main {
  public static void main(String args[]){
    int input = 0, randomNum = 0;

      randomNum = (int)(Math.random() * 10) + 1; // 1 ~ 10 임의의 수를 생성
      Scanner scanner = new Scanner(System.in);

      do{
        System.out.println("1과 10 사이의 정수를 입력하세요");
        input = scanner.nextInt();

        if(input > randomNum) {
          System.out.println("더 작은 정수를 입력하세요");
        } else if (input < randomNum) {
          System.out.println("더 큰 정수를 입력하세요");
        }
      } while(input != randomNum);
      System.out.println(randomNum +" 정답입니다!");
  }
}

2.4. break문

  • 반복문인 for문, while문, do-while문을 실행 중지할 때 사용
  • switch문에서도 break문을 사용하여 switch문을 종료
  • 대개 if문과 같이 사용되며, if문의 조건식에 따라 for / while문을 종료 할 때 사용
  • 반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료하고, 바깥쪽 반복문에는 영향을 끼치지 않는다.
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
public class Main {
    public static void main(String[] args) {
        Outer : for (int i = 3; i < 10; i++) { // 3부터 9까지 반복 Outer라는 라벨을 붙이고, 이를 break문에 사용 한다.
            for (int j = 5; j > 0; j--) { //  5부터 1까지 반복
                System.out.println("i " + i + " j "+ j);
                if (i == 5) {
                    break Outer; // 레이블문을 쓰면, 중첩된 for문 안에서도 바깥쪽 for문까지 완벽하게 빠져나올 수 있다.
                }
            }
        }
    }
}
/*
i 3 j 5
i 3 j 4
i 3 j 3
i 3 j 2
i 3 j 1
i 4 j 5
i 4 j 4
i 4 j 3
i 4 j 2
i 4 j 1
i 5 j 5
*/

2.5. continue문

  • for문, while문, do-while문에서만 사용
  • 블록 내부에서 continue문이 실행되면 for문의 증감문 혹은 while, do-while문의 조건식으로 이동하여 작동
  • continue문과 break문의 차이점은 반복문 종료 여부
  • continue문은 반복문을 종료하지 않고 다음 차례로 넘어가 계속 반복을 수행,
  • 보통 if문과 함께 사용하는데, if문의 조건을 만족하는 경우 continue문을 실행하여 그 이후의 코드를 실행하지 않고 다음 반복으로 넘어감
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 1 ~10까지의 수 중에서 홀수만 출력하는 코드
public class Main {
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0) { //나머지가 0으로 짝수인 경우는 다시 for문의 증감문으로 이동하여 다음 반복을 실행하고, 홀수만 출력
                continue; //다음 반복으로 넘어간다.
            }
            System.out.println(i); //홀수만 출력
        }
    }
}
/*
1,3,5,7,9
*/

Reference

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

Java 기초

Section 1 회고

Comments powered by Disqus.