코딩쿠의 코드 연대기

Java 조건문, Java 반복문 본문

코딩스터디/JAVA스터디

Java 조건문, Java 반복문

코딩쿠 2024. 11. 3. 22:43

학습목표

  • 조건문
  • 반복문

Java에서 조건문과 반복문은 프로그램의 흐름을 제어하는 데 필수적인 요소입니다. 조건문은 조건에 따라 실행할 코드 블록을 선택하고, 반복문은 특정 조건이 만족될 때까지 코드 블록을 반복 실행합니다.

조건문

  • if 문: 조건식이 참(true)일 때만 코드 블록을 실행합니다.
      if (조건식) {
          // 조건식이 참일 때 실행될 코드
      }
     예시
  int age = 20;
  if (age >= 19) {
      System.out.println("성인입니다.");
  }

 

  • if else 문: 조건식이 참(true)이면 if 블록을 실행하고, 거짓(false)이면 else 블록을 실행합니다.
      if (조건식) {
          // 조건식이 참일 때 실행될 코드
      } else {
          // 조건식이 거짓일 때 실행될 코드
      }
     

 

  • else if 문 : else ifif 문 다음에 오는 조건문으로, 첫 번째 if 조건이 거짓일 때 추가적인 조건을 검사합니다.
    int score = 85;

    if (score >= 90) {
        System.out.println("A");
    } else if (score >= 80) {
        System.out.println("B");
    } else if (score >= 70) {
        System.out.println("C");
    } else {
        System.out.println("D");
    }

위 코드에서 score가 90 이상이면 "A"를 출력하고, 80 이상이면 "B"를 출력하는 식으로 조건을 검사합니다.

 

else if 여러 개를 사용할 수 있습니다.

필요에 따라 여러 개의 else if를 사용하여 다양한 조건을 검사할 수 있습니다.

 

else는 필수가 아님니다.

elseif 또는 else if 조건에 맞는 것이 없을 때 실행될 코드를 지정합니다. else는 생략될 수 있습니다.

 

주의 사항

  • else ifif 문과 함께 사용해야 합니다.
  • else ifif 조건이 거짓일 때만 실행됩니다.

연속된 if 문 vs else if 활용

연속된 if 문과 else if 문은 모두 조건에 따라 코드를 실행하는 방법이지만, 동작 방식과 용도에 차이가 있습니다. 어떤 상황에 어떤 방식을 사용하는 것이 효율적인지, 그리고 코드의 가독성과 성능에 미치는 영향은 무엇인지 자세히 알아보겠습니다.

 

1. 연속된 if

if 문은 서로 독립적으로 실행됩니다. 즉, 앞선 if 문의 조건식 결과에 관계없이 모든 if 문의 조건식을 평가합니다.

int num = 10;

if (num > 0) {
    System.out.println("num은 양수입니다.");
}
if (num % 2 == 0) {
    System.out.println("num은 짝수입니다.");
}
if (num > 5) {
    System.out.println("num은 5보다 큽니다.");
}

위 코드에서 num은 10이므로 세 가지 if 문의 조건식이 모두 참이 됩니다. 따라서 "num은 양수입니다.", "num은 짝수입니다.", "num은 5보다 큽니다."가 모두 출력됩니다.

 

2. else if

else if 문은 앞선 if 또는 else if 조건이 거짓일 때만 조건식을 평가합니다. 즉, 조건을 만족하는 첫 번째 블록만 실행되고 나머지는 무시됩니다.

int num = 10;

if (num > 0) {
    System.out.println("num은 양수입니다.");
} else if (num % 2 == 0) {
    System.out.println("num은 짝수입니다.");
} else if (num > 5) {
    System.out.println("num은 5보다 큽니다.");
}

위 코드에서 첫 번째 if 문의 조건식 (num > 0)이 참이므로 "num은 양수입니다."가 출력되고 나머지 else if 문은 실행되지 않습니다.

 

