[Java] 조건문과 반복문이란?

2024. 8. 2. 16:36Java/조건문과 반복문

코드 실행 흐름 제어

자바는 main() 메소드의 시작 중괄호에서 끝 중괄호까지 순서대로 실행하는 흐름을 가지고 있다. 이 실행 흐름을 바꾸는 것이 흐름 제어문(제어문)이다. 제어문은 조건식과 중괄호 블록으로 구성되고, 조건 연산 결과에 따라 블록 내부 실행 여부가 결정된다. 

if문

if문은 조건식이 true면 블록을 실행하고 false면 실행하지 않는다. 중괄호 내에 실행문이 하나이면 중괄호를 생략할 수 있다. 하지만 가독성으로 인해 추천되지는 않는다. 

switch문

switch문은 변수의 값에 따라서 실행문이 결정되어 코드가 간결하다. 변수값에 따라 해당 case로 가서 실행문을 실행시킨다. 해당 사항이 없으면 default(생략 가능)로 가서 실행문을 실행시킨다. case끝에는 break를 반드시 써야 한다(단, 마지막 default는 필요없다)

 

*swhitch문의 제약 조건 

1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다. 

2. case문의 값은 정수 상수(문자 포함), 문자열만 가능하며 중복되지 않아야 한다. 

case문의 값으로 변수나 실수를 넣으면 에러가 발생한다. 즉, final이 붙은 정수 상수는 가능하고, 일반 변수는 사용할 수 없다. 

(<<자바의 정석 기초편>>, p.107)

 

....

int num, result;
final int ONE = 1;

...
switch(result){
   case '1':
   case ONE:
   case "YES":
   case num: //에러
   case 1.0: //에러
   ....
}

실행문이 같으면 중복도 가능하다. 한 줄에 하나씩 쓰던, 한 줄에 붙여쓰던 상관없다. 

(case 3: case 4: case 5:도 가능하다는 말)

public static void main(String[] args) {
    char grade = 'B';

    switch(grade){
      case 'A':
      case 'a':
        System.out.println("우수 회원입니다.");
        break;
      case 'B':
      case 'b':
        System.out.println("일반 회원입니다.");
        break;
      default:
        System.out.println("손님입니다.");
    }
  }

 

Java 12부터는 표현식을 사용할 수 있다. break를 생략할 수 있어서 가독성이 훨씬 좋아졌다. 실행문이 하나인 경우에는 중괄호도 생략이 가능하다. 

  public static void main(String[] args) {
    char grade = 'B';

    switch(grade){
      case 'A', 'a' -> {
        System.out.println("우수 회원입니다.");
      }
      case 'B', 'b'-> {
        System.out.println("일반 회원입니다.");
      }

      default -> {
        System.out.println("손님입니다.");
      }
    }
  }

 

Java 13부터는 yield 키워드로 값을 지정할 수 있다. 단, 이 경우에는 default가 반드시 존재해야한다. 

public class SwitchYieldExample {
    public static void main(String[] args) {
        String fruit = "apple";
        int calories = switch (fruit) {
            case "apple" -> 95;
            case "banana" -> 105;
            case "orange" -> 62;
            case "strawberry" -> {
                int quantity = 10;
                yield quantity * 4; // 딸기 10개의 칼로리
            }
            default -> 0;
        };

        System.out.println(fruit + "의 칼로리: " + calories);
    }
}

 

for문

for문은 실행문을 여러번 반복 실행한다. 

초기화식은 조건식과 실행문, 증감식에서 사용할 변수를 초기화하는 역할을 한다. 초기화식이 둘 이상 있을 수 있고, 증감식도 둘 이상 있을 수 있다. 이런 경우에는 쉼표로 구분한다. 초기화식에서 선언된 변수는 로컬 변수로 for문 밖에서 사용하고 싶으면 for문 이전에 선언해야 한다. 

 

부동소수점은 값을 정확히 표현할 수 없기 때문에 float 타입을 사용하면 안 된다. 

  public static void main(String[] args) {
    for(float x = 0.1f; x<=1.0f; x+=0.1f){
      System.out.println(x);
    }
  }

실행결과에 오차가 발생한다.

while문

for문이 정해진 횟수만큼 반복하다면, while문은 조건식이 true일 경우에 계속해서 반복하고, false가 되면 반복을 멈춘다. 조건식에 true을 사용하면 무한 반복하게 된다. 이 경우에는 식을 빠져나갈 break가 필요하다. 

do-while문

while과 동일하게 작동한다. 다만, 블록 내부를 먼저 실행시키고 반복 실행을 계속할지 결정한다. 주의할 점은 while() 뒤에 반드시 세미콜론을 붙여야 한다. 

break문

for,while,do-while문을 중지하거나 switch문을 종료할 때 사용한다. 만약 반복문이 중복될 경우에는 가장 가까운 반복문만 종료시킨다. 중첩된 반복문을 종료하려면 바깥쪽 반복문에 이름(레어블)을 붙이고, "break 이름;"을 사용하면 된다. 

  public static void main(String[] args) {
    Outter: for(char upper = 'A'; upper <= 'Z'; upper++) {
      for(char lower = 'a'; lower <= 'z'; lower ++) {
        System.out.println(upper + " - " + lower);
        if(lower == 'g'){
          break Outter;
        }
      }
    }
    System.out.println("프로그램 실행 종료");
  }
}

continue문

for문, while문, do-while문에서만 사용된다. continue문이 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 바로 이동한다. 

  public static void main(String[] args) {
    for(int i = 1; i <= 10; i++) {
      if(i%2 == 0) {
        continue;
      }
      System.out.print(i + " ");
    }
  }