BEER&DEV

자바의 조건문과 반복문: 초보자를 위한 꼬리의 꼬리를 무는 자바 본문

BASIS/JAVA

자바의 조건문과 반복문: 초보자를 위한 꼬리의 꼬리를 무는 자바

사당맥주 2023. 7. 13. 15:06

자바에서는 조건문과 반복문을 사용하여 프로그램의 흐름을 제어하고 반복 작업을 수행할 수 있습니다. 이번 글에서는 초보자를 위해 자바의 조건문과 반복문에 대해 예시와 함께 자세히 설명하겠습니다.

1. 조건문(Conditional Statements)

- 조건문은 주어진 조건에 따라 프로그램의 실행 흐름을 분기하는 데 사용됩니다. 자바에서는 `if-else`문과 `switch-case`문이 가장 일반적으로 사용됩니다.

1.1 `if-else`문:
   - `if-else`문은 주어진 조건식이 참(true)인 경우와 거짓(false)인 경우에 따라 다른 코드 블록을 실행합니다.

   예시:

   int age = 25;

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



1.2 `switch-case`문:
   - `switch-case`문은 변수나 식의 값에 따라 다양한 선택지를 가질 때 사용됩니다. 변수의 값과 일치하는 case 문을 찾아 해당 코드 블록을 실행합니다.

   예시:

int day = 2;
   String dayOfWeek;

   switch (day) {
       case 1:
           dayOfWeek = "월요일";
           break;
       case 2:
           dayOfWeek = "화요일";
           break;
       // ...
       default:
           dayOfWeek = "알 수 없는 요일";
           break;
   }

   System.out.println("오늘은 " + dayOfWeek + "입니다.");



2. 반복문(Loop Statements)

- 반복문은 동일한 작업을 여러 번 반복할 때 사용됩니다. 자바에서는 `for`문, `while`문, `do-while`문이 가장 일반적으로 사용됩니다.

2.1 `for`문:
   - `for`문은 초기화, 조건식, 증감식을 사용하여 지정된 횟수만큼 반복하는 데 사용됩니다.

   예시:

   for (int i = 1; i <= 5; i++) {
       System.out.println("반복문 실행: " + i);
   }



2.2 `while`문:
   - `while`문은 주어진 조건식이 참인 동안 반복하는 데 사용됩니다. 반복 횟수를 미리 알 수 없을 때 유용합니다.

   예시:

   int count = 0;

   while (count < 5) {
       System.out.println("반복문 실행: " + count);
       count++;
   }



2.3 `do-while`문:
   - `do-while`문은 일단 코드 블록을 실행한 후 조건식을 확인하여 조건식이 참인 경우 계속 반복합니다. 따라서 코드 블록은 최소한 한 번 실행됩니다.

   예시:

   int number;
   Scanner scanner = new Scanner(System.in);

   do {
       System.out.print("양수를 입력하세요: ");
       number = scanner.nextInt();
   } while (number <= 0);

   System.out.println("입력된 양수: " + number);



정리하자면, 자바의 조건문과 반복문을 사용하여 프로그램의 흐름을 제어하고 반복 작업을 수행할 수 있습니다. 조건문은 주어진 조건에 따라 프로그램의 실행 흐름을 분기하며, 반복문은 동일한 작업을 여러 번 반복합니다. 조건문에는 `if-else`문과 `switch-case`문이 있으며, 반복문에는 `for`문, `while`문, `do-while`문이 있습니다. 이를 활용하여 다양한 상황에서 코드의 실행 흐름을 제어할 수 있습니다.



반복문 조건문 심화


아래는 반복문과 조건문을 사용함에 있어 더욱 심화적인 주제와 예시입니다.

1. 중첩된 반복문:
중첩된 반복문은 반복문 안에 다른 반복문을 사용하는 기술입니다. 이를 통해 복잡한 패턴이나 다차원 배열과 같은 데이터 구조를 처리할 수 있습니다. 예를 들어, 2차원 배열의 요소를 모두 출력하기 위해 중첩된 `for` 루프를 사용할 수 있습니다.

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

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}



2. 반복문의 종료 조건과 제어:
`break`와 `continue` 문을 사용하여 반복문의 흐름을 제어할 수 있습니다. `break`는 반복문을 완전히 종료하고 빠져나오는 데 사용되고, `continue`는 현재 반복을 중단하고 다음 반복으로 넘어가는 데 사용됩니다. 예를 들어, 1부터 10까지의 숫자 중에서 짝수만 출력하는 코드는 다음과 같습니다.

