๐ŸŽผ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค์™€ ๋žŒ๋‹ค ํ‘œํ˜„์‹

sery270ยท2021๋…„ 6์›” 6์ผ
1

Kotlin

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

์•ˆ๋…•ํ•˜์„ธ์š” ! ์˜ค๋Š˜์€ RxJava๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์†Œ๊ฐœ๋œ lambda์™€ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. RxJava์™€ ๊ฐ™์ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ฑฐ๋‚˜, ์ฝ”ํ‹€๋ฆฐ๋‹ต๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ ์œ„ํ•ด์„ , ๋žŒ๋‹ค ์‹๊ณผ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•˜๋‹ˆ, ์ž˜ ๊ธฐ์–ตํ•˜์—ฌ ํšจ์œจ์ ์ธ ์ฝ”๋”ฉ์„ ํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค ! ๊ทธ๋Ÿผ ์˜ค๋Š˜๋„ ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค ๐ŸŒฟ

1๏ธโƒฃ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค


๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค ๋ฌธ๋ฒ•

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

๋žŒ๋‹ค์™€ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค

val getAge = {person: Person -> person.age} // ByLambda

val getAge = Person::age // ByMemberReference

์ตœ์ƒ์œ„ ๋ฉค๋ฒ„ ์ฐธ์กฐ

(๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹Œ ํ˜„์žฌ ํŒŒ์ผ) ์ตœ์ƒ์œ„์— ์„ ์–ธ๋œ ํ•จ์ˆ˜๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฉค๋ฒ„์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fun salute() = println("Salute!")

>>> run(::Salute) // run(::Salute()) (x)
Salute!

DisplayMessageActivity::class.java ์ด๊ฒƒ๋„ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค ์ธ๊ฐ€์š” ?

DisplayMessageActivity::class.java ์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์€ ๋ถ„๋ช… ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ํ•œ ๋ฒˆ์ฏค์€ ๋งˆ์ฃผ์ณ๋ณด์…จ์„๊ฒ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ตฌ๋ฌธ ๋˜ํ•œ ํŠน์ • ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ :: ์ด ์–‘์ชฝ์„ ๊ตฌ๋ถ„ํ•ด์ค€๋‹ค๋Š” ์ ์—์„œ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์ธ๊ฐ€? ํ•˜๊ณ  ๊ถ๊ธˆํ•˜์‹ค ์ˆ˜๋„ ์žˆ์œผ์‹คํ…๋ฐ์š”. (์ œ๊ฐ€ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค.) ํ•ด๋‹น ๊ตฌ๋ฌธ์€ ํด๋ž˜์Šค ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. (์‚ฌ์‹ค ๋”ฑ๋ด๋„ ์–ด๋–ค ๋ฉค๋ฒ„๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง„ ์•Š์ฃ ?)

์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋™๋ฃŒ๋“ค๋กœ๋ถ€ํ„ฐ Reflection์ด๋ผ๋Š” ํžŒํŠธ๋ฅผ ์–ป๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ ‰์…˜์€, ์ด ๊ธ€์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š”, ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค(๊ณต์‹ ๋ฌธ์„œ์—์„  Callable references๏ปฟ๋ผ๊ณ  ๋ถ€๋ฅด๋”๊ตฐ์š”)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํด๋ž˜์Šค ๋ ˆํผ๋Ÿฐ์Šค ๋‘๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ๋žŒ๋‹ค์™€ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์ด๋ฏ€๋กœ, ๋ฆฌํ”Œ๋ ‰์…˜์— ๋Œ€ํ•ด์„  ๋” ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋žŒ๋‹ค ํ‘œํ˜„์‹


