Present Time: 2018-8-24 FRI
Present Time: 2018-8-24 FRI
DSL์ด๋ ํน์ ๋๋ฉ์ธ(์๋น์ค)์ ํนํ๋์ด์๋ ์ธ์ด๋ฅผ ๋งํ๋ค.
์์ฐ์ด์ฒ๋ผ ๋ง๋ค์ด ๊ธฐ์กด ์ฝ๋๋ณด๋ค ๋ ํํ์ ์ด๊ณ ๊ฐ๋
์ฑ์ด ์ข๊ฒ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.
SQL๋ DSL ์ธ์ด์ค ํ๋๋ค.
DSL์ ๋ด๋ถ DSL๊ณผ, ์ธ๋ถ DSL๋ก ๋๋์ด์ง๋ค.
๊ทธ์ค, ์ด๋ฒ์ ์์๋ณผ DSL์ ๋ด๋ถ DSL์ด๋ค.
- ํธ์คํธ ์ธ์ด(๊ธฐ์กด ์ธ์ด)์ ํ์ ๋ฒ์ด๋์ง ์์ผ๋ฉฐ ๊ตฌ์ฑํ๋๊ฒ์ ์๋ฏธํ๋ค.
- ๊ธฐ์กด ์ธ์ด์ ์๋ก์ด ๊ตฌ๋ฌธ์ผ๋ก ๋์ ๋์ด ์ธ์ด ํ์ฅ์ ํ ์ ์๋ค.
- ์ธ๋ผ์ธ ์ฝ๋ ํํ๋ก ํํ์ด ๊ฐ๋ฅํ๋ค.
- ๊ธฐ์กด ์ธ์ด์ ๋ค๋ฅธ ์ธ์ด๋ฅผ ํตํด ์์ฑ๋ DSL์ ์๋ฏธํ๋ค.
- XML, CSS ๋ฑ
- ์ฝํ๋ฆฐ์์
Koin
,Anko
๋ฑ ์ฝํ๋ฆฐ ์ ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ DSL์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
val values = ContentValues()
values.put("id", 5)
values.put("name", "John Smith")
values.put("email", "[email protected]")
db.insert("User", null, values)
db.insert("User",
"id" to 42,
"name" to "John",
"email" to "[email protected]"
)
DSL์ ์ ์ฉํ์ ๊ฒฝ์ฐ, ๊ฐ๋ ์ฑ์ด ๋ ๋ฐ์ด๋๋ค.
inline fun Activity.verticalLayout(theme: Int = 0, init: (@AnkoViewDslMarker _LinearLayout).() -> Unit)
์ ํจ์๋ Anko Layout
์ DSL์ธ๋ฐ, ๋ณด๋ค์ํผ ํ์ฅํจ์์ ๊ณ ์ฐจ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
๋ฌผ๋ก , ์ด ์์ ์ด์ธ์๋ DSL์ ๊ณ ์ฐจ ํจ์๋ ํ์ฅ ํจ์๋ก ๊ตฌํ๋์ด์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ทธ๋ฐ ์๋ฏธ์์ ์ค์ ๋ก ํ๋ฒ DSL์ ๊ตฌํํด๋ณด๊ธฐ ์ ์, Higher-order function๊ณผ Extension Fucntion์ด ๋ฌด์์ธ์ง ์์๋ณด์.
์ฝํ๋ฆฐ์ ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฐ์ฒด์ ์๋ก์ด ํจ์๋ฅผ ๋ง๋๋ ๊ธฐ๋ฅ์ธ ํ์ฅ ํจ์๋ฅผ ์ง์ํ๋ค.
์๋ฅผ ๋ค์ด, ๋ฌธ์์ด์ ๋ง์ง๋ง ๋ฌธ์๋ง ๋ฝ์๋ด๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
ํธ์ถํ ๋ ๋ง๋ค str[str.lengthโโโ1] ์ฒ๋ผ ๊ธด ์ฝ๋๊ฐ ํ์ํ๋ค.
ํ์ฅ ํจ์๋ฅผ ์ด์ฉํด ์กฐ๊ธ ๋ ํธํ๊ฒ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด๋ณด์.
fun String.lastIndex() = this[this.length - 1]
ํ์ฅ ํจ์ ๊ธฐ๋ฅ์ ์ด์ฉํด์ String ๊ฐ์ฒด์ ํจ์๋ฅผ ๋ง๋ค์๊ณ , ์ด์ ๋ str.lastIndex() ๋ก ๋ง์ง๋ง ๋ฌธ์๋ฅผ ๋ฝ์๋ผ ์ ์๋ค.
- ํ์ฅ ํจ์์์ this๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ๋ง์ฝ ํ์ฅ ํจ์์ ์ด๋ฆ๊ณผ ์๋ ๋ฉค๋ฒ ํจ์์ ์ด๋ฆ์ด ๊ฐ๋ค๋ฉด, ๋ฌด์กฐ๊ฑด ๋ฉค๋ฒ ํจ์๊ฐ ํธ์ถ๋๋ค.
๊ณ ์ฐจ ํจ์๋ฅผ ์ถฉ์กฑํ๋ ค๋ฉด ๋ค์ ์กฐ๊ฑด ์ค ํ๋๋ฅผ ๋ง์กฑํด์ผํ๋ค.
- ํจ์๋ฅผ ํจ์์ ์ธ์๋ก ๋ฐ๋๋ค
- ํจ์์ ๋ฐํ๊ฐ์ด ํจ์๋ค.
์ฝํ๋ฆฐ์์ ์์ฃผ ์ฌ์ฉํ๋ let
, run
, apply
, with
๋ ๋ชจ๋ ๊ณ ์ฐจ ํจ์๋ค.
apply()
๋ฅผ ์์๋ก ๋ค์ด๋ณด๋ฉฐ ๊ณ ์ฐจํจ์๊ฐ ์ด๋ป๊ฒ ์งํ๋๋์ง ์์๋ณด์.
public inline fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
(Kotlin 1.2 ๋ฒ์ ๋ถํฐ๋ apply ์์ contract ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์ด์์ผ๋, ํธํ ์ค๋ช ์ ์ํด ์ ์ธ์์ผฐ์ต๋๋ค.)
val test = Test(3,5).apply {
square()
}
data class Test(var x: Int, var y: Int){
fun square(){
x *= x
y *= y
}
}
T.apply
๋ ํจ์๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๋ธ๋ก์ ๋ฆฌ์๋ฒ(this)์ ์ ๋ฌํ๊ณ , ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์๋ค.
apply()
๋block: T.() -> Unit
๋ผ๋ T์ ํ์ฅ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.- ๊ณ ๋ก
Test(3, 5).apply{}
๋ฅผ ํธ์ถํ๋ฉฐ T์ ํ์ฅ ํจ์์ธ ์ต๋ช ํจ์๋ฅผ ์์ฑํ๋ค. - ์ต๋ช ํจ์ ๋ธ๋ก ์์์ ๋ฆฌ์๋ฒ์ ํจ์๋ ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ๋ค.
apply()
์์ ๋ฐฉ๊ธ ์ ์ธํ ์ต๋ช ํจ์์ธblock()
์ ํธ์ถํ๊ณ , ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๋ค๋ฅธ ๊ณ ์ฐจ ํจ์๋ apply()
์ฒ๋ผ ์ธ์๋ก ๋ฐ์ ํจ์๋ฅผ ๋์๋๊ฒ ํ๋ ๋ฐฉ์์ผ๋ก ์ํ๋๋ค.
ํ์ฅ ํจ์์ ๊ณ ์ฐจ ํจ์๋ฅผ ์์์ผ๋ ์ด์ ์ฐ๋ฆฌ๋ DSL์ ๋ง๋ค ์ ์๋ค.
์ด ๊ธ์ ์ฐธ๊ณ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ DSL์ ๋ง๋ค์ด๋ณด์!
data class Person(var name: String = "", var age: Int = 0)
๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ๋ค.
Person์ ์ธ์๋ก ๋ฐ๋ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์๋ฅผ ๋ง๋ ๋ค.
fun person(block: (Person) -> Unit): Person {
val person = Person()
block(person)
return person
}
- person ๊ฐ์ฒด๋ฅผ ํจ์ ๋ด๋ถ์์ ์์ฑํ๋ค.
block(person)
์ ํธ์ถํดperson
๊ฐ์ฒด๋ฅผ ์์ ํ๋ค- ์์ ๋
person
๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค.
๋ค์๊ณผ ๊ฐ์ ํจ์๋ ์ด๋ ๊ฒ ์ฌ์ฉ ํ ์ ์๋ค.
val person = person {
it.age = 3
it.name = "Person"
}
๊ทธ๋ฌ๋ฉด ๊ฐ์ฒด๋ฅผ ์ด๋ ๊ฒ ์์ฑํ ์ ์๋๋ฐ, ๋ฉค๋ฒ๋ฅผ ํธ์ถํ ๋ ๋ง๋ค it
์ ๋ถ์ฌ์ผํ๋ค๋๊ฒ ๋๋ฌด ๊ท์ฐฎ๋ค. it
์ ์์ ๋ณด์!
it
์ ์์ ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? ์ ๋ง ๊ฐ๋จํ๋ค. block
ํจ์๋ฅผ Person
๊ฐ์ฒด์ ํ์ฅ ํจ์๋ก ๋ง๋ค๋ฉด ๋๋ค!
fun person(block: Person.() -> Unit) = Person().apply(block)
block
์ Person
๊ฐ์ฒด์ ํ์ฅ ํจ์๋ก ๋ง๋ค๊ณ , Person
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค block
ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ํจ์๋ฅผ ๋ฐํํ๊ฒ ๋ง๋ค์๋ค.
val person = person {
age = 3
name = "Person"
}
์ด๋ ๊ฒ ํ๋ฉด it
์ ์์ ์ ๊ฐ๋
์ฑ ์ข๊ณ ํธํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค!
- Extension Function ๊ณต์ ๋ฌธ์ {: target="_blank" }