for (int i = 1; i <= 10; i++) {
    if (i % 2 == 1) {
        continue; // 홀수인 경우 현재 반복 중단
    }
    System.out.println(i);
}



3. 루프 최적화:
루프 최적화는 반복문의 실행 속도를 향상시키는 기법입니다. 이를 위해 루프의 횟수를 줄이거나 계산을 최적화하는 방법을 사용할 수 있습니다. 예를 들어, 루프 언롤링은 반복 횟수를 줄이기 위해 반복문 안의 코드를 여러 번 반복하여 실행하는 최적화 기법입니다.

for (int i = 0; i < array.length; i += 2) {
    // i를 2씩 증가시키면서 반복문 실행
    // 반복문 안의 코드 작성
}



4. 재귀적 반복:
재귀 함수를 사용하여 반복적인 작업을 수행할 수 있습니다. 재귀 함수는 자신을 호출하는 함수로서, 재귀 호출을 통해 반복적인 작업을 처리합니다. 예를 들어, 팩토리얼을 계산하는 함수는 재귀적인 방식으로 구현할 수 있습니다.

int factorial(int n) {
    if (n == 0) {
        return 1;
    }
    return n * factorial(n - 1);
}



5. 조건문의 복잡한 표현:
조건문은 여러 개의 조건을 조합하여 복잡한 표현을 만들 수 있습니다. 논리 연산자(`&&`, `||`, `!`)를 사용하여 조건을 결합하고, 괄호를 사용하여 우선순위를 지정할 수 있습니다. 예를 들어, 성적에 따라 학점을 부여하는 코드는 다음과 같을 수 있습니다.


if (score >= 90) {
    if (score >= 95) {
        grade = "A+";
    } else {
        grade = "A";
    }
} else if (score >= 80) {
    grade = "B";
} else if (score >= 70) {
    grade = "C";
} else {
    grade = "F";
}


Stream과 반복문


자바 8 버전 이후에 등장한 Stream은 함수형 프로그래밍을 지원하며, 컬렉션의 요소를 처리하는 데 사용됩니다. Stream은 데이터의 처리를 선언적으로 표현할 수 있어 코드의 가독성과 유지보수성을 높여줍니다. 이제 반복문과 Stream을 함께 설명하고, 예시를 통해 확인해봅시다.

반복문은 명시적으로 요소에 접근하고 조작하는 방식이며, Stream은 데이터에 대한 연산을 선언적으로 정의합니다. Stream을 사용하면 컬렉션의 요소를 중간 연산과 최종 연산으로 구성된 파이프라인을 통해 처리할 수 있습니다. 중간 연산은 데이터를 변환하거나 필터링하는 데 사용되며, 최종 연산은 결과를 생성하거나 수집하는 데 사용됩니다.

예를 들어, 1부터 10까지의 숫자 중에서 짝수만 출력하는 반복문과 Stream을 비교해보겠습니다.

반복문

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
for (int number : numbers) {
    if (number % 2 == 0) {
        System.out.println(number);
    }
}


Stream

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
numbers.stream()
    .filter(number -> number % 2 == 0)
    .forEach(System.out::println);



위의 예시에서는 List에 있는 숫자들을 Stream으로 변환한 후, `filter()` 메서드를 사용하여 짝수만 필터링하고, `forEach()` 메서드를 사용하여 각 요소를 출력합니다.

Stream은 병렬 처리를 통해 성능을 향상시킬 수도 있습니다. `parallelStream()` 메서드를 사용하면 간단히 병렬 스트림을 생성할 수 있습니다. 이는 멀티코어 환경에서 데이터 처리 속도를 높일 수 있습니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
numbers.parallelStream()
    .filter(number -> number % 2 == 0)
    .forEach(System.out::println);



이 예시에서는 `parallelStream()`을 사용하여 병렬 스트림을 생성하고, 나머지 연산을 동일하게 수행합니다. 이렇게 하면 각 요소가 병렬로 처리되어 처리 속도를 향상시킬 수 있습니다.

이처럼 Stream은 반복문보다 간결하고 선언적인 코드를 작성할 수 있으며, 병렬 처리를 통해 성능을 향상시킬 수 있습니다. 자바 8 이후에 Stream은 다양한 데이터 처리 작업에서 유용하게 사용되고 있습니다.


Stream 이 무엇인지 더 알고 싶다면?
Java의 Stream - 초보자를 위한 꼬리의 꼬리를 무는 자바
반응형