λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Kotlin

Kotlin - 읡λͺ…ν•¨μˆ˜μ™€ ν•¨μˆ˜ νƒ€μž…

by λ„μΊλ¦¬πŸ± 2021. 6. 30.
λ°˜μ‘ν˜•

β˜… 읡λͺ… ν•¨μˆ˜ β˜… == λžŒλ‹€(Lambda)

읡λͺ… ν•¨μˆ˜ μ •μ˜ == λžŒλ‹€ ν‘œν˜„μ‹ == λžŒλ‹€μ‹

읡λͺ… ν•¨μˆ˜ λ°˜ν™˜ κ²°κ³Ό -- λžŒλ‹€ κ²°κ³Ό

 

 μ΅λͺ… ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 μ‰½κ²Œ 전달될 수 μžˆλ‹€. 

// 메인 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 읡λͺ… ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  ν˜ΈμΆœν•œλ‹€.
// 읡λͺ… ν•¨μˆ˜λŠ” { 와 } 사이에 ν‘œν˜„μ‹μ΄λ‚˜ λͺ…령문을 λ„£μ–΄ μž‘μ„±ν•œλ‹€.
// 읡λͺ… ν•¨μˆ˜ } λ‹€μŒμ— ()λ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜ΈμΆœν•œλ‹€. - () λΉΌλ©΄ λ¬Έμžμ—΄ 좜λ ₯ μ•ˆλ¨
// - 이름이 μžˆλŠ” ν•¨μˆ˜μ²˜λŸΌ 읡λͺ… ν•¨μˆ˜λ„ 인자λ₯Ό μ§€μ •ν•˜λŠ” κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•΄μ„œ 호좜될 λ•Œλ§Œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 
// (μ•„λž˜ μ˜ˆμ œμ—μ„  μΈμžκ°€ μ—†μœΌλ‹ˆκΉŒ 빈 κ΄„ν˜Έ)

fun main() {
    println(
        {
            val currentYear = 2021
            "SimVillage 방문을 ν™˜μ˜ν•©λ‹ˆλ‹€. (copyright $currentYear)"
        }())
}

 

 

읡λͺ… ν•¨μˆ˜λ„ Int, String κ³Ό 같은 νƒ€μž…μ„ 가진닀. == ν•¨μˆ˜ νƒ€μž…

ν•¨μˆ˜ νƒ€μž…μ˜ λ³€μˆ˜λ“€μ€ κ°’μœΌλ‘œ 읡λͺ… ν•¨μˆ˜λ₯Ό μ €μž₯ν•΄μ„œ, λ‹€λ₯Έ λ³€μˆ˜μ²˜λŸΌ 읡λͺ… ν•¨μˆ˜κ°€ μ½”λ“œ μ–΄λ””λ“  전달 κ°€λŠ₯ν•˜λ‹€.

 

μ•”μ‹œμ  λ°˜ν™˜

: return ν‚€μ›Œλ“œκ°€ μ—†λ‹€λŠ” 것을 톡해 μ•Œ 수 μžˆλ‹€.  이름이 μžˆλŠ” ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ 읡λͺ… ν•¨μˆ˜λŠ” 데이터λ₯Ό λ°˜ν™˜ν•˜κΈ° μœ„ν•œ return ν‚€μ›Œλ“œκ°€ ν•„μš” μ—†λ‹€. 읡λͺ… ν•¨μˆ˜λŠ” μ•”μ‹œμ μœΌλ‘œ λ˜λŠ” μžλ™μœΌλ‘œ ν•¨μˆ˜ μ •μ˜μ˜ λ§ˆμ§€λ§‰ μ½”λ“œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

: return ν‚€μ›Œλ“œ μ‚¬μš©μ€ κΈˆμ§€λ˜μ–΄μžˆμœΌλ©΄μ„œ, 읡λͺ… ν•¨μˆ˜μ˜ μ •μ˜λ₯Ό κ°„νŽΈν•˜κ²Œ ν•΄μ£Όκ³  ν•„μˆ˜μ μ΄λ‹€. WHy ? 읡λͺ… ν•¨μˆ˜μ— 리턴 ν‚€μ›Œλ“œκ°€ μžˆμ„ λ•ŒλŠ” μ–΄λ–€ 곳으둜 μ œμ–΄κ°€ λ³΅κ·€λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ μ»΄νŒŒμΌλŸ¬κ°€ μ•Œ 수 μ—†κΈ° λ•Œλ¬Έ. (읡λͺ… ν•¨μˆ˜λŠ” 읡λͺ… 클래슀 μΈμŠ€ν„΄μŠ€λ‘œ 생성됨)

