11. Arrays & Collections
배열과 컬렉션
치트시트
배열은
arrayOf
,IntArray
, 잘 안 씀기본은 불변 컬렉션(listOf, setOf, mapOf)
수정 필요 시
mutableListOf
등 사용인덱스와 값:
withIndex()
함수형 연산:
filter
,map
,mapNotNull
,sortedBy
,count
,any
,all
서버 개발: DTO 변환, 응답 가공, 캐싱된 데이터 필터링에 활용
1) 배열 (Array)
잘 쓰이지 않지만 문법적으로 제공
arrayOf
,intArrayOf
,Array(size) { init }
로 생성
val arr = arrayOf(1, 2, 3)
val arr2 = IntArray(3) { it * 2 } // [0, 2, 4]
인덱스 접근:
arr[i]
인덱스 범위:
arr.indices
인덱스와 값 동시 접근:
for ((i, v) in arr.withIndex()) { ... }
👉 서버 개발에서는 배열 대신 대부분 컬렉션 사용.
2) 컬렉션 기본
불변 / 가변
listOf
,setOf
,mapOf
: 불변 컬렉션mutableListOf
,mutableSetOf
,mutableMapOf
: 가변 컬렉션
val nums = listOf(1,2,3) // 읽기 전용
val mnums = mutableListOf(1,2,3) // 수정 가능
mnums.add(4)
👉 불변 컬렉션을 기본으로 두고, 내부에서만 가변을 쓰는 게 실무 베스트 프랙티스.
3) 컬렉션 팩토리 & 유틸
val empty = emptyList<String>()
val singleton = listOf("one")
val map = mapOf("a" to 1, "b" to 2)
타입 추론 가능 → 코드 간결화
4) 함수형 연산 (고차 함수)
필터링, 매핑, 집계 API 제공
val list = listOf(1,2,3,4)
val evens = list.filter { it % 2 == 0 } // [2,4]
val doubled = list.map { it * 2 } // [2,4,6,8]
val sum = list.reduce { acc, i -> acc + i } // 10
널 제거:
mapNotNull
정렬:
sortedBy
,sortedByDescending
집계:
count
,any
,all
,none
5) 서버 개발 활용 패턴
A. DTO 변환
val users = rows.map { UserDto(it.id, it.name) }
B. 캐싱된 데이터 필터링
val activeTokens = tokens.filter { it.expiresAt > now() }
C. API 응답 변환
fun toResponse(items: List<Item>): List<ItemResponse> =
items.map { ItemResponse(it.id, it.name) }
👉 컬렉션 파이프라인을 활용하면 스트림 API보다 코드가 더 짧고 읽기 쉬움.
Last updated