associate

associate ํ•จ์ˆ˜๋Š” Kotlin์˜ ์ปฌ๋ ‰์…˜ ํ™•์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ, ๋ฆฌ์ŠคํŠธ(List)๋‚˜ ๋‹ค๋ฅธ Iterable ๊ฐ์ฒด๋ฅผ Map์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋งค์šฐ ์œ ์šฉํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ํ‚ค(Key)์™€ ๊ฐ’(Value)์„ ์ƒ์„ฑํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋งต์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

associate ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ๊ตฌ์กฐ

associate ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋žŒ๋‹ค(lambda) ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. Iterable์˜ ๊ฐ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด Pair ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด Pair ๊ฐ์ฒด๋Š” key์™€ value๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, item.id to item.name๊ณผ ๊ฐ™์ด to ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pair๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. associate ํ•จ์ˆ˜๋Š” ์ด Pair๋“ค์„ ๋ชจ์•„์„œ ์ƒˆ๋กœ์šด Map<Key, Value>๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋™์ผํ•œ ํ‚ค๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์ƒ์„ฑ๋œ๋‹ค๋ฉด, ๋งˆ์ง€๋ง‰์— ์ƒ์„ฑ๋œ ํ‚ค-๊ฐ’ ์Œ์ด ์ตœ์ข… ๋งต์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ์ ์€ associate ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠนํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ: fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>

  • Iterable<T>: associate ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์›๋ณธ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. T๋Š” ์ปฌ๋ ‰์…˜ ์š”์†Œ์˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

  • transform: (T) -> Pair<K, V>: ๊ฐ ์š”์†Œ T๋ฅผ ๋ฐ›์•„์„œ Pair<K, V>๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. K๋Š” ๋งต์˜ ํ‚ค ํƒ€์ž…, V๋Š” ๋งต์˜ ๊ฐ’ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

  • Map<K, V>: ์ตœ์ข…์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๋งต ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

associate ํ•จ์ˆ˜์˜ ์‹ค์ œ ๋™์ž‘

๋‹ค์Œ์€ associate ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. User๋ผ๋Š” ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ , ์ด ๋ฆฌ์ŠคํŠธ๋ฅผ id๋ฅผ ํ‚ค๋กœ ํ•˜๋Š” ๋งต์œผ๋กœ ๋ณ€ํ™˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

data class User(val id: Int, val name: String, val age: Int)

fun main() {
    val users = listOf(
        User(1, "Alice", 30),
        User(2, "Bob", 25),
        User(3, "Charlie", 35)
    )

    // users ๋ฆฌ์ŠคํŠธ๋ฅผ id๋ฅผ ํ‚ค๋กœ, User ๊ฐ์ฒด ์ „์ฒด๋ฅผ ๊ฐ’์œผ๋กœ ํ•˜๋Š” ๋งต์œผ๋กœ ๋ณ€ํ™˜
    val userMap: Map<Int, User> = users.associate { user ->
        user.id to user
    }

    // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    println(userMap)
    // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: {1=User(id=1, name=Alice, age=30), 2=User(id=2, name=Bob, age=25), 3=User(id=3, name=Charlie, age=35)}

    // ๋งต์—์„œ ํŠน์ • id๋ฅผ ๊ฐ€์ง„ ์œ ์ € ์ฐพ๊ธฐ
    val alice = userMap[1]
    println(alice)
    // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: User(id=1, name=Alice, age=30)
}

์ด ์˜ˆ์ œ์—์„œ users.associate { user -> user.id to user } ๋ถ€๋ถ„์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

  1. users ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์ธ User(1, "Alice", 30)๊ฐ€ ๋žŒ๋‹ค๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

  2. ๋žŒ๋‹ค๋Š” 1 to User(...)(Pair(1, User(...)))๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. associate๋Š” ์ด Pair๋ฅผ ์ƒˆ๋กœ์šด ๋งต์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 1์ด ํ‚ค, User(...)๊ฐ€ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.

  4. ๋‹ค์Œ ์š”์†Œ์ธ User(2, "Bob", 25)์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ๊ณผ์ •์ด ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

  5. ์ตœ์ข…์ ์œผ๋กœ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•œ ๋ณ€ํ™˜์ด ๋๋‚˜๋ฉด, Map<Int, User>๊ฐ€ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

associate์™€ ์œ ์‚ฌํ•œ ํ•จ์ˆ˜๋“ค ๋น„๊ต

Kotlin์—๋Š” associate์™€ ๋น„์Šทํ•ด ๋ณด์ด๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

1. associateBy

associateBy๋Š” associate๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‚ค๋งŒ ์ƒ์„ฑํ•˜๊ณ , ์›๋ณธ ๊ฐ์ฒด ์ „์ฒด๋ฅผ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. associate๋Š” ํ‚ค์™€ ๊ฐ’์„ ๋ชจ๋‘ ์ง์ ‘ Pair๋กœ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜์ง€๋งŒ, associateBy๋Š” ํ‚ค๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋žŒ๋‹ค๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

ํ˜•ํƒœ: fun <T, K> Iterable<T>.associateBy(keySelector: (T) -> K): Map<K, T>

val userMapBy: Map<Int, User> = users.associateBy { it.id }
// ๊ฒฐ๊ณผ๋Š” ์œ„ associate ์˜ˆ์ œ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

2. associateWith

associateWith๋Š” associateBy์™€ ๋ฐ˜๋Œ€๋กœ, ์›๋ณธ ๊ฐ์ฒด๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐ’๋งŒ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ˜•ํƒœ: fun <T, V> Iterable<T>.associateWith(valueTransform: (T) -> V): Map<T, V>

val userNameMap: Map<User, String> = users.associateWith { it.name }
// ๊ฒฐ๊ณผ: {User(...) -> "Alice", User(...) -> "Bob", User(...) -> "Charlie"}

Kotlin์˜ associate ํ•จ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งต์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋งค์šฐ ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. associate๋Š” ํ‚ค์™€ ๊ฐ’์„ ๋ชจ๋‘ ์ง์ ‘ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜์—ฌ Pair๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ , associateBy๋Š” ํ‚ค๋งŒ ์ง€์ •ํ•˜๊ณ  ๊ฐ’์„ ์›๋ณธ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, associateWith๋Š” ํ‚ค๋ฅผ ์›๋ณธ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ’๋งŒ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

Last updated