// 읡λͺ… ν•¨μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜λ₯Ό μ •μ˜ν•˜κ³  println μ—μ„œ ν˜ΈμΆœν•΄λ³΄μž
// 읡λͺ… ν•¨μˆ˜ μ €μž₯ν•˜λŠ” λ³€μˆ˜λŠ” λ³€μˆ˜μ΄λ¦„ λ‹€μŒμ— : κ³Ό ν•¨μˆ˜ νƒ€μž…μ„ μ§€μ •ν•˜μ—¬ μ„ μ–Έν•  수 μžˆλ‹€.
// greetingFunction: () -> String

fun main() {

    val greetingFunction: () -> String =
        {
            val currentYear = 2019
            "SimVillage λ°©λ¬Έ ν™˜μ˜! (copyright $currentYear)"
        }

    println(greetingFunction())
}

 

ν•¨μˆ˜μΈμž - 읡λͺ… ν•¨μˆ˜λŠ” μ–΄λ–€ νƒ€μž…μ˜ μΈμžλ„ 받을 수 μžˆλ‹€. / 읡λͺ… ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ€ ν•¨μˆ˜ νƒ€μž… μ •μ˜μ— μ§€μ •ν•˜λ©° λ§€κ°œλ³€μˆ˜ 이름은 ν•¨μˆ˜ 내뢀에 μ§€μ •ν•œλ‹€.

// κ²Œμž„ ν”Œλ ˆμ΄μ–΄μ˜ 이름을 인자둜 받도둝 greetingFunction λ³€μˆ˜ 선언을 λ³€κ²½ν•΄ 보자


fun main() {

    val greetingFunction: (String) -> String =
        {
            playerName ->
            // μœ„ ( ) μ•ˆμ— String 이 μžˆμ–΄μ„œ 이 읡λͺ… ν•¨μˆ˜κ°€ String 인자λ₯Ό λ°›λŠ”λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
            // 인자 맀개 λ³€μˆ˜ "playerName"은 { λ°”λ‘œ λ‹€μŒμ—  이름과 ν™”μ‚΄ν‘œλ₯Ό μ§€μ •ν•˜μ—¬ μ‚¬μš©ν•œλ‹€.
            val currentYear = 2019
            "SimVillage λ°©λ¬Έ ν™˜μ˜! $playerName λ‹˜! (copyright $currentYear)"
        }

    println(greetingFunction("쑍"))
}

 

* count ν•¨μˆ˜λŠ” (Char) -> Boolean  / Char νƒ€μž…μ˜ 인자λ₯Ό λ°›μ•„μ„œ Boolean νƒ€μž…μ˜ 값을 λ°˜ν™˜ν•œλ‹€. 읡λͺ… ν•¨μˆ˜λŠ” μ½”ν‹€λ¦° ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ— μžˆλŠ” λŒ€λΆ€λΆ„ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° μ‚¬μš©λ˜λ―€λ‘œ μ΅μˆ™ν•΄μ Έμ•Ό ν•œλ‹€.

 

It ν‚€μ›Œλ“œ : ν•˜λ‚˜μ˜ 인자만 받을 λ–Ό, λ§€κ°œλ³€μˆ˜ 이름 지정 λŒ€μ‹  it ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.(두 개 이상일 λ•ŒλŠ” it ν‚€μ›Œλ“œ μ‚¬μš© λΆˆκ°€)

⚠ λ³΅μž‘ν•œ 읡λͺ… ν•¨μˆ˜ μ΄κ±°λ‚˜, μ€‘μ²©λœ 읡λͺ…ν•¨μˆ˜ μΌλ•ŒλŠ” 맀개 λ³€μˆ˜λ₯Ό μ§€μ •ν•˜λŠ”λ° μ½”λ“œ νŒŒμ•…μ— 용이 ν•˜λ‹€.

