์ถ์ฒ
Kotlin In Action
https://antonioleiva.com/function-references-kotlin/
https://kotlinlang.org/docs/reflection.html#bound-function-and-property-references
๋ฉค๋ฒ ์ฐธ์กฐ
์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ์์ด๋ค. ::(์ด์ค ์ฝ๋ก )์ ์ฌ์ฉํ๋ค.
ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ํจ์ ๊ฐ์ ๋ง๋ค์ด์ค๋ค. ๋๋ค์ ์๋ก ๋์ฒดํ ์ ์๊ธฐ ๋๋ฌธ์, ํจ์๋ฅผ ๋๋ค๋ก ๋ง๋ค์ด์ค๋ค๋ผ๊ณ ์ค๋ช ํ๊ธฐ๋ ํ๋ค.
์ฅ์ - ์ ์ฐ๋๊ฐ -> ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ ํฉํ๋ค
1. ์ฝ๋ ๊ฐ๊ฒฐ์ฑ
๋๋ค๋ฅผ ๋์ฒดํด์ ์ธ ์ ์์ด์, ๋ฉค๋ฒ ์ฐธ์กฐ๊ฐ ๋๋ค๋ฅผ ๋ ์งง๊ฒ ๋ง๋ค์ด์ค๋ค๊ณ ํํํ๊ธฐ๋ ํ๋ค.
์งง๋ค๊ณ ๊ฐ๋ ์ฑ์ด ๋ค ์ข์์ง๋ ๊ฒ์ ์๋๋ค. ๋๋ก๋ ๋๋ค๊ฐ ๊ฐ๋ฐ์๊ฐ ๋ณด๊ธฐ์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ๋ ์ฌ์ด ๊ฒฝ์ฐ๋ ์๋ค.
2. ์ฌ์ฌ์ฉ์ฑ
๊ธฐ์กด์ ๋ฉ์๋๋ ์์ฑ์ ์ ๋ฌํ๋ ๊ฒ์ด๊ธฐ์ ์ฌ์ฌ์ฉ์ฑ์ด ์ข๋ค. ํจ์๋ฅผ ์ธ์๋ ๊ฒฐ๊ณผ๋ก ๋ฐํํ ์ ์๊ฒ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
3. ์์์ฑ ์ ์ง
๋ฉค๋ฒ ์ฐธ์กฐ๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค์ง ์๋๋ค. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ์ค์ํ ์์ํจ์๋ฅผ ๊ตฌํํ๋ ์ ์ฉํ๋ค.
๐ค ์์ ํจ์๋ : ๋์ผํ ์ ๋ ฅ์ ๋ํด ํญ์ ๋์ผํ ์ถ๋ ฅ์ ๋ฐํํ๊ณ , ์ธ๋ถ ์ํ์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ํจ์
๋ฉค๋ฒ ์ฐธ์กฐ ๋ฌธ๋ฒ
{ํด๋์ค}::{๋ฉค๋ฒ}
์์
Person::age
run(::salute)
//salute()๋ ์ต์์ ํจ์์ด๋ค.
๋ฉค๋ฒ ์ฐธ์กฐ์ ๋๋ค๋ ๊ฐ๋ค?
์ํ ๋ณํ์ผ๋ก ์ธํด ๋ฉค๋ฒ ์ฐธ์กฐ์ ๋๋ค๋ ๋์ผํ๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ฉค๋ฒ ์ฐธ์กฐ์ ๋๋ค๋ ์๋ก ๋์ฒด๋ ์ ์๋ค.
๋๋ค ํํ์
val printNameLambda: (Person) -> Unit = { person -> println(person.name) }
๋ฉค๋ฒ ์ฐธ์กฐ
val printNameReference: (Person) -> Unit = Person::name
๋ฐ์ด๋ ๋ฉค๋ฒ ์ฐธ์กฐ
์ด๋ฏธ ์กด์ฌํ๋ ์ธ์คํด์ค(๊ฐ์ฒด)์ ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ.
๋ค์ ๋งํ์๋ฉด ํน์ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋ ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ. ์ฌ๊ธฐ์ ๋ฐ์ธ๋ฉํ๋ค๋ ์๋ฏธ๋ ํน์ ๊ฐ์ฒด์ ๊ทธ ๊ฐ์ฒด์ ๋ฉค๋ฒ ํจ์๋ ์์ฑ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋ปํ๋ค.
๋ฐ์ด๋ ๋ฉค๋ฒ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉค๋ฒ ์ฐธ์กฐ ์์ ๋ฐ๋ก ๊ฐ์ฒด๋ฅผ ์ง์ ํ ํ์๊ฐ ์๋ค.
์์
val alice = Person("Alice")
val greetAlice = alice::greet
greetAlice("Hello") // "Alice, Hello!" ์ถ๋ ฅ
์ฌ๊ธฐ์ alice::greet๋ alice ๊ฐ์ฒด์ greet ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๋ ๋ฐ์ด๋ ๋ฉค๋ฒ ์ฐธ์กฐ์ด๋ค.
์ด๋ฅผ ํตํด greetAlice๋ alice ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.