[이것이자바다] Chapter 04. 조건문과 반복문

kims·2023년 11월 21일
0

이것이자바다

목록 보기
4/9
post-thumbnail

4.1 코드 실행 흐름 제어

  • 자바 프로그램은 main( ) 메서드의 시작 중괄호 {에서 끝 중괄호 }까지 위에서부터 아래로 실행하는 흐름을 가진다.
  • 제어문은 이러한 실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주며, 연산 결과에 따라 블록 내부의 실행 여부가 결정된다.
    main메서드

4.2 if문

  • if문은 조건식의 결과에 따라 블록 실행 여부가 결정된다.
  • 조건식에는 true 또는 false 값을 산출할 수 있는 연산식이나 boolean 변수가 온다.
  • 조건식이 true면 블록을 실행하고, false면 블록을 실행하지 않는다.
  • if문은 else블록과 함께 사용되며, 조건식이 ture면 if문 블록이 실행되고, false면 else 블록이 실행된다.
  • 조건문이 여러 개인 경우 else if 블록이 사용되고,
    상위 조건식부터 아래로 평가하며 true라면 else if 블록이 실행되고 전체 if문을 벗어나게 된다.
    만약 모든 조건식이 false일 경우 else 블록이 실행되고 if문을 벗어나게 된다.
  • if문은 조건식의 결과가 true, false 두 가지밖에 없기 때문에 경우의 수가 많아질수록
    else if를 반복적으로 추가해야 하무로 코드가 복잡하다.
public class IfEx {
    public static void main(String[] args) {
        int num = (int) (Math.random() * 20) + 1;

        if (num % 2 == 0) {
            System.out.println("1번째 조건식");
            System.out.printf("num : %d, 2의 배수입니다.\n", num);
        } else if (num % 3 == 0) {
            System.out.println("2번째 조건식");
            System.out.printf("num : %d, 3의 배수입니다.\n", num);
        } else if (num % 5 == 0) {
            System.out.println("3번째 조건식");
            System.out.printf("num : %d, 5의 배수입니다.\n", num);
        } else {
            System.out.println("2 또는 3 또는 5의 배수가 아닙니다. num : " + num);
        }
    }
}

실행결과

4.3 switch문

  • 변수값에 따라 실행문이 결정되기 때문에 if문 보다 코드가 간결하다.
  • 변수값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행시킨다. (default 생략 가능)
  • break는 다음 case를 실행하지 않고 switch문을 빠져나가게 해준다.
    만약, break가 없다면 다음 case가 연달아 실행되는데, 이때는 case 값과는 상관없이 실행된다.
  • switch 문의 괄호에는 정수타입과 문자열 타입 변수를 사용할 수 있다.
  • Java 12이후부터는 표현식(Expressions)을 사용해 break문 대신 화살표(->)와 중괄호로 사용한다.
    또한, 단일 값일 경우에는 화살표 오른쪽에 값을 기술해 변수에 바로 대입할 수 있다.
  • Java 13이후부터는 중괄호를 사용할 경우 yield 키워드로 값을 지정해 변수에 바로 대입 가능하다.
public class SwitchEx {
    public static void main(String[] args) {
        String season = "겨율";

        // Java 11 이전 문법
        String food = "";
        switch (season) {
            case "봄" :
                food = "딸기케이크";
                break;
            case "여름" :
                food = "빙수";
                break;
            case "가을" :
                food = "와플";
                break;
            default:
                food = "떡볶이";
        }

        System.out.println(food);	// 떡볶이
    }
}
public class SwitchEx {
    public static void main(String[] args) {
        String season = "가을";

        // Java 12부터
        String food = switch (season) {
            case "봄" -> "딸기케이크";
            case "여름", "가을" -> "빙수, 와플";
            default -> "떡볶이";
        };

        System.out.println(food);   // 빙수, 와플
    }
}
public class SwitchEx {
    public static void main(String[] args) {
        String season = "여름";

        // Java 13부터
        String food = switch (season) {
            case "봄" -> "딸기케이크";
            case "여름", "가을" -> {
                String summerFood = "빙수";
                yield summerFood + "," + "와플";
            }
            default -> "떡볶이";
        };

        System.out.println(food);   // 빙수,와플
    }
}

4.4 for문

  • 똑같은 실행문을 반복적으로 실행할 때 사용한다.
public class ForEx {
    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            System.out.println("hello world, i의 값 : " + i);
            // hello world, i의 값 : 0
            // hello world, i의 값 : 1
        }
    }
}

💡 실행순서

  • 1) 초기화식 int i = 0; 실행
  • 2) 조건식i < 2; 평가
  • 2.1) true면 실행문 System.out.println("hello world, i의 값 : " + i); 실행
  • 2.1.1) 증감식 i++ 실행 → 2) 부터 반복
  • 2.2) false면 for문 종료
  • 초기화식과 증감식이 둘 이상 있을 수 있다. 이런 경우에는 같이 쉼표(,)로 구분해 작성한다.
  • 초기화식에서 선언된 변수는 for문 블록 안에서만 사용되는 로컬 변수이다.
