Java

Java - if, swich-case, for, while, break, continue

wy-family 2024. 11. 26. 10:00

Java의 조건문과 반복문은 논리적인 사고를 활용하여 문제를 해결하는 데 필수적인 도구들입니다. 각 요소를 자세히 살펴보고 예제를 통해 이해해 봅시다.


1. 조건문

(1) if-else 문

  • 특정 조건이 참인지 확인하고, 조건에 따라 다른 코드를 실행합니다.

기본 구조:

if (조건식) {
    // 조건식이 참일 때 실행
} else {
    // 조건식이 거짓일 때 실행
}

예제:

int age = 20;
if (age >= 18) {
    System.out.println("성인입니다.");
} else {
    System.out.println("미성년자입니다.");
}

(2) switch-case 문

  • 하나의 변수에 대해 여러 값을 비교할 때 사용됩니다.
  • if-else보다 코드가 간결해집니다.

기본 구조:

switch (변수) {
    case 값1:
        // 값1일 때 실행
        break;
    case 값2:
        // 값2일 때 실행
        break;
    default:
        // 위 조건에 모두 해당하지 않을 때 실행
}

예제:

int day = 3;
switch (day) {
    case 1:
        System.out.println("월요일");
        break;
    case 2:
        System.out.println("화요일");
        break;
    case 3:
        System.out.println("수요일");
        break;
    default:
        System.out.println("알 수 없는 요일");
}

* 참고: switch-case 에서는 break, default는 무조건 사용해야 하는 건 아니다.

switch-case 문에서 break와 default는 선택 사항이며, 각각의 사용 여부에 따라 코드의 동작이 달라집니다. 이를 더 깊이 이해하기 위해, breakdefault의 역할과 그 부재로 인해 발생하는 동작을 설명하겠습니다.


1. break가 없는 경우

break가 없으면 "fall-through" (다음 case로 실행이 이어짐) 현상이 발생합니다. 즉, 현재 case의 코드가 실행된 후, 조건과 상관없이 아래의 모든 case 코드가 실행됩니다.

예제: break 없는 경우

int day = 3;

switch (day) {
    case 1:
        System.out.println("월요일");
    case 2:
        System.out.println("화요일");
    case 3:
        System.out.println("수요일");
    case 4:
        System.out.println("목요일");
    default:
        System.out.println("알 수 없는 요일");
}

출력

 
수요일
목요일
알 수 없는 요일
  • 설명:
    • day == 3이므로 case 3:부터 실행됩니다.
    • 그러나 break가 없으므로 case 3 이후의 모든 case와 default가 연달아 실행됩니다.
 

2. default가 없는 경우

default는 모든 case가 만족하지 않을 때 실행될 코드를 작성하는 선택 사항입니다. default가 없으면, 어느 case도 해당하지 않을 경우 아무 작업도 하지 않고 switch 문이 종료됩니다.

예제: default 없는 경우

int day = 8;

switch (day) {
    case 1:
        System.out.println("월요일");
        break;
    case 2:
        System.out.println("화요일");
        break;
    case 3:
        System.out.println("수요일");
        break;
    case 4:
        System.out.println("목요일");
        break;
}

출력

(아무것도 출력되지 않음)
  • 설명:
    • day == 8은 어떤 case와도 일치하지 않으므로 switch 문이 종료되고 아무 결과도 출력되지 않습니다.

3. break와 default를 모두 사용하지 않는 경우

break와 default가 모두 없을 경우, fall-through가 발생하며, 일치하는 case부터 모든 코드가 실행됩니다. 이와 동시에 일치하지 않는 경우 아무 작업도 하지 않습니다.

예제: break와 default 없는 경우

int day = 2;

switch (day) {
    case 1:
        System.out.println("월요일");
    case 2:
        System.out.println("화요일");
    case 3:
        System.out.println("수요일");
    case 4:
        System.out.println("목요일");
}

출력

 
화요일
수요일
목요일
  • 설명:
    • day == 2이므로 case 2부터 실행됩니다.
    • break가 없으므로 이후 모든 case 코드가 실행됩니다.

4. 유용한 패턴: 의도적인 fall-through

때로는 break를 사용하지 않고, fall-through를 의도적으로 활용할 수 있습니다. 예를 들어, 여러 case가 같은 코드를 실행하도록 설계할 수 있습니다.

예제: 의도적인 fall-through

int month = 5;

switch (month) {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        System.out.println("31일");
        break;
    case 4: case 6: case 9: case 11:
        System.out.println("30일");
        break;
    case 2:
        System.out.println("28일 또는 29일");
        break;
    default:
        System.out.println("유효하지 않은 월입니다.");
}

출력

 
31일
  • 설명:
    • 여러 case가 동일한 코드를 실행해야 하는 경우 fall-through를 사용하여 코드 중복을 줄입니다.

정리

  1. break:
    • 반복적인 실행을 방지하기 위해 각 case 끝에 추가.
    • 없을 경우 fall-through가 발생.
  2. default:
    • 모든 case와 일치하지 않을 때 실행될 코드를 제공.
    • 없을 경우 조건을 만족하지 않는 경우 아무 작업도 하지 않고 종료.
  3. 의도적으로 break를 생략하여 fall-through를 활용할 수도 있음.

2. 반복문

(1) for 문

  • 반복 횟수가 정해져 있을 때 주로 사용됩니다.

기본 구조:

for (초기식; 조건식; 증감식) {
    // 반복할 코드
}

예제:

for (int i = 1; i <= 5; i++) {
    System.out.println("숫자: " + i);
}

