๐Ÿ”ฅTIL๐Ÿ”ฅ์ŠคํŒŒ๋ฅดํƒ€ | ์ฝ”ํ‹€๋ฆฐ ์ปฌ๋ ‰์…˜

hyihyiยท2023๋…„ 11์›” 29์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
8/69
post-thumbnail

๋žŒ๋‹ค ํ‘œํ˜„์‹

๋žŒ๋‹ค : ๊ณ ์ฐจํ•จ์ˆ˜์— ์•„๊ทœ๋จผํŠธ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์งง์€ ํ•จ์ˆ˜. ํ•จ์ˆ˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณ ์ฐจํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒฐ์ •์„ ํ•˜๊ฑฐ๋‚˜ ๊ณ„์‚ฐ์„ ํ•˜๋Š” ๋Œ€์‹  ๋žŒ๋‹ค์—๊ฒŒ ๊ฒฐ์ •์ด๋‚˜ ๊ณ„์‚ฐ์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋žŒ๋‹ค์˜ ๊ตฌ์กฐ

๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ์ด๋ฆ„์ด ์—†๊ณ  ํƒ€์ž…์ถ”๋ก ์„ ์ด์šฉํ•œ ๋ฆฌํ„ด ํƒ€์ž…์„ ๊ฐ€์ง€๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋Š” ์ด๋ฆ„, ๋ฆฌํ„ด ํƒ€์ž…, ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ, ๋ฐ”๋””์ฒ˜๋Ÿผ 4๊ฐœ์˜ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋žŒ๋‹ค๋Š” ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ฐ”๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ์™€ ๋ฐ”๋”” ๋‘ ๊ฐœ๋‹ค.

{ parameter list -> body }

๋žŒ๋‹ค๋Š” { }๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋‹ค. ๋ฐ”๋””๋Š” ํ™”์‚ดํ‘œ(->)๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ถ„๋ฆฌ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋””๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์ผ ๋ช…๋ น๋ฌธ ํ˜น์€ ๋‹จ์ผ์‹์ด๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด ์—ฌ๋Ÿฌ ์ค„์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์ปฌ๋ ‰์…˜

imutable : ์ฝ๊ธฐ ์ „์šฉ ์ธํ„ฐํŽ˜์ด์Šค
mutable : ์ฝ๊ธฐ-์“ฐ๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค

map

map( ) ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ์ฝœ๋ ‰์…˜์˜ ๊ฐ ์š”์†Œ์— ๋žŒ๋‹ค๋ฅผ ์ ์šฉํ•œ ์ƒˆ ์ฝœ๋ ‰์…˜์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

์ง์ˆ˜๋ฅผ 2๋ฐฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๋‹ค๋ฅธ ์ฝœ๋ ‰์…˜์— ์ถ”๊ฐ€ํ•ด๋ณด์ž
์•„๋ž˜๋Š” ์™ธ๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ์ฝ”๋“œ์ด๋‹ค.

val numbers = listOf(10, 12, 18)
val doubled = mutableListOf<Int>()
for (i in numbers){
	if(i % 2 == 0){
    	doubled.add(i * 2)
    }
}
println(doubled) // [20, 24, 36]

์ด์ œ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•œ ๋ฒ„์ „์„ ์‚ดํŽด๋ณด์ž.

val doubledEven = numbers.filter { e -> e % 2 == 0 }
.map { e -> e * 2 }
println(doubledEven) // [20, 24, 36]

map( ) ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ์ฝœ๋ ‰์…˜์˜ ๊ฐ ์š”์†Œ์— ๋žŒ๋‹ค๋ฅผ ์ ์šฉํ•œ ์ƒˆ ์ฝœ๋ ‰์…˜์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
์ฝ”ํ‹€๋ฆฐ์˜ ์™ธ๋ถ€ ๋ฐ˜๋ณต์ž๋„ ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๊ฐ€ ๋” ๋›ฐ์–ด๋‚˜๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ณธ์ธ์—๊ฒŒ ๋” ํŽธํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž

์™ธ๋ถ€ ๋ฐ˜๋ณต์ž๋Š” ๋ณดํ†ต for๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์€ filter( ), map( ), flatMap( ), reduce( ) ๋“ฑ ๋งŽ์€ ํŠน๋ณ„ํ•œ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

