Kotlin
[Kotlin] ์ฝํ๋ฆฐ ๋ฌธ๋ฒ ๊ณ ๊ธ 2
soogoori
2024. 7. 9. 17:25
๋๋ค๋ก ํ๋ก๊ทธ๋๋ฐ
๐ท ํจ์๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ธฐ
val printHello: () -> Unit = { println("Hello") }
fun main() {
val list = mutableListOf(printHello)
list[0]() // ํจ์ ํธ์ถ์ ์ํด ()๋ฅผ ์จ์ผํจ
}
// Hello
- ๋ฆฌ์คํธ์ ์ ์ฅ ํ ์ฌ์ฉ
val list = mutableListOf(printHello)
val func = list[0]
func()
// Hello
- ํจ์๋ ๊ฐ์ด๋ฏ๋ก ๋ณ์๋ก ๋ฐ์์ ์ฒ๋ฆฌ
val printHello: () -> Unit = { println("Hello") }
fun call(block: () -> Unit) {
block()
}
fun main() {
call(printHello)
}
// Hello
- ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ฌ์ฉ
fun main() {
val list = mutableListOf(printNo) // ์ปดํ์ผ ์ค๋ฅ
}
fun printNo() {
println("No!")
}
- fun์ผ๋ก ์ ์ธ๋ ํจ์๋ ๊ฐ์ผ๋ก ๋ค๋ฃฐ ์ ์์
val printMessage : (String) -> Unit = { message : String -> println(message) }
// ํ์
์๋ต
val printMessage : (String) -> Unit = { message -> println(message) }
// it ์ฌ์ฉ
val printMessage : (String) -> Unit = { println(it) }
- ์ธ์๋ฅผ ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์ ๊ฐ ๋ง๋ค๊ธฐ ๊ฐ๋ฅ
val plus: (Int, Int) -> Int = { a, b -> a + b }
fun main() {
val result = plus(1, 3)
println(result)
}
// 4
- ๋ค์์ ์ธ์๋ฅผ ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์ ๊ฐ ๋ง๋ค๊ธฐ ๊ฐ๋ฅ
๐ท ์ต๋ช ํจ์์ ๋๋ค์
fun outerFunc(): () -> Unit {
return fun() {
println("์ด๊ฒ์ ์ต๋ช
ํจ์!")
}
}
fun main() {
outerFunc()()
}
// ์ด๊ฒ์ ์ต๋ช
ํจ์!
์ค์ฝํ ํจ์
๊ฐ์ฒด์ ์ปจํ ์คํธ ๋ด์์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด์๋ง ์กด์ฌํ๋ ํจ์
๐น ๋ถํ์ํ ๋ณ์ ์ ์ธ์ด ์์ด์ง๋ฉฐ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ฆ
๐น ์ค์ฝํ ํจ์ ์ฝ๋ ๋ธ๋ก ๋ด๋ถ์์๋ ๋ณ์๋ช ์ ์ฌ์ฉํ์ง ์๊ณ ๋ ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅ ๐ ์์ ์ ๊ฐ์ฒด์ ์ ๊ทผ
๐น ์์ ์ ๊ฐ์ฒด = ๋๋ค์ ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด์ ์ฐธ์กฐ
๐น ์์ ์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ก this ๋๋ it ์ฌ์ฉ
๐ท let
null์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋ ๋ก์ง์ ์์ฑํ๊ณ ์๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
fun main() {
val str: String? = null
str?.let {
println(it) // ?. ์์ ํธ์ถ ์ฐ์ฐ์ ์ฌ์ฉ -> str์ด null์ด ์๋ ๊ฒฝ์ฐ์๋ง ์คํ๋จ
}
// ์๋ฌด๊ฒ๋ ์ถ๋ ฅ๋์ง ์์
}
- null์ด ์๋ ๊ฒฝ์ฐ ์คํ
fun main() {
val str: String? = "์๋
"
str?.let {
println(it)
}
// ์๋
}
- ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ ๐ let ํจ์ ๋ด๋ถ์ ๋ง์ง๋ง ์ฝ๋๊ฐ ๊ฒฐ๊ณผ๋ก ๋ฐํ
fun main() {
val str : String? = "์๋
"
val result = str?.let {
println(it)
1234 // let ํจ์ ๋ง์ง๋ง ์ฝ๋๊ฐ ๊ฒฐ๊ณผ๋ก ๋ฐํ
}
println(result)
// ์๋
// 1234
}
๐ท run
์์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๊ตฌ์ฑํ๊ฑฐ๋ ์๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ ์ถ์ ๋
class DatabaseClient {
var url: String? = null
var username: String? = null
var password: String? = null
// DB์ ์ ์ํ๊ณ Boolean ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
fun connect(): Boolean {
println("DB ์ ์ ์ค ...")
Thread.sleep(1000)
println("DB ์ ์ ์๋ฃ")
return true
}
}
fun main() {
val connected = DatabaseClient().run { // DatabaseClient๊ฐ ์์ ์ ๊ฐ์ฒด => this
url = "localhost:3306" // this.url => this ์๋ต ๊ฐ๋ฅ
username = "mysql"
password = "1234"
connect()
}
println(connected)
}
๐ let์ ์ฌ์ฉํ ์๋ ์์ผ๋ this ๋์ it์ ์ฌ์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ถํธ
๐ท with
๊ฒฐ๊ณผ ๋ฐํ์์ด ๋ด๋ถ์์ ์์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
โจ ํ์ฅํจ์ X
val str = "์๋
ํ์ธ์"
with(str) {
println("length = $length")
}
val connected = with(DatabaseClient()) {
url = "localhost:3306"
username = "mysql"
password = "1234"
connect()
}
println(connected)
๐ run์ผ๋ก ์์ฑํ ์ฝ๋๋ฅผ with๋ก ๋ณ๊ฒฝ
๐ฅ run๊ณผ with ์ฐจ์ด
๐น run : ๊ฐ์ฒด๋ฅผ ์ง์ ์ฐธ์กฐ & ๊ฐ์ฒด ์ด๊ธฐํ, ๊ตฌ์ฑ ๋ฐ ๊ฒฐ๊ณผ ๋ฐํ์ ์ ์ฉ
val result = myObject.run { // ์์ ์ํ }โ
๐น with : ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌ & ์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ์ฒด์ ๋ํ ์ฌ๋ฌ ์์ ์ ์ํํ๊ณ ๊ฒฐ๊ณผ ๋ฐํํ ๋ ์ ์ฉ
val result = with(myObject) { // ์์ ์ํ }โ
๐ท apply
์์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ ์์ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ๊ฒฐ๊ณผ๋ก ๋ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
โจ ์์ ๊ฐ์ฒด ๊ทธ๋๋ก ๋ฐํ๋จ
val client: DatabaseClient = DatabaseClient().apply {
url = "localhost:3306"
username = "mysql"
password = "1234"
connect()
}
val connected = client.connect()
println(connected) // true
println(client) // DatabaseClient@2f7c7260
๐ท also
๋ถ์ ์์ ์ ์ํํ๊ณ ์ ๋ฌ๋ฐ์ ์์ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ๊ฒฐ๊ณผ๋ก ๋ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
class User(val name: String, val password: String) {
fun validate() {
if(name.isNotEmpty() && password.isNotEmpty()) {
println("๊ฒ์ฆ ์ฑ๊ณต !")
} else{
println("๊ฒ์ฆ ์คํจ !")
}
}
fun printName() = println(name)
}
fun main() {
User(name="Tony", password="1234").also {
it.validate()
it.printName()
}
}
๐ also ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ, User์ ๋ํ ๋ณ์๋ฅผ ๋ง๋ค๊ณ ๋ณ์ ์ค๋ณต ์ฌ์ฉํด์ผํจ
๐ฅ ์ค์ฝํ ํจ์ ์ฌ์ฉ ์ ์ ์ํ ์
- this๋ ํค์๋์ด๋ฏ๋ก ๋ค๋ฅธ ์๋ฏธ๋ก ์ฌ์ฉ ๋ถ๊ฐ
- it์ ํน์ ์ฉ๋์์๋ง ์๋ํ๋ ์ํํธ ํค์๋์ด๋ฏ๋ก ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ
val this: String? = null // ์ปดํ์ผ ์ค๋ฅ
val it: String? = null // ์๋
- ์ค์ฒฉ์ผ๋ก ์ฌ์ฉ ์ this, it์ ๋ํด ํผ๋ํ๊ธฐ ์ฌ์
fun main() {
val hello = "hello"
val hi = "hi"
hello.let {
println(it.length)
hi.let {
println(it.length)
}
}
}
hello.let { a ->
println(a.length)
hi.let { b ->
println(a.length)
println(b.length)
}
}
๐ it ๋์ ๋ณ์ ์ ์ธ
์ฐธ๊ณ ์๋ฃ
https://kotlinlang.org/docs/scope-functions.html