with ChatGPT 시리즈는 ChatGPT의 내용과 개인의 생각을 토대로 학습해 보는 컨텐츠입니다.
Kotlin은 함수형 프로그래밍 스타일을 자연스럽게 지원하는 컬렉션 함수 API를 제공하며, 코드를 간결하고 가독성 있게 작성할 수 있도록 돕습니다.
이번 글에서는 자주 쓰이는 함수들 - map, filter, reduce, flatMap 등을 중심으로, 개념 + 예시 + 실무 활용 팁까지 정리해 보겠습니다.
🔹 1. map: 변환 (Transformation)
map은 각 원소를 새로운 값으로 변환(transform)할 때 사용됩니다.
val name = listOf("Alice", "Bob", "Charlie")
val lengths = names.map { it.length }
// [5, 3, 7]
✅ 실무 활용 예
val users = listOf(User("Alice"), User("Bob"))
val usernames = users.map { it.name }
🔹 2. filter: 조건에 따라 걸러내기
filter는 조건을 만족하는 원소만 남기고 나머지를 제거합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val even = numbers.filter { it % 2 == 0 }
// [2, 4]
✅ 실무 활용 예
val activeUsers = users.filter { it.isActive }
🔹 3. reduce: 누적 계산
reduce는 리스트를 하나의 값으로 줄이는 데 사용됩니다.
val numbers = listOf(1, 2, 3, 4)
val sum = numbers.reduce { acc, n -> acc + n }
// 결과: 10
reduce는 첫 번째 원소를 초깃값으로 사용하고 두 번째부터 연산을 시작합니다.
안전하게 시작값을 지정하고 싶다면 fold를 사용해야 합니다.
🔹 4. flatMap: 평탄화된 리스트로 변환
flatMap은 각각의 원소를 리스트로 매핑한 뒤, 전체를 하나의 리스트로 평탄화합니다.
val nested = listOf(
listOf(1, 2),
listOf(3, 4),
listOf(5)
)
val flattened = nested.flatMap { it }
// [1, 2, 3, 4, 5]
✅ 실무 예시
val userTags = users.flatMap { it.tags }
// 각 사용자가 가진 tag 목록들을 하나의 리스트로 합침
🔹 5. 기타 유용한 함수들
함수 | 설명 | 예시 |
any {} | 하나라도 조건을 만족하면 true | users.any { it.isAdmin } |
all {} | 모두 조건을 만족해야 true | orders.all { it.isPaid } |
none {} | 모두 조건을 만족하지 않으면 true | logs.none { it.isError } |
groupBy {} | 그룹핑된 Map 생성 | students.groupBy { it.grade } |
associateBy {} | key를 기준으로 Map 생성 | users.associateBy { it.id } |
✅ 실무에서의 활용 포인트
1. Null-safe + 컬렉션 함수 조합
val emailList = users.mapNotNull { it.email }
- null을 자동으로 제거하고 매핑할 때 유용
2. 체이닝 (Chaining)으로 파이프라인 구성
val results = users
.filter { it.isActive }
.map { it.name.uppercase() }
.sorted()
- 데이터 처리 흐름을 단계별로 깔끔하게 표현
3. DTO 변환, 응답 가공에 활용
val responseDtos = orders.map { OrderResponse.of(it) }
- 서비스 레이어에서 Entity → DTO 변환 시 가장 자주 사용되는 패턴
🚨 주의할 점
항목 | 설명 |
.map + .filter 순서 | 필요한 경우 .filter 먼저 호출해 연산량 줄이기 |
.reduce vs .fold | 초깃값을 직접 줄 수 있어 fold가 더 안전함 |
성능 | 복잡한 체이닝은 경우에 따라 sequence로 지연 계산 고려 |
🚀 결론
함수 | 기능 | 실무 활용 예 |
map | 값 변환 | Entity → DTO 변환 |
filter | 조건 필터링 | isActive 사용자만 추출 |
reduce | 누적 계산 | 총합, 누적 결과 |
flatMap | 중첩 → 평탄화 | List<List> → List |
groupBy | 그룹화 | 상태, 카테고리 별 묶기 |
Kotlin의 컬렉션 함수는 단순한 데이터 가공부터 도매인 중심의 로직 구성까지 매우 널리 활용됩니다.
자바의 Stream API보다 훨씬 간결하고 표현력 있는 방식으로, Kotlin의 장점을 잘 보여주는 기능입니다.
🤔 추가로 생각해 볼 질문들
- sequence와 일반 List 연산은 성능상 어떤 차이가 있을까?
- mapNotNull은 내부적으로 어떻게 작동할까?
- associateBy와 groupBy는 언제 어떤 기준으로 선택해야 할까?
- 체이닝 한 컬렉션 연산에서 디버깅은 어떻게 하면 좋을까?
- 코루틴과 함께 사용하는 Flow에도 이런 연산을 그대로 쓸 수 있을까?