3. 활용

  • 연속된 if 문: 여러 조건을 독립적으로 검사하고 각 조건에 맞는 코드를 실행해야 할 때 유용합니다. 예를 들어, 사용자의 입력값이 여러 범위에 속하는지 확인하거나, 특정 조건을 만족하는지 여부를 여러 개 확인해야 할 때 사용합니다.
  • else if 문: 여러 조건 중 하나에 해당하는 경우에만 코드를 실행해야 할 때 유용합니다. 예를 들어, 점수에 따라 학점을 부여하거나, 사용자의 선택에 따라 다른 기능을 실행해야 할 때 사용합니다.

4. 성능

else if 문은 조건을 만족하는 첫 번째 블록만 실행하고 나머지는 무시하기 때문에 연속된 if 문보다 성능이 좋을 수 있습니다. 특히 조건식을 평가하는 데 시간이 오래 걸리는 경우 성능 차이가 더 커질 수 있습니다.

 

5. 가독성

else if 문은 여러 조건을 체계적으로 표현할 수 있기 때문에 연속된 if 문보다 코드의 가독성이 좋을 수 있습니다. 특히 조건이 많거나 복잡한 경우 else if 문을 사용하는 것이 코드를 이해하기 쉽게 만드는 데 도움이 됩니다.

 

  • switch 문: 변수 값에 따라 여러 경우 중 하나를 선택하여 실행합니다.
      switch (변수) {
          case 값1:
              // 변수 값이 값1일 때 실행될 코드
              break;
          case 값2:
              // 변수 값이 값2일 때 실행될 코드
              break;
          default:
              // 어떤 case에도 해당하지 않을 때 실행될 코드
      }

※ break 를 꼭 써야 할까?

int day = 3; // 예를 들어, 3은 수요일을 의미

String dayName;

switch (day) {
    case 1:
        dayName = "월요일";
        System.out.println("오늘은 " + dayName + "입니다.");
        break;
    case 2:
        dayName = "화요일";
        System.out.println("오늘은 " + dayName + "입니다.");
        break;
    case 3:
        dayName = "수요일";
        System.out.println("오늘은 " + dayName + "입니다.");
        break;
    case 4:
        dayName = "목요일";
        System.out.println("오늘은 " + dayName + "입니다.");
        break;
    case 5:
        dayName = "금요일";
        System.out.println("오늘은 " + dayName + "입니다.");
        break;
    case 6:
        dayName = "토요일";
        System.out.println("오늘은 " + dayName + "입니다.");
        break;
    case 7:
        dayName = "일요일";
        System.out.println("오늘은 " + dayName + "입니다.");
        break;
    default:
        dayName = "잘못된 요일 번호입니다.";
        System.out.println(dayName);
        break;
}

위 예시의 실행하면
오늘은 수요일입니다.

만약 위 예시에서 break 를 쓰지 않는다면?

int day = 3; // 예를 들어, 3은 수요일을 의미

String dayName;

switch (day) {
    case 1:
        dayName = "월요일";
        System.out.println("오늘은 " + dayName + "입니다.");
    case 2:
        dayName = "화요일";
        System.out.println("오늘은 " + dayName + "입니다.");
    case 3:
        dayName = "수요일";
        System.out.println("오늘은 " + dayName + "입니다.");
    case 4:
        dayName = "목요일";
        System.out.println("오늘은 " + dayName + "입니다.");
    case 5:
        dayName = "금요일";
        System.out.println("오늘은 " + dayName + "입니다.");
    case 6:
        dayName = "토요일";
        System.out.println("오늘은 " + dayName + "입니다.");
    case 7:
        dayName = "일요일";
        System.out.println("오늘은 " + dayName + "입니다.");
    default:
        dayName = "잘못된 요일 번호입니다.";
        System.out.println(dayName);
}
오늘은 수요일입니다.
오늘은 목요일입니다.
오늘은 금요일입니다.
오늘은 토요일입니다.
오늘은 일요일입니다.
잘못된 요일 번호입니다.