๋žŒ๋‹ค ์‹์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋„˜๊ธธ ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ๋‹ต๊ฒŒ ์ฝ”๋”ฉ์„ ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๋žŒ๋‹ค ์‹์€ ์ ๊ทน ํ™œ์šฉ๋˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๋ฝ์—์„œ ๋จผ์ € ๋žŒ๋‹ค ์‹์˜ ๋ฌธ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ํ•ด๋‹น ๋žŒ๋‹ค ์‹์ด ์–ด๋–ป๊ฒŒ ์ถ•์•ฝ๋˜๊ณ  ์ƒ๋žต๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋žŒ๋‹ค ์‹ ๋ฌธ๋ฒ•

  • ์ฝ”ํ‹€๋ฆฐ ๋žŒ๋‹ค ์‹์€ ์ค‘๊ด„ํ˜ธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค.

  • -> ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ณธ๋ฌธ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

  • ๋žŒ๋‹ค๋Š” ์‹์ด๋ฏ€๋กœ, ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋žŒ๋‹ค ์‹์ด ์ €์žฅ๋œ ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • val sum = {x: Int, y: Int -> x + y}
      val answer = sum(1,2)
  • ๋žŒ๋‹ค๋Š” ์—ฌ๋Ÿฌ ๋ฌธ๋ฐฉ์œผ๋กœ ์ด๋ค„์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์ด ์—ฌ๋Ÿฌ ๋ฌธ์žฅ์ผ ๊ฒฝ์šฐ, ๋ณธ๋ฌธ์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์‹์ด ๋žŒ๋‹ค์˜ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.

    • val sum = {x: Int, y: Int -> 
      	println("the answer is ${x+y}")
      	x + y}
      val answer = sum(1,2)

      ์–ด๋–ป๊ฒŒ ๋”ฐ๋กœ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ ์ง€ ์•Š์•„๋„ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋‚˜์š” ?

      ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋žŒ๋‹ค ์‹์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋žŒ๋‹ค ์‹์˜ ์ถ•์•ฝ๊ณผ ์ƒ๋žต

  1. ๊ธฐ๋ณธ ๋žŒ๋‹ค ์‹์ž…๋‹ˆ๋‹ค.

    people.maxBy({ p: Person -> p.age})
  2. ๋žŒ๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰ ์ธ์ž๋ผ๋ฉด, ๋žŒ๋‹ค๋ฅผ ๊ด„ํ˜ธ ๋ฐ–์œผ๋กœ ๋บ„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    people.maxBy() { p: Person -> p.age}
  3. ํ•ด๋‹น ๋žŒ๋‹ค๊ฐ€ ์œ ์ผํ•œ ์ธ์ž๋ผ๋ฉด, ๋ฌด์˜๋ฏธํ•œ ( )๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    people.maxBy { p: Person -> p.age}
  4. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋žŒ๋‹ค ์‹์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    people.maxBy({ p -> p.age})

    ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋žŒ๋‹ค ์‹์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

    • ๋žŒ๋‹ค๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ
  5. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•˜๋‚˜๋ผ๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ , ๋””ํดํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์ธ it์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    people.maxBy({ it.age})

์ง€๊ธˆ๊นŒ์ง€ ์•Œ์•„๋ณธ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค์™€ ๋žŒ๋‹ค ํ‘œํ˜„์‹์œผ๋กœ ๊ฐ™์€ ๋‚ด์šฉ์„ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด ?

// ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค (property reference)
people.maxBy(Person::age)

// ๋žŒ๋‹ค
people.maxBy() {person: Person -> person.age}
people.maxBy {p -> p.age}
people.maxBy {it.age}
,,,

๋‹ค์Œ ๋‹จ๋ฝ์—์„œ ๋” ์ด์•ผ๊ธฐํ•˜๊ฒ ์ง€๋งŒ, ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ์ชฝ๋ณด๋‹ค, ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ์ถ•์•ฝํ•˜๋Š” ํ‘œํ˜„ํ•˜๋Š” ์ชฝ์ด ๋” ๊ฐ„๊ฒฐํ•ด๋ณด์ž…๋‹ˆ๋‹ค :>

3๏ธโƒฃ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค์™€ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๊ถŒ์žฅ ์šฐ์„ ์ˆœ์œ„


RxJava์™€ ๊ฐ™์ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ฑฐ๋‚˜, ์ฝ”ํ‹€๋ฆฐ๋‹ต๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ ์œ„ํ•ด์„ , ๋žŒ๋‹ค ์‹๊ณผ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋žŒ๋‹ค ์‹๊ณผ ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์•„๋ž˜์˜ ๊ฐ„๋‹จํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๊ฐ€๋…์„ฑ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฉค๋ฒ„ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ์ถ•์•ฝํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
  2. ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
  3. ์ต๋ช… ๊ฐ์ฒด๋‚˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„

#๏ธโƒฃ Reference


profile
๊ฐœ๋ฐœ์„ธ๋ฆฌ์˜ ์„ฑ์žฅ๊ธฐ๐ŸŒฟ

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