Java에서 Java Stream을 사용하면 객체 리스트에서 원하는 구간만 쉽게 뽑아낼 수 있습니다. 오늘은 skip()과 limit()을 이용해 리스트의 처음 3개를 건너뛰고, 그 다음 2개만 선택하는 방법을 실습 중심으로 정리해 보겠습니다. 특히 Collectors.toList()까지 함께 보면서 Java 초보자가 자주 쓰는 흐름을 자연스럽게 익혀보겠습니다.

문제를 먼저 이해해 봅시다
주어진 리스트는 다음과 같습니다.
[10, 20, 30, 40, 50, 60, 70, 80]
여기서 해야 할 일은 아주 단순합니다.
- 처음 3개 요소는 건너뛴다.
- 그 다음 요소 2개만 가져온다.
- 결과를 출력한다.
즉, 10, 20, 30은 제외하고, 그 다음인 40, 50만 선택하면 됩니다.
입력 데이터와 요구사항
데이터
[10, 20, 30, 40, 50, 60, 70, 80]
요구사항
skip(3)으로 앞의 3개 요소를 건너뛰기limit(2)로 그 다음 2개 요소만 선택- 결과 출력
이 문제는 Java Stream의 중간 연산을 이해하기에 아주 좋은 예제입니다. 실제로 skip()과 limit()은 객체 리스트를 다룰 때 자주 쓰이며, 페이지 처리나 일부 데이터 추출에 많이 활용됩니다.
전체 소스 코드
코드는 정상 동작하며, 가독성만 보기 좋게 정리했습니다.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class SkipLimit {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50, 60, 70, 80);
System.out.println("원본: " + numbers);
// skip()으로 처음 3개 건너뛴 후, limit()로 2개만 선택
List<Integer> result = numbers.stream()
.skip(3) // 처음 3개 건너뛰기
.limit(2) // 그 다음 2개만 선택
.collect(Collectors.toList());
System.out.println("skip(3).limit(2) 결과: " + result);
}
}
핵심 코드 설명
1) numbers.stream()
numbers.stream()
List<Integer>인 numbers를 Stream으로 바꾸는 부분입니다. 즉, 리스트를 한 줄로 흘려보내면서 필요한 요소만 처리할 수 있는 상태로 만드는 것입니다.
Java 초보자 입장에서는 “리스트를 스트림 모드로 전환한다” 정도로 이해하면 충분합니다.
2) skip(3)
.skip(3)
skip(3)은 앞에서부터 3개를 건너뛰는 기능입니다.
원본이 다음과 같다면:
10, 20, 30, 40, 50, 60, 70, 80
skip(3) 이후에는 이렇게 남습니다.
40, 50, 60, 70, 80
즉, 리스트의 앞부분을 잘라내는 역할입니다. Java Stream에서 skip()은 데이터의 시작 위치를 옮긴다고 생각하면 이해하기 쉽습니다.
3) limit(2)
.limit(2)
limit(2)는 앞에서부터 2개만 선택합니다.
skip(3) 이후 남은 값은:
40, 50, 60, 70, 80
여기서 limit(2)를 적용하면:
40, 50
이 됩니다.
즉, skip()으로 시작 지점을 이동하고, limit()으로 개수를 제한하는 흐름입니다. 이 조합은 Java Stream에서 매우 자주 사용됩니다.
4) collect(Collectors.toList())
.collect(Collectors.toList());
Stream은 바로 리스트가 아니라 흐르는 데이터 처리 방식입니다. 그래서 최종 결과를 다시 List로 모아야 할 때 collect(Collectors.toList())를 사용합니다.
이 부분은 초보자가 특히 많이 헷갈립니다.
skip()과limit()은 Stream을 계속 이어가는 중간 연산collect(Collectors.toList())는 최종 결과를 List로 만드는 마무리 연산
즉, Collectors.toList()는 흩어진 결과를 리스트로 모으는 역할입니다.
실행 결과
프로그램을 실행하면 다음과 같이 출력됩니다.
원본: [10, 20, 30, 40, 50, 60, 70, 80]
skip(3).limit(2) 결과: [40, 50]
원하는 대로 앞의 3개를 건너뛰고, 그 다음 2개만 출력된 것을 확인할 수 있습니다.
초보자가 자주 헷갈리는 부분
1) skip(3)은 3번째 요소를 포함하나요?
아닙니다. skip(3)은 처음 3개를 완전히 제외합니다. 즉, 10, 20, 30이 사라지고 40부터 시작합니다.
2) limit(2)는 건너뛴 후 전체에서 2개를 고르나요?
아니요. limit(2)는 현재 남아 있는 Stream에서 앞의 2개를 가져옵니다. 그래서 skip(3) 다음에 붙여 쓰면 자연스럽게 “건너뛴 후 다음 2개”가 됩니다.
3) Collectors.toList()를 왜 꼭 써야 하나요?
Stream 처리 결과를 다시 List로 저장하려면 필요합니다. 그냥 출력만 할 수도 있지만, 대부분은 결과를 변수에 저장해서 다시 사용하기 때문에 collect(Collectors.toList())가 자주 등장합니다.
4) skip()과 limit() 순서를 바꾸면 어떻게 되나요?
순서가 중요합니다. limit(2).skip(3)처럼 바꾸면 먼저 2개만 남기고, 그 2개 중 3개를 건너뛰려 하므로 결과가 비게 됩니다. Java Stream은 메서드 체이닝 순서를 그대로 해석해야 합니다.
Java Stream에서 이런 방식이 유용한 이유
이 예제는 단순해 보이지만 실제로는 꽤 실용적입니다. 예를 들어 객체 리스트에서:
- 첫 페이지를 건너뛰고
- 두 번째 페이지의 일부만 보여주기
- 검색 결과 중 특정 구간만 추출하기
같은 작업에 그대로 적용할 수 있습니다. 즉, Java Stream의 skip()과 limit()은 객체 리스트를 다루는 기본 도구라고 볼 수 있습니다.
직접 연습해 볼 과제
아래 과제로 직접 한 번 바꿔 보세요.
과제 1
skip(2)와 limit(3)을 사용해서 결과를 출력해 보세요.
과제 2
리스트를 다음 값으로 바꿔 보세요.
[5, 15, 25, 35, 45, 55]
그리고 skip(1).limit(4)의 결과를 확인해 보세요.
과제 3
정수 리스트 대신 문자열 리스트로 바꿔서 연습해 보세요.
["A", "B", "C", "D", "E", "F"]
skip(2).limit(2)를 적용하면 어떤 결과가 나오는지 확인해 보세요.
이 연습을 해 보면 Java Stream, skip(), limit(), Collectors.toList()의 흐름이 훨씬 자연스럽게 잡힙니다.
자주 묻는 질문
Q1. skip()은 배열에도 바로 사용할 수 있나요?
배열 자체에는 바로 못 쓰고, 보통 Arrays.asList()로 리스트로 만든 뒤 Stream을 사용합니다. 또는 Arrays.stream() 같은 방식으로도 접근할 수 있습니다.
Q2. limit()보다 먼저 skip()을 써야 하나요?
꼭 그런 것은 아니지만, 이번 예제처럼 “앞을 건너뛰고 나서 일부만 선택”하려면 skip() 다음 limit() 순서가 가장 자연스럽습니다. 순서를 바꾸면 결과가 달라질 수 있습니다.
Q3. Collectors.toList() 대신 다른 방법도 있나요?
Java 버전에 따라 toList()를 바로 사용할 수도 있습니다. 하지만 초보자 학습용으로는 collect(Collectors.toList())가 Stream 결과를 리스트로 모으는 개념을 이해하기 좋습니다.
Q4. Stream은 왜 굳이 쓰나요?
리스트를 직접 반복문으로 처리할 수도 있지만, Stream은 읽기 쉽고, 조건을 연결하기 좋고, 객체 리스트 처리에 강점이 있습니다. 특히 Java Stream을 배우면 skip, limit, filter, map 같은 기능을 함께 익히기 좋습니다.
개념 정리
stream(): 리스트를 Stream으로 변환skip(n): 앞에서 n개 건너뛰기limit(n): 앞에서 n개만 선택collect(Collectors.toList()): Stream 결과를 리스트로 모으기
이 흐름을 한 번 익혀 두면 Java에서 객체 리스트를 다룰 때 훨씬 편해집니다. 특히 Java Stream은 코드를 짧고 읽기 쉽게 만들어 주기 때문에 실습을 통해 익혀 두는 것이 좋습니다.
마무리 정리
이번 예제에서는 skip(3)과 limit(2)를 사용해 리스트의 일부만 선택하는 방법을 살펴봤습니다. 핵심은 Stream의 순서대로 처리된다는 점입니다. 먼저 건너뛰고, 그다음 개수를 제한한 뒤, Collectors.toList()로 다시 리스트로 모으면 됩니다.
Java 초보자라면 이 예제를 통해 Java Stream, Collectors.toList(), 객체 리스트 처리의 기본 흐름을 꼭 익혀 두세요. 작아 보이는 예제지만 실제 프로젝트에서도 자주 쓰는 패턴입니다.

저는 대학에서 컴퓨터 관련 학과 학생들을 가르치고 있는 교수 김기태입니다. Spring Boot, React, Python 등을 활용한 풀스택 웹 개발과 최신 AI 서비스 설계를 주로 다루고 있으며, 학생들이 현업 실무에 바로 적용할 수 있는 기술 역량을 키울 수 있도록 강의와 실습을 설계하고 있습니다.