Java의 for-each 문

for-each 문은 Java에서 배열이나 컬렉션을 반복(iterate) 할 때 사용하는 간단하고 직관적인 반복문입니다. 일반적인 for 문보다 코드가 간결하며, 인덱스를 따로 관리할 필요가 없습니다.


특징

  • 배열이나 컬렉션에 저장된 모든 요소를 순차적으로 탐색합니다.
  • 반복 횟수가 고정되어 있지 않아도 사용 가능하며, 요소의 순서를 신경 쓰지 않을 때 유용합니다.
  • 읽기 전용 접근 방식: 배열의 값을 수정하고 싶다면 다른 방식이 필요합니다.

구문

for (데이터타입 변수 : 배열 또는 컬렉션) {
    // 반복할 코드
}
  • 데이터타입 변수: 배열 또는 컬렉션의 요소를 받을 변수.
  • 배열 또는 컬렉션: 반복할 대상.

예제 1: 배열에서의 사용

배열에 저장된 값을 하나씩 출력하기.

int[] numbers = {1, 2, 3, 4, 5};

for (int number : numbers) {
    System.out.println("숫자: " + number);
}

출력

숫자: 1
숫자: 2
숫자: 3
숫자: 4
숫자: 5
  • 설명:
    • numbers 배열의 각 요소가 number 변수에 순차적으로 할당됩니다.
    • 반복문 안에서 number를 사용하여 요소를 출력합니다.

예제 2: 컬렉션에서의 사용

ArrayList와 같은 컬렉션을 순회.

import java.util.ArrayList;

ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");

for (String name : names) {
    System.out.println("이름: " + name);
}

출력

이름: Alice
이름: Bob
이름: Charlie
  • 설명:
    • names 컬렉션의 각 요소가 name 변수에 순차적으로 할당됩니다.
    • 반복문 안에서 name을 사용하여 각 요소를 출력합니다.

주의 사항

  1. 읽기 전용:
    • for-each 문에서는 요소의 값을 변경할 수 없습니다. 배열이나 컬렉션의 값을 수정하려면 일반적인 for 문을 사용해야 합니다.
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
    number += 10; // 원본 배열에는 영향 없음
}
System.out.println(Arrays.toString(numbers)); // [1, 2, 3, 4, 5]
  1. 인덱스 접근 불가:
    • 반복 중 현재 요소의 인덱스가 필요하다면 for-each 문을 사용할 수 없습니다. 대신 일반 for 문을 사용해야 합니다.
     
for (int i = 0; i < numbers.length; i++) {
    System.out.println("인덱스 " + i + ": " + numbers[i]);
}
  1. null 처리:
    • 배열이나 컬렉션이 null이면 NullPointerException이 발생합니다. 반복문 전에 반드시 null 체크를 해야 합니다.

장점

  • 코드가 간결하고 가독성이 높습니다.
  • 컬렉션이나 배열의 모든 요소를 탐색할 때 편리합니다.

예제 3: 2차원 배열에서 사용

for-each 문으로 2차원 배열 탐색.

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

for (int[] row : matrix) {
    for (int num : row) {
        System.out.print(num + " ");
    }
    System.out.println();
}

출력

 
1 2 3
4 5 6
7 8 9

정리

  • 언제 사용하면 좋을까?
    • 배열이나 컬렉션의 모든 요소를 순차적으로 읽고 처리할 때.
    • 요소의 값을 변경하거나 인덱스가 필요하지 않을 때.
  • 언제 피해야 할까?
    • 요소의 값을 수정해야 하거나, 특정 인덱스를 기반으로 작업해야 할 때.

for-each 문은 직관적이고 편리한 반복문으로, 읽기 전용 작업에 최적화된 도구입니다.

 


(2) while 문

  • 조건이 참일 때 계속 실행합니다. 조건이 거짓이 되면 종료됩니다.

기본 구조:

while (조건식) {
    // 반복할 코드
}

예제:

int i = 1;
while (i <= 5) {
    System.out.println("숫자: " + i);
    i++;
}

(3) do-while 문

  • 최소 한 번은 실행한 뒤, 조건을 확인합니다. (* 맨 마지막에 ; 세미콜론을 꼭 붙여야 함!)

기본 구조:

do {
    // 실행할 코드
} while (조건식);

예제:

int i = 1;
do {
    System.out.println("숫자: " + i);
    i++;
} while (i <= 5);

 


3. 반복문 제어

(1) break

  • 반복문을 즉시 종료합니다.

예제:

for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        break; // 반복문 종료
    }
    System.out.println("숫자: " + i);
}

(2) continue

  • 반복문의 현재 루프를 건너뛰고, 다음 반복으로 넘어갑니다.

예제:

for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        continue; // 다음 반복으로 건너뜀
    }
    System.out.println("숫자: " + i);
}

논리적인 사고와 Java 문법의 결합

  1. 문제를 단계적으로 나눔:
    • 복잡한 문제를 여러 단계로 나누고 각각의 조건과 반복을 정의합니다.
  2. 조건과 루프를 활용한 해결:
    • 조건(if, switch)을 통해 논리적인 분기를 설정합니다.
    • 반복문(for, while)을 통해 데이터를 처리하거나 동작을 반복합니다.
  3. 디버깅:
    • 작은 단위로 코드를 작성하고, 출력문(System.out.println())을 사용하여 논리의 흐름을 확인합니다.

Java의 기본적인 조건문과 반복문을 논리적으로 조합하면 어떤 문제든 해결할 수 있습니다.