// it 을 μ‚¬μš©ν•΄λ³΄μž.

fun main() {

    val greetingFunction: (String) -> String =
        {
            val currentYear = 2019
            "SimVillage λ°©λ¬Έ ν™˜μ˜! ${it}λ‹˜! (copyright ${currentYear})"
        }
    println(greetingFunction("쑍"))
}

 

 

λ‹€μˆ˜μ˜ 인자 λ°›κΈ°

// λ‹€μˆ˜μ˜ 인자λ₯Ό λ°›μ•„ 보자.

fun main() {

    val greetingFunction: (String,Int) -> String =
        {
            PlayerName, numBuildings ->
            val currentYear = 2019
            println("${numBuildings}개의 건물이 μΆ”κ°€ λ˜μ—ˆμ–΄μš”~!")
            "SimVillage λ°©λ¬Έ ν™˜μ˜! ${PlayerName}λ‹˜! (copyright ${currentYear})"
        }
    println(greetingFunction("쑍",15))
}

 

읡λͺ… ν•¨μˆ˜λ„ νƒ€μž… 좔둠을 μ§€μ›ν•œλ‹€.

// 각 맀개 λ³€μˆ˜ νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆλ„λ‘ λ³€κ²½ν•΄λ³΄μž
// (String,Int) -> String μƒλž΅
//  PlayerName : String,numBuildings : Int -> 
// μœ„μ™€ 같이 μ§€μ •ν•˜μ—¬μ„œ νƒ€μž… 좔둠이 κ°€λŠ₯ν•˜κ²Œ 함.
fun main() {

    val greetingFunction = {
            PlayerName : String,numBuildings : Int ->
            val currentYear = 2019
            println("${numBuildings}개의 건물이 μΆ”κ°€ λ˜μ—ˆμ–΄μš”~!")
            "SimVillage λ°©λ¬Έ ν™˜μ˜! ${PlayerName}λ‹˜! (copyright ${currentYear})"
        }
    println(greetingFunction("쑍",15))
}

 

ν•¨μˆ˜λ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜

// ν•¨μˆ˜λ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜

fun main() {

    val greetingFunction = {
            PlayerName : String,numBuildings : Int ->
            val currentYear = 2019
            println("${numBuildings}개의 건물이 μΆ”κ°€ λ˜μ—ˆμ–΄μš”~!")
            "SimVillage λ°©λ¬Έ ν™˜μ˜! ${PlayerName}λ‹˜! (copyright ${currentYear})"
        }
    runSimulation("쑍",greetingFunction)
}

fun runSimulation(playerName: String , greetingFuction: (String, Int) -> String)
{
    val numBuildings = (1..10).shuffled().last() // 1 ~ 10 쀑 λ¬΄μž‘μœ„ 선택
    println(greetingFuction(playerName,numBuildings))
}

 

 

단좕 문법

// runSimulation 에 단좕 문법 μ‚¬μš©ν•˜κΈ°
// λžŒλ‹€λ₯Ό λ³€μˆ˜μ— μ§€μ •ν•˜μ§€ μ•Šκ³  runSimulation ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ 직접 전달 ν•˜λ―€λ‘œ λžŒλ‹€ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ 지정할 ν•„μš” μ—†λ‹€.
fun main() {

    runSimulation("쑍")
    {
        PlayerName, numBuildings ->
        val currentYear = 2019
        println("${numBuildings}개의 건물이 μΆ”κ°€ λ˜μ—ˆμ–΄μš”~!")
        "SimVillage λ°©λ¬Έ ν™˜μ˜! ${PlayerName}λ‹˜! (copyright ${currentYear})"
    }
}

fun runSimulation(playerName: String , greetingFuction: (String, Int) -> String)
{
    val numBuildings = (1..10).shuffled().last() // 1 ~ 10 쀑 λ¬΄μž‘μœ„ 선택
    println(greetingFuction(playerName,numBuildings))
}

 

λžŒλ‹€λ₯Ό μ •μ˜μ‹œ JVMμ—μ„œ 객체둜 생성. JVM λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ“  λ³€μˆ˜μ˜ λ©”λͺ¨λ¦¬ ν• λ‹Ή μˆ˜ν–‰λ˜λ―€λ‘œ λ©”λͺ¨λ¦¬ 많이 μ‚¬μš©

