New Score :0
High Score :0
Run Best
NICE BUSINESS TYPE INDICATOR
3. ๊ธ์ ์ ์น๊ตฌ์๊ฒ ๋น๋ ธ๋๋ฐ ์ค๋์ด ๋์ ์ฃผ๊ธฐ๋ก ํ๋ .. ๊ทธ๋ฐ๋ฐ ์นด๋๊ฐ์ ๋ด์ผํ๋ ๋ ๋ ์ค๋์ธ๋ฐ... ์ด๊ฑธ ์ด์ฉ๋...
4. ์ฐ๋ฆฌ ํ์ฌ๋ ์ค์ํ ์์ฌ ๊ฒฐ์ ์ ํ ๋?
5. ์ด์ฌํ ์ผํ ๋๋ฅผ ์ํ ์ ๋ฌผ์ ์ฃผ๊ณ ์ถ๋ค. ์ด๋ค๊ฒ ์ข์๊น?
6. ์ํ์์ ํฌ์์ํ์ ์ถ์ฒ๋ฐ์๋ค. ์ด๋ค๊ฑธ ๊ฐ์ ํ์ง?
7. ํ์ฌ์์์ ๋๋?
8. ๊ฟ์์ ๊นจ์ด๋๋ 20๋ ์ ์ผ๋ก ๋์๊ฐ๋ค. ๋น์ ์ด ์ ์ผ ๋จผ์ ํ๋์ผ์?
9. ๋ด๊ฐ ์ธ์ฌ ๋ด๋น์๋ผ๋ฉด ์ ๊ท ์ ์ฌ์ ์ฑ์ฉ ์ ์ ์ผ ์ค์ํ๊ฒ ๋ณด๋๊ฒ์?
10. ํ์ฌ์ ์ ๋ง ์ซ์ดํ๋ ๋๋ฃ๊ฐ ์๋ค๋ฉด?
11. ๊ฐ๋ํ ์ง์ ๊ฐ์ฅ์ด ๋์๋ค.. ์๋ ์ ์์ผ ๋ ์ ๋ฌผ์?
12. ํ์ ํ์ฌ ์ถ๊ทผ ์คํ์ผ์?
13.ํ์ฌ ์ฒด์ก๋ํ ํ๋ ๋ ์ด๋ค. ์ค๋ ๋ญํ์ง?
14. ๋์ ์ ๋ฌด ์คํ์ผ์?
์ฝํ๋ฆฐ let, run, apply, also, with์ ์ฐจ์ด์ ์ ์ ํ ์ฌ์ฉ ์ํฉ ๋ถ์
์ฝํ๋ฆฐ์ ๋ฒ์ ์ง์ ํจ์(Scope Functions)๋ ๊ฐ์ฒด ์ปจํ ์คํธ ๋ด์์ ์ฝ๋ ๋ธ๋ก์ ์คํํ๋ ๋ฐ ํนํ๋ ๋๊ตฌ๋ก, ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ๊ฐ๊ฒฐ์ฑ์ ํฅ์์ํค๋ ํต์ฌ ์์์ ๋๋ค. let, run, apply, also, with์ ๋ค์ฏ ๊ฐ์ง ํจ์๋ ๊ฐ๊ฐ ๊ณ ์ ํ ํน์ฑ์ ๊ฐ์ง๋ฉฐ, ์ด๋ค์ ์ฐจ์ด์ ์ ์ ํํ ์ดํดํ๋ ๊ฒ์ด ํจ์จ์ ์ธ ์ฝ๋ฉ์ ์ํ ์ฒซ๊ฑธ์์ ๋๋ค.
๋ฒ์ ์ง์ ํจ์์ ํต์ฌ ์ฐจ์ด์
์ปจํ ์คํธ ๊ฐ์ฒด ์ฐธ์กฐ ๋ฐฉ์
- it ์ฌ์ฉ:
let
,also
→ ๋ช ์์ ์ฐธ์กฐ๋ก ์ธ๋ถ ๋ณ์์์ ์ถฉ๋ ๋ฐฉ์ง - this ์ฌ์ฉ:
run
,apply
,with
→ ์์์ ์ฐธ์กฐ๋ก ์ฝ๋ ๊ฐ์ํ
๋ฐํ ๊ฐ ํน์ฑ
- ์ปจํ
์คํธ ๊ฐ์ฒด ๋ฐํ:
apply
,also
→ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํ์ฌ ๋ฉ์๋ ์ฒด์ด๋ ์ง์ - ๋๋ค ๊ฒฐ๊ณผ ๋ฐํ:
let
,run
,with
→ ์ต์ข ๊ณ์ฐ๊ฐ ๋ฐํ
ํ์ฅ ํจ์ ์ฌ๋ถ
- ํ์ฅ ํจ์ ํํ:
let
,run
,apply
,also
- ์ผ๋ฐ ํจ์ ํํ:
with
→ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ฒด ์ ๋ฌ
๊ฐ๋ณ ํจ์์ ํน์ฑ๊ณผ ์ฌ์ฉ ์ฌ๋ก
1. let: ์์ ํ ๋ณํ๊ณผ ๋ฒ์ ์ ํ
val processed = user?.let {
require(it.age >= 18) // ๋ ๊ฒ์ฌ์ ์ ํจ์ฑ ๊ฒ์ฆ[6][8]
"${it.name.toUpperCase()} (${it.age + 5})" // ๋ฐ์ดํฐ ๋ณํ[1][10]
}
- ํต์ฌ ํน์ง:
it
์ผ๋ก ๊ฐ์ฒด ์ ๊ทผ, ๋ ๊ฐ๋ฅ์ฑ ์ฒ๋ฆฌ์ ์ต์ ํ - ์ ํฉํ ์ํฉ:
- ๋ ์ฒดํฌ ํ ํน์ ์ฐ์ฐ ์ํ
- ์ง์ญ ๋ณ์ ๋ฒ์ ์ ํ
- ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์์์ ์ค๊ฐ ์ฒ๋ฆฌ
2. run: ์ ์ฐํ ์ปจํ ์คํธ ์ค์์นญ
val configuration = ServerConfig().run {
port = 8080 // this ์๋ต ๊ฐ๋ฅ[4][9]
timeout = 60_000
calculateMaxConnections() // ๊ฐ์ฒด ์ด๊ธฐํ์ ๊ณ์ฐ ๊ฒฐํฉ[5][7]
}
- ํต์ฌ ํน์ง:
this
์ปจํ ์คํธ, ํ์ฅ/๋นํ์ฅ ํจ์ ์ด์ค์ฑ - ์ ํฉํ ์ํฉ:
- ๊ฐ์ฒด ์์ฑ๊ณผ ๋์์ ์ด๊ธฐํ
- ๋ณต์กํ ๊ณ์ฐ์ ํํ
- ์์ ์ค์ฝํ ์์ฑ
3. apply: ๊ฐ์ฒด ๊ตฌ์ฑ ์ ๋ฌธ๊ฐ
val dialog = AlertDialog.Builder(context).apply {
setTitle("๊ฒฝ๊ณ ") // this ์๋ต[2][4]
setMessage("์ ์ฅํ์๊ฒ ์ต๋๊น?")
setPositiveButton("์") { _, _ -> save() }
}.create()
- ํต์ฌ ํน์ง: ๊ฐ์ฒด ์์ฒด ๋ฐํ, ๋น๋ ํจํด๊ณผ ๊ถํฉ
- ์ ํฉํ ์ํฉ:
- ๊ฐ์ฒด ํ๋กํผํฐ ์ผ๊ด ์ค์
- ๋น๋ ํจํด ๊ตฌํ
- ๋ถ๋ณ ๊ฐ์ฒด ์์ฑ ์ ์ด๊ธฐํ
4. also: ๋ถ์ ํจ๊ณผ ๊ด๋ฆฌ์
File("data.txt").also {
println("ํ์ผ ์์ฑ ๊ฒฝ๋ก: ${it.absolutePath}") // ๋ก๊น
[3][8]
}.writeText("๋ด์ฉ")
- ํต์ฌ ํน์ง: ๊ฐ์ฒด ์ ๋ฌ ํ ์ถ๊ฐ ์์
- ์ ํฉํ ์ํฉ:
- ๋๋ฒ๊น ๋ก๊ทธ ์ถ๋ ฅ
- ๊ฐ์ฒด ์ํ ๊ฒ์ฆ
- ์ธ๋ถ ์์คํ ๊ณผ์ ์ฐ๋ ์ ์ฒ๋ฆฌ
5. with: ๊ทธ๋ฃนํ ์ฐ์ฐ์
with(recyclerView) {
adapter = CustomAdapter() // this ์๋ต[2][4]
layoutManager = LinearLayoutManager(context)
addItemDecoration(DividerItemDecoration(context, VERTICAL))
}
- ํต์ฌ ํน์ง: ๋นํ์ฅ ํจ์, ๋ ์์ ์ฑ ์์
- ์ ํฉํ ์ํฉ:
- ๋์ด ์๋ ๊ฐ์ฒด์ ๋ํ ๋ค์ค ํธ์ถ
- ๊ด๋ จ ํจ์ ํธ์ถ ๊ทธ๋ฃนํ
- Java ์คํ์ผ ์ ํธ๋ฆฌํฐ ํจ์ ๋์ฒด
ํจ์ ์ ํ ๊ฐ์ด๋๋ผ์ธ
1. ๋ฐํ ๊ฐ ์๊ตฌ์ฌํญ ํ์ธ
- ๊ฐ์ฒด ์์ฒด๊ฐ ํ์ํ๋ฉด → apply, also
- ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ ํ์ํ๋ฉด → let, run, with
2. ์ปจํ ์คํธ ์ฌ์ฉ ํจํด ๋ถ์
- ๋ฉ์๋ ์ฒด์ด๋ ์ → apply, also
- ์ค๊ฐ ๋ณํ ์์ ์ → let, run
3. ๋ ์์ ์ฑ ๊ณ ๋ ค
- ๋ ๊ฐ๋ฅ ๊ฐ์ฒด ์ฒ๋ฆฌ → let (?.let)
- ๋์ด ํ์คํ ๊ฐ์ฒด → with
4. ์ฝ๋ ์คํ์ผ ๊ฒฐ์
- ๋ช ์์ ๋ณ์๋ช ์ ํธ → let, also
- ๊ฐ๊ฒฐํ ํํ ์ ํธ → run, apply
์ค์ ์ ์ฉ ์ ์ฃผ์์
์ค์ฒฉ ์ฌ์ฉ ํํผ: ๊ณผ๋ํ ์ค์ฒฉ์ ๊ฐ๋ ์ฑ์ ํด์นจ
// ๋์ ์
user?.let { u ->
u.orders?.let { o ->
o.items?.let {
// ...
}
}
}
// ๊ฐ์ ์
user?.orders?.items?.let {
// ...
}
์ปจํ ์คํธ ํผ๋ ๋ฐฉ์ง: this/it ๋จ์ฉ ์ ๊ฐ์ฒด ์๋ณ ์ด๋ ค์
data class User(val name: String, var age: Int)
fun process(user: User) = user.run {
age = calculateAge(age) // this.age ๋์ age ์ง์ ์ ๊ทผ
this // ๋ช
์์ ๋ฐํ
}
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ: ์ธ๋ผ์ธ ํจ์ ํน์ฑ ์ดํด
// ์ปดํ์ผ ์ ์ธ๋ผ์ธ ์ฒ๋ฆฌ๋จ
inline fun <T> T.customApply(block: T.() -> Unit): T {
block()
return this
}
ํ ์ปจ๋ฒค์ ์ค์: ์ผ๊ด๋ ์คํ์ผ ์ ์ง
// ํ ๊ท์น ์์
// apply: ๊ฐ์ฒด ๊ตฌ์ฑ ์ ์ฉ
// also: ๋ก๊น
๋ฐ ๊ฒ์ฆ
// let: ๋ ์ฒ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ๋ณํ
๊ณ ๊ธ ํ์ฉ ์๋๋ฆฌ์ค
1. DSL(Domain Specific Language) ๊ตฌ์ฑ
fun createMenu() = menu {
item("Home") { icon = R.drawable.home }
item("Search") {
visible = hasSearchPermission
onClick { showSearch() }
}
}.apply {
setTheme(DarkTheme)
}
private fun menu(block: MenuBuilder.() -> Unit) = MenuBuilder().apply(block)
2. ์์ ํ ๋ฆฌ์์ค ๊ด๋ฆฌ
FileInputStream("data.txt").use { fis ->
fis.bufferedReader().use { reader ->
reader.lineSequence()
.filter { it.isNotBlank() }
.map { it.split(",") }
.forEach { println("Processed: $it") }
}
}.also {
println("ํ์ผ ์ฒ๋ฆฌ ์๋ฃ")
}
3. ๋ณตํฉ ๋ณํ ํ์ดํ๋ผ์ธ
val report = dataSource.getRawData()
?.let(::parseToIntermediateFormat)
?.run {
validate(this)
transformForReporting(this)
}
?.also { logGeneration(it) }
?.apply { exportToFile(this) }
๊ฒฐ๋ก : ์ํฉ์ ๋ง๋ ์ต์ ์ ์ ํ
๊ฐ ๋ฒ์ ์ง์ ํจ์๋ ํน์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ์ต์ ํ๋์ด ์์ต๋๋ค. let์ ๋ ์์ ์ฑ๊ณผ ๋ฐ์ดํฐ ๋ณํ์, run์ ๋ณต์กํ ์ด๊ธฐํ์ ๊ณ์ฐ์, apply๋ ๊ฐ์ฒด ๊ตฌ์ฑ์, also๋ ๋ถ์ ํจ๊ณผ ๊ด๋ฆฌ์, with๋ ๋์ด ์๋ ๊ฐ์ฒด ์กฐ์์ ๊ฐ๊ฐ ๊ฐ์ ์ ๊ฐ์ง๋๋ค. ์ค๋ฌด์์๋ ํ์ ์ฝ๋ฉ ์ปจ๋ฒค์ ๊ณผ ์ฝ๋์ ์๋๋ฅผ ๋ช ํํ ์ ๋ฌํ๋ ๋ฐฉํฅ์ผ๋ก ํจ์๋ฅผ ์ ํํด์ผ ํ๋ฉฐ, ํจ์์ ํน์ฑ์ ์ ํํ ์ดํดํ๋ ๊ฒ์ด ํจ์จ์ ์ธ ์ฝํ๋ฆฐ ์ฝ๋ ์์ฑ์ ํต์ฌ์ ๋๋ค.