case 조건을 한번 검사하고 이후에 순차 실행을 한다. 이러한 현상이 일어나는 이유는 C 계열 언어의 `switch` 문 설계와 관련이 있습니다. 이 구조는 의도된 동작으로, 이를 "fall-through"라고 합니다. 

이 과정은 아래와 같은 순서로 이루어집니다:

1. 조건 확인: `switch`는 `day` 값과 첫 번째 일치하는 `case`를 찾기 위해 조건을 확인합니다. 이때, `day`가 `3`이면 `case 3`에서 시작하겠다는 것을 알게 됩니다.

2. 첫 일치 이후 실행: 첫 번째 일치하는 `case`를 찾으면 그곳에서 코드를 실행하기 시작합니다. 그리고 나면 **그 이후 `case`에 대해 추가로 조건을 확인하지 않고, 코드가 순차적으로 실행**됩니다. 

3. "fall-through" 설계: `switch` 문은 기본적으로 `break`가 없으면 모든 `case`를 순차적으로 실행하도록 설계되어 있습니다. 이는 **하나의 조건이 참일 때 여러 작업을 한꺼번에 수행할 수 있는 유연성**을 제공하기 위해서입니다. 예를 들어, 여러 개의 `case`에서 같은 작업을 하고 싶다면 `case`를 나열하고 `break` 없이 그 다음 `case`에 계속해서 코드를 작성하는 방식이 가능합니다.

4. 종료 지점 미정: `switch` 문 내에서 어떤 지점에서 코드를 종료할지는 사용자가 `break`로 명시해주어야 합니다. `break`가 없으면 기본적으로 마지막 `case`까지 내려가거나 `default` 블록까지 실행됩니다.

요약하면, `switch` 문에서 조건을 처음에 한 번만 검사하고 그 이후부터 순차적으로 실행되는 이유는 "fall-through" 방식을 지원하기 위한 설계 철학 때문입니다. 이를 통해 여러 `case`가 하나의 공통 코드를 실행하거나 특정 지점에서 종료하도록 할 수 있는 유연성을 제공합니다.

반복문

  • for 문: 정해진 횟수만큼 코드 블록을 반복 실행합니다.
      for (초기식; 조건식; 증감식) {
          // 반복 실행될 코드
      }
     for 문의 예시
    // 1부터 10까지의 합을 계산합니다.
    int sum = 0;
    for (int i = 1; i <= 10; i++) {
      sum += i;
    }
    System.out.println("1부터 10까지의 합: " + sum);
  • while 문: 조건식이 참(true)인 동안 코드 블록을 반복 실행합니다.
      while (조건식) {
          // 조건식이 참일 때 반복 실행될 코드
      }
     while문의 예시
//while 문: 사용자가 입력한 숫자들의 합을 계산합니다

Scanner scanner = new Scanner(System.in);
int num, sum = 0;
    
System.out.println("숫자를 입력하세요 (0을 입력하면 종료):");
num = scanner.nextInt();
while (num != 0) {
	sum += num;
    num = scanner.nextInt();
}
    
System.out.println("입력한 숫자들의 합: " + sum);

 

  • do-while 문: 코드 블록을 먼저 실행하고, 조건식이 참(true)인 동안 반복 실행합니다.
      do {
          // 조건식이 참일 때 반복 실행될 코드
      } while (조건식);
      Scanner scanner = new Scanner(System.in);
      String input;
    
      do {
          System.out.print("문자열을 입력하세요 (exit 입력 시 종료): ");
          input = scanner.nextLine();
          System.out.println("입력한 문자열: " + input);
      } while (!input.equals("exit"));


break 문과 continue 문

  • break 문: 반복문을 즉시 종료합니다.
  • continue 문: 현재 반복을 건너뛰고 다음 반복으로 넘어갑니다.

추가 정보

  • 선택문과 반복문은 중첩하여 사용할 수 있습니다.
  • 조건식에는 비교 연산자 (>, <, >=, <=, ==, !=), 논리 연산자 (&&, ||, !) 등을 사용할 수 있습니다.