→ λžŒλ‹€λŠ” μ„±λŠ₯에 영ν–₯을 쀄 수 μžˆλŠ” λ©”λͺ¨λ¦¬ 뢀담을 μ΄ˆλž˜ν•  수 있음

→ μ½”ν‹€λ¦°μ—μ„œλŠ” λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 λžŒλ‹€λ₯Ό μ‚¬μš©ν•  λ•Œ 뢀담을 없앨 수 μžˆλŠ” 인라인 μ΄λΌλŠ” μ΅œμ ν™” 방법을 μ œκ³΅ν•¨.

 

ν•¨μˆ˜ μ•žμ— inline을 뢙인닀. 

→  호좜될 λ•Œ λžŒλ‹€κ°€ 객체둜 전달 μ•ˆλ¨. 

inline fun runSimulation(playerName: String , greetingFuction: (String, Int) -> String)
{
    val numBuildings = (1..10).shuffled().last() // 1 ~ 10 쀑 λ¬΄μž‘μœ„ 선택
    println(greetingFuction(playerName,numBuildings))
}

 

 

ν•¨μˆ˜ μ°Έμ‘° - λžŒλ‹€ 외에 ν•¨μˆ˜ 인자 전달 : 이름이 μžˆλŠ” ν•¨μˆ˜κ°€ 인자둜 전달될 수 있게 ν•΄μ€Œ.

:: μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œλ‹€. 

// runSimulation 에 단좕 문법 μ‚¬μš©ν•˜κΈ°
// λžŒλ‹€λ₯Ό λ³€μˆ˜μ— μ§€μ •ν•˜μ§€ μ•Šκ³  runSimulation ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ 직접 전달 ν•˜λ―€λ‘œ λžŒλ‹€ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ 지정할 ν•„μš” μ—†λ‹€.
fun main() {

    runSimulation("쑍", ::printConstructionCost)
    {
        PlayerName, numBuildings ->
        val currentYear = 2019
        println("${numBuildings}개의 건물이 μΆ”κ°€ λ˜μ—ˆμ–΄μš”~!")
        "SimVillage λ°©λ¬Έ ν™˜μ˜! ${PlayerName}λ‹˜! (copyright ${currentYear})"
    }
}

// constPrinter λΌλŠ” ν•¨μˆ˜ μ°Έμ‘° λ§€κ°œλ³€μˆ˜λ₯Ό μΆ”κ°€ν•˜κ³ , runSimulation λ‚΄λΆ€μ—μ„œ 이 맀개 λ³€μˆ«κ°’ μ‚¬μš©ν•΄μ„œ 건물 건좕비 좜λ ₯ν•˜λ„λ‘
inline fun runSimulation(playerName: String ,
                         costPrinter:(Int) -> Unit,
                         greetingFuction: (String, Int) -> String) {
    val numBuildings = (1..10).shuffled().last() // 1 ~ 10 쀑 λ¬΄μž‘μœ„ 선택
    println(greetingFuction(playerName,numBuildings))
}

// ν•¨μˆ˜ μ°Έμ‘°λ₯Ό μœ„ν•΄
fun printConstructionCost(numBuildings : Int)
{
    val cost = 500
    println("건좕 λΉ„μš© : ${cost*numBuildings}")
}

 

λ°˜ν™˜νƒ€μž…μœΌλ‘œ ν•¨μˆ˜ νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆλ‹€. 


fun main() {
    runSimulation()
}


fun runSimulation()
{
    val greetingFunction = configureGreetingFunction()
    println(greetingFunction("쑍"))

}



fun configureGreetingFunction(): (String) -> String
{
    val structureType = "병원"
    var numBuildings = 5

    // λžŒλ‹€λ₯Ό λ°˜ν™˜ν•˜κ³  있음
    return {
        playerName: String ->
        val currentYear = 2019
        numBuildings +=1
        println("$numBuildings μ±„μ˜ $structureType 이 좔가됨")
        "SimVillage λ°©λ¬Έ ν™˜μ˜, $playerName! (copyright $currentYear)"
    }
}

 

ν΄λ‘œμ €

λ°˜μ‘ν˜•

λŒ“κΈ€