์ฝํ๋ฆฐ์ scope ํจ์๋ ๊ฐ์ฒด ์กฐ์์ ํจ์ฌ ๋ ์ฝ๊ฒ ํ๊ธฐ ์ํด์ Kotlin์์ ์ง์ํ๋ ํจ์์ ์ผ์ข ์
๋ํ์ ์ผ๋ก
let
, run
, with
, apply
, also
์ด๋ ๊ฒ 5๊ฐ์ Scope ํจ์๊ฐ ์์
let
null์ด ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๊ณ ๊ทธ์ ๋ฐ๋ฅธ ์๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํจ. ๋ํ lambdaํจ์์ฒ๋ผ ๋ง์ง๋ง์ค์ ๊ฐ์ด return๋จ. let์ ์ค์ฒฉํด์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ์ด ๋ณ๋ก ์ข์ง ์์์ ์ค์ฒฉํ ์ผ์ด ์์ผ๋ฉด, if else๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. it์ผ๋ก ๊ฐ์ฒด์ ์ ๊ทผํ๊ฒ ๋จ.
val str: String? = "null"
val result: Int? = str?.let {
println(it)
val abc: String? = "abc"
val def: String? = "def"
if (!abc.isNullOrEmpty() && !def.isNullOrEmpty()) {
println("abcdef๊ฐ null์ด ์๋")
}
1234
}
println(result) // 1234
val str: String? = "null"
val abc: String? = "abc"
val def: String? = "def"
val result2: Int? = str?.let {
println(it)
abc?.let {
println(it)
def?.let {
println(it)
}
}
1234
}
println(result2) // 1234
run
์ผ๋ฐ์ ์ผ๋ก class๋ฅผ ์ฌ์ฉํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ง๊ฒ ๋จ.
fun main() {
val config = DatabaseClient()
config.url = "localhost:3306"
config.username = "mysql"
config.password = "1234"
val contected = config.connect()
println(contected)
// DB ์ ์ ์ค...
// DB ์ ์ ์๋ฃ
}
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
}
}
์ ์ฝ๋๋ฅผ run์ ํ์ฉํ์ฌ ๋ฐ๊พธ๋ฉด ์๋์ ๊ฐ์. ์ค๋ณต๋๋ ์ฝ๋ ์์ด ๋ฐ๋ก๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์. ์๋ ์ฝ๋ ์ญ์ let์ ํตํด์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ it์ด ์ค๋ณต๋๋ฏ๋ก, let๋ณด๋ค๋ run์ ์ด์ฉํ์ฌ ๋ง๋๋ ๊ฒ์ด ํจ์ฌ ์ข๋ค. this๋ฅผ ํตํด ๊ฐ์ฒด property์ ์ ๊ทผํ๊ฒ ๋จ.
fun main() {
val connected: Boolean = DatabaseClient().run {
url = "localhost:3306"
username = "mysql"
password = "1234"
connect()
}
println(connected)
// DB ์ ์ ์ค...
// DB ์ ์ ์๋ฃ
}
with
with๋ ๊ฒฐ๊ณผ ๋ฐํ์์ด ๋ด๋ถ์์ ์์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ๋ ์ฌ์ฉํจ. ์ด ์ญ์ lambdaํจ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง ์ค์ด return๊ฐ.
fun main() {
val withEx = "์๋
ํ์ธ์"
val length = with(withEx) {
length
}
println(length) // 5
val connectedUsingWith = with(DatabaseClient()) {
url = "localhost:3306"
username = "mysql"
password = "1234"
connect()
}
println(connectedUsingWith) // DatabaseClient@372f7a8d
}
apply
apply๋ ์์ ๊ฐ์ฒด์ property๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ทธ ์์ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. this๋ก ์ฌ์ฉ
val connectedUsingApply: DatabaseClient = DatabaseClient().apply {
url = "localhost:3306"
username = "mysql"
password = "1234"
connect()
}
println(connectedUsingApply)
also
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() {
val user: User = User(name = "tony", password = "1234")
user.validate()
User(name = "tony", password = "1234").also {
it.validate() // "๊ฒ์ฆ์ฑ๊ณต"
it.printName() // "๊ฒ์ฆ์คํจ"
}
}