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