tonykang22 / study

0 stars 0 forks source link

[Kotlin & Spring] 09. 스코프 함수 #118

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

스코프 함수

스코프 함수란


스코프 함수 선택 방법

함수명 수신자 객체 참조 방법 반환 값 확장 함수 여부
let it 함수의 결과 O
run this 함수의 결과 O
with this 함수의 결과 X
apply this 컨텍스트 객체 O
also it 컨텍스트 객체 O



let

fun main() {

        val str: String? = null

        str?.let {
                println(it)
        }
        // 아무것도 출력되지 않음
}



fun main() {

        val str: String? = "안녕"

        str?.let {
                println(it)
        }
        // 안녕
}



fun main() {

        val str: String? = "안녕"

        val result = str?.let {
                println(it)

                1234 // let 함수 마지막 코드가 결과로 반환
        }
        println(result)
        // 안녕
        // 1234
}



val str: String? = "안녕"
val result = str?.let {
    println(it)

    val abc : String? = "abc"

    abc?.let {

        val def : String? = "def"
        def?.let {
                println("abcdef null ") 
                }
        }
        1234 
}
println(result)



val str: String? = "안녕"
val result = str?.let {
    println(it)

    val abc : String? = "abc"
    val def : String? = "def"
    if (!abc.isNullOrEmpty() && !def.isNullOrEmpty()) {
            println("abcdef null ") 
    }

    1234 
}
println(result)




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 config = DatabaseClient()
        config.url = "localhost:3306"
        config.username = "mysql"
        config.password = "1234"
        val connected = config.connect()

        println(connected)
}
// DB 접속 중 ...
// DB 접속 완료
// true



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 {
                url = "localhost:3306"
                username = "mysql"
                password = "1234"
                connect()
        }
        println(connected)
}



val connected = DatabaseClient().let {
        it.url = "localhost:3306"
        it.username = "mysql"
        it.password = "1234"
        it.connect()
}
println(connected)



with

val str = "안녕하세요"
with (str) {
        println("length = $length")
}



val str = "안녕하세요"
val length = with(str) {
        length
}
println(length)
// 5



val connected = with(DatabaseClient()) {
        url = "localhost:3306"
        username = "mysql"
        password = "1234"
        connect()
}
println(connected)



apply

val client: DatabaseClient = DatabaseClient().apply {
        url = "localhost:3306"
        username = "mysql"
        password = "1234"
        connect()
}




also

class User(val name: String, val password: String) {

        fun validate() {
                if (name.isNotEmpty() && password.isNotEmpty()) {
                        println("검증 성공!")
                } else {
                        println("검증 실패!")
                }
        }
}

fun main() {
        val user: User = User(name = "tony", password = "1234")
        user.validate()
}



fun main() {
        User(name = "tony", password = "1234").also {
                it.validate()
        }
}



스코프 함수 사용 시 유의할 점

val this: String? = null // 컴파일 오류
val it: String? = null // 작동



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)
        }
}