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