0Pricing
Java Academy · 강의

기본형 스트림 생성

iterate와 generate를 알아봅니다

기본형 스트림 생성은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

무한 스트림에는 제한이 필요합니다

iterate와 generate는 잠재적으로 무한한 스트림을 생성합니다. 스트림을 유한하게 만들려면 limit(또는 조건자)을 추가해야 합니다.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.iterate(1, n -> n + 1)
            .limit(5)
            .forEach(System.out::println);
    }
}

시드로 iterate 사용하기

iterate(seed, next)는 시드에서 시작하여 이전 값에 함수를 반복적으로 적용합니다.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.iterate(2, n -> n * 2)
            .limit(5)
            .forEach(System.out::println);
    }
}

Predicate로 iterate 사용하기

세 개의 인수를 받는 iterate(seed, hasNext, next)는 조건자가 거짓이 되면 자동으로 중지되므로, 기능형 반복문과 비슷합니다.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.iterate(1, n -> n <= 100, n -> n * 3)
            .forEach(System.out::println);
    }
}

Supplier로 generate 사용하기

generate는 각 요소를 독립적으로 생성하는 IntSupplier를 받으며, 이전 값에 의존하지 않습니다.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.generate(() -> 7)
            .limit(3)
            .forEach(System.out::println);
    }
}

난수 생성하기

generate의 공급자는 난수 생성기를 호출할 수 있습니다. 여기서는 각 요소가 서로 독립적인 주사위 굴리기 결과입니다.

import java.util.Random;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        Random rnd = new Random(42);
        IntStream.generate(() -> rnd.nextInt(6) + 1)
            .limit(5)
            .forEach(System.out::println);
    }
}

iterate와 generate 비교

핵심적인 차이:

  • iterate: 각 값이 이전 값에서 파생됩니다(수열).
  • generate: 각 값이 독립적으로 생성됩니다(상수, 난수).
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sum = IntStream.iterate(1, n -> n + 1).limit(10).sum();
        System.out.println(sum);
    }
}

생성된 스트림 집계하기

생성된 스트림은 범위를 제한하면 모든 일반적인 집계 연산을 지원합니다.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long count = IntStream.iterate(0, n -> n + 2)
            .limit(50)
            .filter(n -> n % 3 == 0)
            .count();
        System.out.println(count);
    }
}

객체 스트림에서 iterate로 피보나치 수열 만들기

피보나치 수열처럼 상태가 있는 수열에는 배열 쌍을 대상으로 Stream.iterate를 사용한 다음, 다시 정수로 매핑합니다.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream.iterate(new int[]{0, 1}, p -> new int[]{p[1], p[0] + p[1]})
            .limit(8)
            .mapToInt(p -> p[0])
            .forEach(System.out::println);
    }
}

생성기로 배열 만들기

생성기를 toArray와 결합하면 절차적으로 기본형 배열을 만들 수 있습니다.

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int[] squares = IntStream.iterate(1, n -> n + 1)
            .limit(5)
            .map(n -> n * n)
            .toArray();
        System.out.println(Arrays.toString(squares));
    }
}

지연성이 작업을 줄입니다

스트림은 지연 방식으로 동작합니다. limit을 사용하면 무한한 원본에서도 필요한 요소만 생성됩니다.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int first = IntStream.iterate(10, n -> n + 10)
            .filter(n -> n > 25)
            .findFirst()
            .getAsInt();
        System.out.println(first);
    }
}

Predicate 형식 우선하기

조건자를 기반으로 하는 iterate는 중지 조건이 생성 로직과 함께 있으므로 iterate(...).limit(...)보다 더 명확한 경우가 많습니다.

import java.util.stream.LongStream;

public class Main {
    public static void main(String[] args) {
        long product = LongStream.iterate(1, n -> n <= 5, n -> n + 1)
            .reduce(1, (a, b) -> a * b);
        System.out.println(product);
    }
}

빠른 확인

limit 없이 generate를 호출한 다음 forEach 같은 종단 연산을 호출하면 어떻게 될까요?

복습

기본형 스트림을 생성하는 방법을 배웠습니다:

  • iterate는 각 값을 이전 값에서 파생합니다.
  • generate는 공급자로부터 값을 독립적으로 생성합니다.
  • 둘 다 무한하므로 limit 또는 iterate의 조건자 형식으로 범위를 제한해야 합니다.
  • 지연성 덕분에 필요한 요소만 계산됩니다.

자주 묻는 질문

“기본형 스트림 생성” 강의는 무료인가요?

네 — “기본형 스트림 생성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“기본형 스트림 생성”에서 뭘 배우나요?

iterate와 generate를 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“기본형 스트림 생성” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. IntStream과 LongStream
  2. 범위와 집계 연산
  3. 객체 스트림으로 매핑하기
  4. 기본형 스트림 생성
← Java Academy(으)로 돌아가기