public class ForEx {
    public static void main(String[] args) {
        // Q. for문을 이용해 1부터 100까지의 정수 중 3의 배수의 총합을 출력하는 코드를 작성하세요.
        int total = 0;
        for (int i = 1; i <= 100 ; i++) {
            if (i % 3 == 0) {
                total += i;
                System.out.println(i);
            }
        }

        System.out.println("3의 배수 총합 : " + total);  // 3의 배수 총합 : 1683
    }
}
  • for문 안에 또 다른 for문이 있는 형태를 중첩된 for문이라고 한다.
    바깥 for문이 1번 실행될 때마다 중첩된 for문은 지정 횟수만큼 반복하고 다시 바깥 for문으로 돌아간다.
public class ForEx {
    public static void main(String[] args) {
        // Q. 중첩 for문을 이용해 방정식 4x + 5y = 60의 모든 해를 구해서 (x, y) 형태로 출력하여라. 단, x와 y는 10 이하의 자연수이다.
        for (int i = 1; i <= 10 ; i++) {
            int resultX = 4 * i;
            for (int j = 1; j < 10; j++) {
                int resultY = 5 * j;
                if (resultX + resultY == 60) {
                    System.out.printf("(%d, %d)\n", i, j);
                    // (5, 8)
                    // (10, 4)
                }
            }
        }
    }
}

4.5 while문

  • while문은 조건식이 true일 경우에 계속 반복하고, false가 되면 반복을 멈추고 while 문을 종료한다.
public class WhileEx {
    public static void main(String[] args) {
        /*
        Q. while문과 Math.random() 메소드를 이용해 두 개의 주사위를 던져 (눈1, 눈2)형태로 출력
           눈의 합이 5가 아니면 계속 주사위를 던지고, 눈의 합이 5이면 실행을 멈춘다.
        */
        while (true) {
            int firstDice = (int) (Math.random() * 6) + 1;
            int secondDice = (int) (Math.random() * 6) + 1;
            if (firstDice + secondDice == 5) {
                break;
            }
            
            System.out.printf("(%d, %d)\n", firstDice, secondDice);
            // (2, 2)
            // (5, 6)
            // (5, 3)
            // (2, 4)
            // (2, 5)
            // (5, 4)
            // (2, 6)
            // (3, 1)
            // (6, 4)
            // (2, 1)
            // (3, 6)
            // (1, 2)
            // (1, 3)
        }
    }
}

💡 실행순서

  • 1) 조건식 ture 평가
  • 1.1) true면 실행문 int firstDice 부터 if조건문 ~ System.out.printf까지 실행 → 1) 부터 다시 반복
  • 1.2) false면 while문 종료
  • 조건식에 ture 사용하면 무한 반복하게 되는데, 이 경우 while문을 빠져나가기 위한 코드가 필요하다. 위 코드에서는 if 조건문이 해당된다.

4.6 do-while문

  • 실행문을 먼저 실행시키고, 실행 결과에 따라 반복 실행 여부를 결정할 때 do-while문을 사용한다.
import java.util.Scanner;

public class WhileEx {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int inputNumber;

        do {
            System.out.println("1 부터 9 까지의 숫자를 입력하세요.");
            inputNumber = scanner.nextInt();
            System.out.println(inputNumber);
        } while (inputNumber != 3);

        System.out.println("숫자 입력이 종료되었습니다.");
    }
}

실행결과

💡 실행순서

  • 1) 실행문 do 블록 실행
  • 2) 조건식 inputNumber != 3 평가
  • 2.1) true면 1) → 2) 반복 실행
  • 2.2) false면 do-while문 종료

4.7 break문

  • 반복문실행 중지하거나 조건문종료할 때 사용한다.
  • 중첩된 반복문에서 break문은 가장 가까운 반복문만 종료시킨다.
public class ForEx {
    public static void main(String[] args) {
        for (int i = 5; i >= 1; i--) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*");

                if (j == 3) {
                    System.out.println("[ @ ]");
                    break;
                }
            }
            System.out.println();
            System.out.println("--- 바깥 for문 ---, i 값 : " + i);
        }
    }
}

break문 예제

4.8 continue문

  • 반복문에서만 사용되며, continue문이 실행되면 조건식으로 바로 이동한다.
  • continue문은 break문과 다르게 반복문을 종료하지 않고 계속 반복 수행한다.
public class ForEx {
    public static void main(String[] args) {
        for (int i = 5; i >= 1; i--) {
            for (int j = 1; j <= i; j++) {
                if (j == 3) {
                    continue;
                }

                System.out.print(" " + j + " ");
            }
            System.out.println();
            System.out.println("--- 바깥 for문 ---");
        }
    }
}

continue문 예제


profile
기술로 세상을 이롭게

0개의 댓글