공부/전자컴퓨터공학

Java 제어문(Control Flow Statements) 조건문과 반복문

AhJustC 2024. 5. 22. 01:53
반응형
Java 제어문

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

 

if문

if 문의 소괄호 안에는 boolean 값으로 평가될 수 있는 조건식을 넣어주고 중괄호 안의 실행 블록에는 조건식이 참일 때 실행하고자 하는 코드를 적어주면 된다.

if (조건식) {
	//조건식이 참이라면 실행되는 블록
}

 

if...else 문

if,,,else문은 조건식의 결과에 따라 실행 블록을 선택한다. if문의 조건식이 true 이면 해당 블록이 실행되고, 조건식이 false 이면 다음으로 넘어가 else if 문의 조건식을 검사한다. else if 문의 모든 조건식이 false 이면 나머지의 경우를 의미하는 else 블록이 실행된다.

if(조건식1) {
	//조건식1이 참이라면, 실행되는 블록
}
else if (조건식2) {
	//조건식1이 참이 아니면서 조건식2가 참일 때, 실행되는 블록
}
else {
	//조건식1과 2가 모두 참이 아닐 때, 실행되는 블록
	//else문은 생략 가능
}

 

주사위 출력 예제

아래는 입력된 주사위 번호를 입력하면 입력한 번호가 몇번인지 출력하고,1~6 이외의 입력을 받을 때는 없는숫자라고 출력이 되는 코드이다.  

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);
        }
    }
}
반응형
Switch문

switch문도 if 문과 마찬가지로 조건 제어문이다. 하지만 switch 문은 if 문처럼 조건식이 true 일 경우 블록 내부의 실행문을 실행하는 것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행문을 선택한다. if...else문의 경우 true와 false 값만으로 조건식을 나타낼 수 없기 때문에 경우의 수가 많아질 수록 if...else를 반복적으로 추가해야하여 코드가 복잡해진다. 하지만 switch 문의 경우 변수의 값에 따라서 실행문이 결정되므로 비교적 간결하게 나타낼 수 있다.

switch 문은 괄호 안의 값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행한다. default는 else와 비슷하게 생략 가능하다. 다만 주의할 점은 break문을 작성하지 않을 경우 switch문을 탈출하지 못하고 아래의 case문을 실행하게 되어 원하는 값을 얻지 못할 수 있으며 이를 fall through 라고 한다.

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문이 break 되어 switch문을 탈출하는 것을 볼 수 있었다. 아래의 예제를 통해 switch문에는 int 뿐만 아니라, char 타입 변수도 사용 가능한 것을 알 수 있다. Java 7 이후 버전 부터는 String 타입의 변수도 올 수 있다.

 

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;
        }
    }
}

 

점수 구간별 학점 출력하기 예제 

위에서 배운 조건문을 토대로 아래 요구사항을 만족하는 코딩을 해보자.

  • (100 - 90) --> A
  • (89 - 80) --> B
  • (79 - 70) --> C
  • (69 - 60) --> D
  • 만약 점수의 1의 자리가 0~2 사이라면 등급과 함께 " "를 반환해야 한다.
  • 만약 점수의 1의 자리가 8~9 사이라면 등급과 함께 +를 반환해야 한다.
  • 100점은 A+ 이다.
public class Solution {
  public String convertScoreToGradeWithPlusAndMinus(int score) {
    String grade;
    if (score > 100 || score < 0) {
      return "INVALID SCORE";
    }
    if (score == 100) {
      return "A+";
    }
    if (score >= 90) {
      grade = "A";
    } else if (score >= 80) {
      grade = "B";
    } else if (score >= 70) {
      grade = "C";
    } else if (score >= 60) {
      grade = "D";
    } else {
      grade = "F";
    }

    if (!grade.equals("F")) {
      int extra = score % 10;
      if (extra <= 2) {
        grade = grade + "-";
      } else if (extra >= 8) {
        grade = grade + "+";
      }
    }

    return grade;
  }
}

 

