공부/이것이 자바다

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

규투리 2022. 7. 27. 23:55
반응형

목차

    4.1 코드 실행 흐름 제어

    조건문과 반복문은 프로그래밍에 있어서 논리의 흐름을 정하는 가장 기본적인 기술이다.

    자바 프로그램을 시작하면 main() 메소드의 중괄호 시작과 끝까지 위 → 아래로 실행하는 흐름을 가지고 있다. 이러한 실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주는 것이 “흐름 제어문" 이다.

    제어문의 종류

    1. 조건문
      1. if문
      2. switch문
      3. 제어문 블록 실행 완료 → 정상흐름 comeback
    2. 반복문
      1. for문
      2. while문
      3. do-while문
      4. 제어문 블록 실행 완료 → 제어문 처음으로 다시 되돌아가 반복 실행 (looping)

    4.2 조건문(if문, switch문)

    4.2.1 if문

    if 문 안에 있는 조건식에는 ture 또는 false 값을 산출할 수 있는 연산식이나, boolean 변수가 올 수 있다.

    if 조건식

    • true → 블록 실행
    • flase → 블록 실행하지 않는다.

    예제

    public class IfExample {
    
        int score = 93;
    
        if (score >= 90) {                          // 조건식이 true
            System.out.println("점수가 90보다 큽니다.");
            System.out.println("등급은 A입니다.");
        }
    
        if (score < 90) {                           // 조건식이 false
            System.out.println("점수가 90보다 작습니다.");
            System.out.println("등급은 B입니다.");
        }
    }
    

    실행 결과

    점수가 90보다 큽니다.
    등급은 A입니다.
    

    4.2.2 if-else문

    if문 조건식

    • true ⇒ if 블록 실행
    • false ⇒ else 블록 실행

    예제

    public class IfElseExample {
    
        int score = 85;
    
        if (score >= 90) {
            System.out.println("점수가 90보다 큽니다.");
            System.out.println("등급은 A입니다.");
        } else {                                       // score가 90보다 작은 경우
            System.out.println("점수가 90보다 작습니다.");
            System.out.println("등급은 B입니다.");
        }
    }
    

    실행 결과

    점수가 90보다 작습니다.
    등급은 B입니다.
    

    4.2.3 if - else if - else문

    조건문이 여러 개인 if문도 있다. if문의 조건식이 false일 경우 다른 조건식의 결과에 따라 else if 문을 붙여 실행 블록을 선택할 수 있다.

    여러 개의 조건식 중 true가 되는 블록만 실행하고 전체 if문을 벗어나게 된다.

    예제

    public class IfElseIfElseExample {
    
        int score = 75;
    
        if (score >= 90) {
            System.out.println("점수가 90~100 입니다.");
            System.out.println("등급은 A입니다.");
        } else if (score >= 80) {                    // 80 <= score < 90 인 경우
            System.out.println("점수가 80~89 입니다.");
            System.out.println("등급은 B입니다.");
        } else if (score >= 70) {                    // 70 <= score < 80 인 경우
            System.out.println("점수가 70~79 입니다.");
            System.out.println("등급은 C입니다.");
        } else {                                     // score < 70 인 경우
            System.out.println("점수가 70 미만 입니다.");
            System.out.println("등급은 D입니다.");
        }
    }
    

    실행 결과

    점수가 70~79 입니다.
    등급은 C입니다.
    

    4.2.4 중첩 if문

    if문의 블록 내부에는 또 다른 if문을 사용할 수 있다.

    if문 뿐만이 아니라 switch, for, while, do-while도 가능하다.

    예제

    public class IfNestedExample {
        public static void main(String[] args) {
            int score = (int)(Math.random()*20) + 81;
            System.out.println("점수: " + score);
    
            String grade;
    
            if (score >= 90) {
                if (score >= 95) {  //중첩 if문
                    grade = "A+";   //90이면서 95이상이면
                } else {
                    grade = "A";    //90이지만 95미만이면
                }
            } else {
                if (score >= 85) {  //중첩 if문
                    grade = "B+";   //90미만이면서 85이상이면
                } else {
                    grade = "B";    //85미만이면
                }
            }
            System.out.println("학점: " + grade);
        }
    }
    

    실행 결과

    점수: 81
    학점: B
    

    4.2.5 switch문

    switch문은 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다.

    if문의 경우에는 조건식의 결과가 true, false 두 가지밖에 없기 때문에 경우의 수가 많아질수록 else if 를 반복적으로 추가해야 하므로 코드가 복잡해진다. 그러나 switch문은 변수의 값에 따라서 실행문이 결정되기 때문에 같은 기능의 if문보다 코드가 간결하다.

    switch문은 괄호 안의 값고 동일한 값을 갖는 case로 가서 실행문을 실행시킨다.

    또한, case 발견 시 break를 사용해서 다음 case를 실행시키지 말고 switch문을 빠져나가야 한다.

    예제

    public class SwitchExample {
        public static void main(String[] args) {
            int num = (int) (Math.random() * 6) + 1;   // 주사위 랜덤 뽑기
    
            switch (num) {
                case 1:                                // 주사위 숫자가 1이면
                    System.out.println("1번");
                    break;
                case 2:                                // 주사위 숫자가 2이면
                    System.out.println("2번");
                    break;
                case 3:                                // 주사위 숫자가 3이면
                    System.out.println("3번");
                    break;
                case 4:                                // 주사위 숫자가 4이면
                    System.out.println("4번");
                    break;
                case 5:                                // 주사위 숫자가 5이면
                    System.out.println("5번");
                    break;
                default:                                // 동일한 case가 위에 없으면
                    System.out.println("6번");
                    break;
            }
        }
    }
    

    실행 결과

    5번
    

    4.3 반복문(for문, while문, do-while문)

    반복문은 어떤 작업이 반복적으로 실행되도록 할 때 사용된다.

    4.3.1 for문

    for문의 실행 흐름

    1. 초기화식
    2. 조건식 평가
      1. true → 실행문 실행
        1. 실행문 모두 실행되면 증감식 실행
        2. 다시 조건식 평가
      2. false → for문 종료

    초기화식의 역할은 조건식과 실행문, 증감식에서 사용할 변수를 초기화하는 역할을 한다. 초기화식이 필요 없을 경우에는 다음과 같이 초기화식을 생략할 수 있다.

    int i = 1;
    for(; i<=100; i++) { ... }
    

    어떤 경우에는 초기화식이 둘 이상이 있을 수도 있고, 증감식도 둘 이상이 있을 수 있다. 이런 경우에는 쉼표로 구분해서 작성한다.

    for(int i=0, j=100; i<=50 && j>=50; i++,j--) { ... }
       //    초기화식          조건식        증감식
    

    초기화식에 선언된 변수는 for문 블록 내부에서 사용되는 로컬 변수이다. 따라서 for문을 벗어나서는 사용할 수 없다.

    예제

    public class ForSumFrom1To100Example {
        public static void main(String[] args) {
            int sum = 0;
    
            for(int i=1; i<=100; i++) {
                sum += i;
            }
    
            System.out.println("1 ~ 100 합: " + sum);
    
        }
    }
    

    실행 결과

    1 ~ 100 합: 5050
    

    중첩 if문과 마찬가지로 for문도 중첩해서 사용가능하다.

    3중, 4중 반복문도 가능하지만, 프로그램 실행 속도에 영향을 미칠 수 있으므로 가급적 지양하는 편이 좋다.

    가장 대표적인 예제가 구구단이다.

    public static void main(String[] args){
       for(int i=1; i<=9; i++){
           for(int j=1; j<=9; j++){
               System.out.printf("%d * %d = %d%n", i, j, i*j);
           }
       }
    }
    

    실행 순서는

    1. i = 1 → j = 1~9 → i for문의 증감식 i++ 실행
    2. i = 2 → j = 1~9 → i for문의 증감식 i++ 실행

    이를 i = 9 까지 반복하면 9 * 9 = 81번 반복이 된다.

    시간 복잡도

    알고리즘에서 보통 시간 복잡도에 신경을 쓰게 되는데 특히 for, while 문과 같은 반복문의 사용을 줄이려고 노력한다.

    반복문의 시간 복잡도: O(N)

    예를 들어 100,000번의 for 반복문이 있다고 했을 때 이 for문의 시간 복잡도는 100000번을 하게 된다. 만약 똑같은 횟수의 for문이 2중으로 작성되었다면, 100,000 * 100,000 = 10,000,000,000 으로 총 10억번이다.

    이는 프로그램에 무리가 갈 수 있기 때문에 중첩 반복문 작성하는 것을 되도록 지양해야 한다.

    4.3.2 while문

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

    while문 조건식 (주로 비교, 논리 연산식)

    • true → 계속 반복
    • false → while문 종료

    while문 실행 흐름

    1. 조건식 평가
      1. true → 실행문 실행
        1. 다시 조건식 되돌아가서 조건식 다시 평가
      2. false → while문 종료

    만약 while문의 조건식에 true를 사용하면 무한루프를 돌게 된다.

    무한 루프는 무한히 반복하여 실행하기 때문에 언젠가는 while문을 빠져 나가기 위한 코드가 필요하다. 혹은 break문을 이용하는 방법도 있다.

    예제

    import java.util.Scanner;
    
    public class Multiple_P {
    
    	public static void main(String[] args) {
    
    		Scanner sc = new Scanner(System.in);
    		
    		System.out.print("숫자를 입력하세요 : ");
    		int n = sc.nextInt();
    		while(true) {                         // while문 조건식이 항상 참이므로 무한루프를 돈다.
    			if(n == 0) {                        // 반복문을 빠져나올 조건
    				System.out.println("프로그램 종료");
    				sc.close();
    				return ;
    			}
    			for(int i=1; i<=9; i++) {           // while문을 돌 동안 실행시킬 실행문
    				int mul = i * n;
    				System.out.printf("%d * %d = %d\\n", n, i, mul);
    			}
    			System.out.print("다음 숫자 입력 : ");  // while문동안은 "다음 숫자 입력 : "이 콘솔에 뜸
    			n = sc.nextInt();
    		}
    
    	}
    
    }
    

    실행 결과

    >>> 숫자를 입력하세요 : 2
    2 * 1 = 2
    2 * 2 = 4
    2 * 3 = 6
    2 * 4 = 8
    2 * 5 = 10
    2 * 6 = 12
    2 * 7 = 14
    2 * 8 = 16
    2 * 9 = 18
    >>> 다음 숫자 입력 : 0   // 0이면 무한루프 빠져나와 while문 종료
    프로그램 종료
    

    4.3.3 do-while문

    do-while문은 조건식에 의해 반복 실행한다는 점에서는 while문과 동일하다.

    시작할 때부터 조건식을 검사해서 블록 내부를 실행할지 결정하는 while문과는 달리, do-while 문은 실행문을 우선 실행시키도 실행 결과에 따라서 반복 실행을 계속할지 결정한다.

    예를 들어, 키보드로 입력받은 내용을 조사하여 계속 루프를 돌 것인지를 판단하는 프로그램이 있다고 가정하자. 조건식은 키보드로 입력받은 이후에 평가되어야 하므로, 우선적으로 키보드로부터 입력된 내용을 받아야 한다.

    do-while문 실행 흐름

    1. 실행문 우선 실행
    2. 조건식 평가
      1. true → 실행문 실행
        1. 다시 조건식 평가
      2. false → do-while문 종료

    예제

    import java.util.Scanner;
    
    public class DoWhileExample {
    	public static void main(String[] args) {
    		System.out.println("메세지를 입력하세요");
    		System.out.println("프로그램을 종료하려면 q를 입력하세요.");
    
    		Scanner scanner = new Scanner(System.in);
    		String inputString;
    		
    		do {                                  // do-while 문에서는 먼저 실행을 시킨다
    				System.out.print(">");            // 예제의 경우 먼저 입력을 받아야하므로
    				inputString = scanner.nextLine(); // do-while문을 사용한다.
    				System.out.println(inputString);
    		} while(!inputString.equals("q"));
    
    		System.out.println();
    		System.out.println("프로그램 종료");
    	}
    }
    

    실행 결과

    >>> 메세지를 입력하세요
    >>> 프로그램을 종료하려면 q를 입력하세요.
    >안녕하세요
    안녕하세요
    >반갑습니다
    반갑습니다
    >q
    q
    
    프로그램 종료
    

    4.3.4 break문

    break문은 for문, while문, do-while문을 실행 중지할 때 사용된다.

    또한, 조건문인 switch문에서도 break문을 사용하여 조건문을 종료할 수 있다.

    예제

    public class BreakExample {
        public static void main(String[] args) {
    
            int i = 5, j = 10;
            while (true) {        // while문의 조건이 항상 true이므로 무한루프
                if (i >= j) {     // i가 j보다 크거나 같으면
                    break;        // 무한루프 탈출
                }
                i++;
            }
            System.out.println(i);// 탈출하여 출력
        }
    }
    

    실행 결과

    10
    

    4.3.5 continue문

    continue문은 반복문인 for문, while문, do-while문에서만 사용된다. 블록 내부에서 continue문이 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 이동한다.

    continue문은 반복문을 종료하지 않고 계속 반복을 수행한다는 점이 break문과 다르다.

    특정 조건을 만족하는 경우에 continue문을 실행해서 그 이후의 문장을 실행하지 않고 다음 반복으로 넘어간다.

    예제

    public class public class ContinueExample {
        public static void main(String[] args) {
            for (int i = 1; i <= 10; i++) {
                if (i % 2 != 0) {      // 홀수인 경우 continue
                    continue;          // 하나 증가
                } 
                System.out.println(i); // 홀수는 실행되지 않는다.
            }
        }
    }
    

    실행 결과

    2
    4
    6
    8
    10
    

     

    반응형