Java에서 Stream map으로 문자열 리스트 길이 구하기는 객체 리스트를 다루는 가장 기본적인 실습 중 하나입니다. 이 글에서는 stream()과 map()을 이용해 문자열을 길이로 바꾸는 과정을 처음 보는 사람도 이해할 수 있게 정리합니다. 읽고 나면 단순 출력이 아니라, map이 왜 자주 쓰이는지까지 함께 감을 잡을 수 있습니다.

왜 문자열 길이 구하기 예제가 유용할까
문자열 리스트의 길이를 구하는 작업은 단순해 보이지만, Java Stream의 핵심 개념을 익히기에 아주 좋습니다. 특히 map()은 리스트의 각 요소를 다른 형태로 변환하는 함수이기 때문에, 문자열을 숫자로 바꾸는 연습에 잘 맞습니다.
예를 들어 다음과 같은 상황에서 자주 활용됩니다.
- 사용자 이름의 글자 수를 확인할 때
- 상품 코드나 문서 제목의 길이를 비교할 때
- 문자열 데이터를 숫자 데이터로 바꾸어 후속 처리할 때
즉, 이번 예제는 “문자열의 길이 구하기” 자체보다도 리스트를 변환하는 사고방식을 익히는 데 더 큰 의미가 있습니다.
문제 정의
이번 글의 목표는 아주 명확합니다.
> 문자열 리스트의 각 문자열 길이를 구해서 출력하기
입력 예시는 아래와 같습니다.
["Java", "Stream", "Lambda", "Filter", "Map"]
이 리스트를 처리하면 각각의 길이인 다음 값이 나와야 합니다.
4
6
6
6
3
핵심 개념: stream()과 map()의 역할
Java Stream에서 이 예제가 중요한 이유는 stream()과 map()의 역할이 분명하게 드러나기 때문입니다.
stream()은 처리 흐름을 만든다
stream()은 리스트를 바로 수정하는 것이 아니라, 데이터를 하나씩 흘려보낼 수 있는 흐름으로 바꿉니다. 즉, List<String>을 Stream<String>으로 전환해 이후 연산을 이어갈 수 있게 해 줍니다.
map()은 요소를 변환한다
map()은 각 요소를 다른 값으로 바꾸는 함수입니다. 이번 예제에서는 문자열을 문자열 길이(Integer)로 변환합니다.
예를 들면 다음처럼 동작합니다.
"Java"→4"Stream"→6"Lambda"→6
이처럼 map()은 형태 변환에 강합니다. 그래서 문자열 리스트, 객체 리스트, 숫자 리스트 등 거의 모든 변환 작업에서 자주 사용됩니다.
전체 예제 코드
아래 코드는 문자열 리스트의 각 길이를 출력하는 가장 기본적인 형태입니다.
import java.util.Arrays;
import java.util.List;
public class BasicMap {
public static void main(String[] args) {
List<String> words = Arrays.asList("Java", "Stream", "Lambda", "Filter", "Map");
System.out.println("원본 문자열: " + words);
System.out.println("\n각 문자열의 길이:");
words.stream()
.map(String::length)
.forEach(System.out::println);
}
}
코드 한 줄씩 이해하기
1) 문자열 리스트 만들기
List<String> words = Arrays.asList("Java", "Stream", "Lambda", "Filter", "Map");
이 코드는 문자열 여러 개를 하나의 리스트로 묶습니다. List<String>이므로 각 요소는 문자열이고, Arrays.asList()를 사용해 간단하게 초기화할 수 있습니다.
2) stream()으로 변환 시작
words.stream()
이 부분에서 리스트가 Stream으로 바뀝니다. 이후에는 map(), filter(), forEach() 같은 연산을 이어서 사용할 수 있습니다.
3) map(String::length)로 길이 추출
.map(String::length)
이 부분이 핵심입니다. String::length는 메서드 참조로, 각 문자열에 대해 length()를 호출한다는 뜻입니다.
즉 아래 코드와 같은 의미입니다.
.map(word -> word.length())
결국 문자열이 숫자로 바뀌면서 Stream<Integer> 형태가 됩니다.
4) forEach로 출력
.forEach(System.out::println);
변환된 길이 값을 하나씩 출력합니다. forEach()는 최종 연산이므로, 이 시점에서 Stream 처리가 마무리됩니다.
실행 결과
실행하면 다음과 같은 결과를 확인할 수 있습니다.
원본 문자열: [Java, Stream, Lambda, Filter, Map]
각 문자열의 길이:
4
6
6
6
3
출력 결과를 보면 원본 문자열이 각각 길이 숫자로 바뀌어 나온다는 점을 확인할 수 있습니다. 이 흐름이 바로 map의 대표적인 사용 방식입니다.
실무 적용 방법
실무에서는 단순히 문자열 길이를 출력하는 것보다, 이 패턴을 다른 데이터 처리에 확장해서 사용합니다. 예를 들어 사원 이름, 상품명, 파일명, 태그 목록처럼 문자열 리스트가 있으면 map()으로 길이, 접두어, 대소문자 변환, 특정 형식 추출 등을 수행할 수 있습니다.
실무에서 자주 쓰는 형태는 다음과 같습니다.
- 문자열 길이 측정
- 문자열 대문자 변환
- 객체의 특정 필드 추출
- 숫자 데이터로 변환 후 통계 처리
예시로, 사용자 이름 리스트에서 글자 수를 구해 가장 긴 이름을 찾는 전처리에도 이 방식이 그대로 이어집니다. 즉, Java Stream map으로 문자열 길이 구하기는 작은 예제이지만 실무 패턴의 출발점이라고 볼 수 있습니다.
체크리스트
아래 항목을 확인하면 같은 패턴을 다른 데이터에도 안정적으로 적용할 수 있습니다.
- 리스트 타입이
List<String>인지 확인했는가 stream()을 통해 Stream으로 변환했는가map(String::length)처럼 원하는 값으로 변환했는가- 출력이 필요하다면
forEach()같은 최종 연산을 붙였는가 - 중간 결과가 필요하다면
collect()로 다시 모을 수 있는지 이해했는가
이 체크리스트를 기준으로 보면, map은 단순 출력보다 데이터 변환 단계에 가깝다는 점을 더 쉽게 이해할 수 있습니다.
주의할 점
Java Stream을 처음 다룰 때는 몇 가지 실수를 조심해야 합니다.
1) map과 forEach의 역할을 혼동하지 않기
map()은 변환, forEach()는 출력입니다. 출력만 하고 싶다면 map() 없이도 가능하지만, 변환이 목적이라면 반드시 map()을 써야 합니다.
2) null 값이 있는지 확인하기
문자열 리스트 안에 null이 있으면 String::length에서 오류가 발생할 수 있습니다. 실무에서는 먼저 filter(Objects::nonNull)로 null을 제거하는 방식이 안전합니다.
3) Stream은 재사용할 수 없다는 점 기억하기
한 번 사용한 Stream은 다시 쓸 수 없습니다. 같은 데이터를 두 번 처리하려면 다시 stream()을 호출해야 합니다.
4) 너무 복잡한 로직을 map 안에 넣지 않기
map()은 변환에 집중하는 것이 좋습니다. 여러 조건과 예외 처리가 많다면 별도 메서드로 분리하는 편이 유지보수에 유리합니다.
확장 예제: 람다식으로도 작성하기
String::length 대신 람다식을 사용해도 같은 결과를 얻을 수 있습니다.
words.stream()
.map(word -> word.length())
.forEach(System.out::println);
둘의 결과는 동일하지만, 메서드 참조인 String::length가 더 간결합니다. 코드가 짧고 의미가 분명할 때는 메서드 참조를 선호하는 경우가 많습니다.
자주 묻는 질문
1. map(String::length)와 map(word -> word.length())는 같은가요?
네, 같은 결과를 냅니다. 둘 다 문자열의 길이를 구합니다. 다만 String::length는 메서드 참조를 사용한 표현이고, word -> word.length()는 람다식을 사용한 표현입니다. 간결함 측면에서는 메서드 참조가 더 읽기 쉽습니다.
2. 문자열 길이를 구한 뒤 다시 리스트로 만들 수 있나요?
가능합니다. forEach() 대신 collect(Collectors.toList())를 사용하면 길이 값들을 다시 리스트로 모을 수 있습니다.
List<Integer> lengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
이 방식은 출력보다 후속 계산이 필요할 때 유용합니다.
3. 문자열이 아닌 객체 리스트에도 map()을 쓸 수 있나요?
네, 오히려 실무에서는 객체 리스트에 더 많이 씁니다. 예를 들어 Student 리스트에서 이름만 뽑거나, 가격만 추출하거나, 주소만 가져오는 방식으로 활용할 수 있습니다. 즉, map()은 문자열 길이 구하기보다 더 넓은 범위에서 쓰이는 핵심 연산입니다.
4. stream() 없이도 길이를 구할 수 있나요?
물론 가능합니다. for문으로 직접 순회하면서 length()를 호출해도 됩니다. 하지만 Stream을 사용하면 코드가 더 간결해지고, map, filter, collect 같은 연산을 연결하기 쉬워집니다.
정리하며
이번 예제는 Java Stream에서 map()이 어떤 방식으로 동작하는지 확인하기에 좋은 시작점입니다. 문자열 리스트의 각 요소를 길이 숫자로 바꾸는 과정은 단순하지만, 객체를 다른 값으로 변환하는 기본 패턴을 명확하게 보여 줍니다. 이 흐름을 익혀 두면 이후에는 필터링, 정렬, 집계까지 자연스럽게 확장할 수 있습니다.
| 항목 | 정리 |
|---|---|
| 주제 | Java Stream map으로 문자열 리스트 길이 구하기 |
| 핵심 기능 | stream(), map(), forEach() |
| 변환 방식 | 문자열 → 길이(Integer) |
| 예제 입력 | ["Java", "Stream", "Lambda", "Filter", "Map"] |
| 실행 결과 | 4, 6, 6, 6, 3 |
| 실무 포인트 | 객체 리스트의 특정 값 추출과 데이터 변환에 활용 |


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