반복문

반복문은 코드들이 반복적으로 실행되도록 할 때 사용되며 반복문의 종류로는 for문, while문, do-while문이 있다. for문과 while 문은 서로 변환이 가능하기 때문에 반복문을 작성할 때 어느쪽을 사용하여도 나타낼 수 있지만, for문은 반복문의 횟수를 알 고 있을때, while 문은 조건에 따라 반복할 때 주로 사용한다.

 

For문
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가 출력됩니다.
  }
}

위의 코드가 실행되는 과정을 살펴보면 아래와 같다.

  • num이라는 변수를 선언하고, 초깃값으로 0을 대입
  • num는 현재 10보다 작으므로(num < 10), 실행 블록 안의 코드가 최초로 수행
  • 실행 블록을 빠져나오면 num이 1 증가 (i++)
  • num은 현재 1. 여전히 10보다 작으므로, 실행 블록 안의 코드가 두 번째로 수행
  • num이 9일 때까지 반복
  • num이 10이 되면 10보다 작다는 조건을 만족하지 못하므로, for문이 종료

초기화에 들어있는 int num 은 임의로 지정한 숫자 변수이다. 반복문에서는 iterator(반복계수)를 의미하는 i를 변수로 많이 쓴다. 초기화는 for문이 시작할 때 최초 한번만 수행되며, 사용할 변수의 초기값을 정한다. 조건식은 계속 반복할지 여부를 결정하는 것으로 num<10 조건에 해당 될 때까지 조건식을 반복하다가 false가 되면 블록을 실행하지 않고 끝난다. 증감식은 반복 횟수를 결정하는 규칙으로 num++은 값을 1씩 계속 증가하는 것이다.

 

while 문

for문이 정해진 횟수만큼 반복한다면, while 문은 조건식이 true 일경우에 계속해서 반복한다. 위의 for문 예시로 작성된 코드와 같은 기능을 하는 while문 코딩을 봐보자.

int num = 0, sum = 0;
while(num <= 10) {
  sum += num; //sum = sum + num과 똑같은 식. 복합 대입 연산자 "+="를 사용한 표현.
  num++;
}
System.out.println(sum);

 

do-while문

do-while문은 조건식에 의해 반복 실행한다는 점에서 while문과 동일하다. while문은 시작할 때부터 조건식을 검사하여 블록 내부를 실행할지 결정하지만, 경우에 따라서는 블록 내부의 실행문을 우선 실행시키고 실행 결과에 따라 반복실행할지 결정하는 경우도 있다. 

 

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 +" 정답입니다!");
  }
}

 

break문

break문은 반복문인 for문, while문, do-while문을 실행 중지할 때 사용된다. switch 문에서도 break문을 사용할 수 있다. break문은 대개 if 문과 같이 사용되며, if 문의 족건식에 따라 for, while문을 종료할 때 사용한다. 만역 반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료하고, 바깥쪽 반복문에는 영향을 끼치지 않는다.

public class Main {
    public static void main(String[] args) {
        Outer : for (int i = 3; i < 10; i++) {
            for (int j = 5; j > 0; j--) {
                System.out.println("i " + i + " j "+ j);
                if (i == 5) {
                    break Outer;
                }
            }
        }
    }
}
/*
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
*/

Continue문

continue 문은 반복문인 for, while, do-while 문에서만 사용되는데 블록 내부에서 continue 문이 실행되면 for문의 증감문 혹은 while do-while 문의 조건식으로 이동하여 작동한다. continue는 반복문을 종료하지 안ㄶ고 다음 차례로 넘어가 계속 다음 반복을 수행한다. 아래는 continue를 이용한 예제로 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일 경우는
                continue; //다음 반복으로 넘어간다.
            }
            System.out.println(i); //홀수만 출력
        }
    }
}
/*
1,3,5,7,9
*/
반응형