filter( ), map( ), reduce( )๋Š” ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ํ•จ์ˆ˜๋“ค์ด๋‹ค.
filter( ) ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ์ปฌ๋ ‰์…˜์—์„œ ํŠน์ • ๊ฐ’์„ ๊ณจ๋ผ๋‚ด๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๋ฒ„๋ฆฐ๋‹ค.
map( ) ํ•จ์ˆ˜๋Š” ์ปฌ๋ ‰์…˜์˜ ๊ฐ’์„ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋‚˜ ๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•ด์„œ ๋ณ€ํ™”์‹œํ‚จ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ reduce( ) ํ•จ์ˆ˜๋Š” ์š”์†Œ๋“ค์„ ๋ˆ„์ ํ•ด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด ์„ธ ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ์ฃผ์–ด์ง„ ์ปฌ๋ ‰์…˜์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์„ธ ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ๋ณต์‚ฌ๋œ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์„ธ ๊ฐ€์ง€ ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ์ดํ•ดํ•ด๋ณด์ž.
์ผ๋‹จ Person ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒ˜ํ”Œ ๊ฐ’๋“ค๋กœ ๋งŒ๋“  ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์ž.

data class Person(val firstName: String, val age: Int)
val people = listOf
Person ("Sara", 12), 
Person("Jill", 51), 
Person ("Paula", 23), 
Person ("Paul", 25), 
Person ("Mani", 12), 
Person ("Jack", 70),
Person ("Sue", 10))

๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ 20์‚ด ์ด์ƒ์ธ ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๊พธ๊ณ , ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•ด๋ณด์ž.

val result = people.filter { person -> person.age > 20 }
	.map { person -> person.firstName }
    .map { name -> name.toUpperCase() }
    .reduce { names, name -> "$names, $name" }
println(result) //JILL, PAULA, PAUL, JACK

filter( ) ํ•จ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„ ์ปฌ๋ ‰์…˜์—์„œ ๋‚˜์ด๊ฐ€ 20์‚ด ์ด์ƒ์ธ Person๋งŒ์„ ์ถ”์ถœํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ”์ถœ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ map( )์— ์ „๋‹ฌํ–ˆ๋‹ค. map( )์€ 20์‚ด ์ด์ƒ์ธ Person์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด๋ฆ„๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ map( )์€ ์ „๋‹ฌ๋ฐ›์€ ์ด๋ฆ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. 2๊ฐœ์˜ map( ) ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ„๋ฆฌ์‹œ์ผœ ๋†“๋Š” ๊ฒƒ์ด ์ฝ”๋“œ๋ฅผ ๊ฐ ๋ผ์ธ์ด ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ reduce( ) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋Œ€๋ฌธ์ž ์ด๋ฆ„๋“ค์„ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์— ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๋„ฃ๋Š”๋‹ค.
์ฝ”ํ‹€๋ฆฐ์€ sum, max, joinToString๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์— ํŠนํ™”๋œ reduce ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•œ๋‹ค. ์œ„์—์„œ ์‚ฌ์šฉํ•œ reduce( )๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค

joinToString(", ")

๋งŒ์•ฝ์— ๋ฆฌ์ŠคํŠธ์˜ Person์˜ ๋‚˜์ด๋ฅผ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์›ํ•œ๋‹ค๋ฉด map( )๊ณผ reduce( )๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

val totalAge = people.map { person -> person.age }
	.reduce { total, age -> total + age }
println(totalAge)

reduce( ) ๋Œ€์‹ ์— ํŠนํ™”๋œ reduce ์—ฐ์‚ฐ์ธ sum( )์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

val totalAge2 = people.map { person -> person.age } 
	.sum()

reduce( )๋Š” ์ปฌ๋ ‰์…˜ ๊ฐ’๋“ค์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋ˆ„์ ์—ฐ์‚ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ํ•˜์ง€๋งŒ sum์ด๋‚˜ join๊ฐ™์€ ํŠนํ™”๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ํ‘œํ˜„๋ ฅ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์—๋Ÿฌ๋ฅผ ์ ๊ฒŒ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ ์œ ์ง€๋ณด์ˆ˜ ๋˜ํ•œ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
์ž์œ ๋กญ๊ฒŒ ์“ด ๋‚˜์˜ ์ž์œ ๋กœ์šด Development voyageโ›ต

0๊ฐœ์˜ ๋Œ“๊ธ€