๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์–ธ์–ด/Kotlin

[Kotlin ๋ฌธ๋ฒ• ์ข…ํ•ฉ] - Single-expression function, ์‹ฑ๊ธ€ํ„ด (@@์งˆ๋ฌธํ•˜๊ธฐ)

by ์ ผ์ ผ39 2024. 3. 6.

 

 

 

1. Single-expression function

    : ๋žŒ๋‹ค์‹์„ ์ด์šฉํ•ด ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌ ๊ฐ€๋Šฅ

    * ๋žŒ๋‹ค์‹ ๊ตฌ์กฐ : ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„˜๊น€ / ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ / ๋ณ€์ˆ˜์— ์ €์žฅ ํ•˜๋Š” ํ•จ์ˆ˜

{๋งค๊ฐœ๋ณ€์ˆ˜1, ๋งค๊ฐœ๋ณ€์ˆ˜2... -> 
    ์ฝ”๋“œ
}

    * ์˜ˆ์‹œ 1 : ์„ธ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ฐ›์•„ ํ‰๊ท ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜(๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ์ •์˜)

fun add(num1:Int, num2:Int, num3:Int) = (num1+num2+num3)/3
fun main(){
    println(lambdaExample({x,y -> x+y}, 20, 30)) 	//๋žŒ๋‹ค์‹ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„˜๊น€
}

fun lambdaExample(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b)

//์œ„์™€ ๋™์ผ
fun lambdaExample(sum: (Int, Int) -> Int, a: Int, b: Int) : Int) : Int {
                   //์ž๋ฃŒํ˜•์ด ๋žŒ๋‹ค์‹์œผ๋กœ ์„ ์–ธ๋จ
    return sum(a,b) 		//sum์€ ๋žŒ๋‹ค์‹์˜ ํ‘œํ˜„๋ฌธ์— ๋”ฐ๋ผ a+b์˜ ์ •์ˆ˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•จ
}

    * ์˜ˆ์‹œ 2 : ๋™์ผํ•œ ๋กœ์ง์„ ๋ฉ”์†Œ๋“œ ์„ ์–ธ ์—†์ด ์ €์žฅํ•˜๊ธฐ

var add = {num1: Int, num2: Int, num3: Int -> (num1+num2+num3) / 3}
						// -> ๋ฅผ ํ†ตํ•ด = ์—†์ด ์šฐ์ธก ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง์„ ๋‚˜ํƒ€๋ƒ„. ๋ณ€์ˆ˜์ฒ˜๋Ÿผ!
println("ํ‰๊ท ๊ฐ’์€ ${add(10,20,30)}์ž…๋‹ˆ๋‹ค")

 

// ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๋žŒ๋‹ค์‹ ๋ณ€์ˆ˜ @@์ถ”๊ฐ€ํ•˜๊ธฐ

fun main(){
    var result : Int
    val example = {x: Int, y: Int -> x * y} 		//์ผ๋ฐ˜ ๋ณ€์ˆ˜์— ๋žŒ๋‹ค์‹ ํ• ๋‹น
    result = example(10,30) 		//๋žŒ๋‹ค์‹์ด ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    println(result)
}

//300

val example: (Int, Int) -> Int 		//๋žŒ๋‹ค์‹์˜ ์ž๋ฃŒํ˜• ์„ ์–ธ
    = {x: Int, y: Int -> x*y}

 

2. ์‹ฑ๊ธ€ํ„ด

    : ๋ฉ”๋ชจ๋ฆฌ ์ „์—ญ์—์„œ ์œ ์ผํ•œ ๊ฐ์ฒด์ž„์„ ๋ณด์žฅ (๋ชจ๋“  ๊ฐ์ฒด์— ์˜ํ•ด ๊ณต์œ ๋˜๋Š” ํšจ๊ณผ...)

    - ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๋งŒ๋“  ์ธ์Šคํ„ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ „์—ญ์—์„œ ์œ ์ผ & ์œ„์น˜์ •๋ณด๊ฐ€ ๊ณ ์ •๋จ. ๋™์ผ
    - ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ๋ฐ”๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋จ

    (+) ์ „์—ญ์ ์œผ๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅ, ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์—์„œ ์‰ฝ๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    (+) ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ™œ์šฉ ๊ฐ€๋Šฅ
    (+) ๊ฐ์ฒด ์ฐจ์›์—์„œ์˜ ์ถฉ๋Œ ๋ฐฉ์ง€

    //ex. 1๊ฐœ์˜ ํ”„๋ฆฐํ„ฐ๊ธฐ, ๊ณต๋™์‚ฌ์šฉ 

companion, object๋กœ ๊ตฌํ˜„

    - ์ƒ์„ฑ์ž ์•ˆ ์ ์–ด๋„ ๋จ. ์ž๋ฐ”๋ž‘ ๋‹ค๋ฅด๋„ค

?@JvmStatic ๋ญ์ง€...281~

class KCustomer{
    companion object{
        const val LEVEL = "INTERMEDIATE"
        @JvmStatic fun login() = println("Login")
    }
}

@JvmStatic ์• ๋…ธํ…Œ์ด์…˜ : ์ž๋ฐ” ์†Œ์Šค์—์„œ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•  ๋•Œ Companion์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ

KCustomer.login();

KCustomer.Companion.login(); 		//์• ๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

@JvmField ์• ๋…ธํ…Œ์ด์…˜ : ํ”„๋กœํผํ‹ฐ๋ฅผ ์ž๋ฐ”์—์„œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ

 

 

//object ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹
object OCustomer{
    var name = "์ฒ ์ด"
    fun greeting() = println("Hello World")
    val HOBBY = Hobby("Basketball")
    init{
        println("Init!")
    }
}

//์ปดํŒจ๋‹ˆ์–ธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹
class CCustomer{
    companion object{
        const val HELLO = "hello" 	//์ƒ์ˆ˜ ํ‘œํ˜„
        var name = "๋ฏธ์• "
        @JvmField val HOBBY = Hobby("Football")
        @JvmStatic fun greeting() = println("Hello World")
    }
}

class Hobby(val name: String)

fun main() {
    OCustomer.greeting()    //๊ฐ์ฒด์˜ ์ ‘๊ทผ ์‹œ์ 
    OCustomer.name = "๊ธฐ์˜"
    println("name = ${OCustomer.name}")
    println(OCustomer.HOBBY.name)

    CCustomer.greeting()
    println("name = ${CCustomer.name}, HELLO = ${CCustomer.HELLO}")
    println(CCustomer.HOBBY.name)
}

    - object๋กœ ์„ ์–ธ๋œ OCustomer๋Š” ๋ฉค๋ฒ„ ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ฒด ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ . ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

    - ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์— ์‚ฌ์šฉ๋จ

    - object ์„ ์–ธ ๋ฐฉ์‹ ์‚ฌ์šฉ ์‹œ ์ ‘๊ทผ ์‹œ์ ์— ๊ฐ์ฒด ์ƒ์„ฑ๋จ -> ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ํ•˜์ง€ ์•Š์Œ = object ์„ ์–ธ ์‹œ ์ฃผ/๋ถ€ ์ƒ์„ฑ์ž ์‚ฌ์šฉ ๋ถˆ๊ฐ€

    - ์ˆ˜์ • ๊ฐ€๋Šฅ

 

2024.03.15 - [์–ธ์–ด/Kotlin] - [Kotlin ๊ณต๋ถ€] object์™€ ์‹ฑ๊ธ€ํ†ค, object์™€ compaion

 

[Kotlin ๊ณต๋ถ€] object์™€ ์‹ฑ๊ธ€ํ†ค, object์™€ compaion

dd

sugapowderjj.tistory.com

 

 

๊ฐ์ฒด ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋ž˜์Šค ์ •๋ณด์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

1)  ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

fun main() {
    Bird.fly("์ฐธ์ƒˆ") 		//๊ฐ์ฒด ์ƒ์„ฑ ์—†์ด ํด๋ž˜์Šค ์ด๋ฆ„.๋ฉ”์„œ๋“œ( )
}

object Bird {
    fun fly(name:String) {
        println("${name}๊ฐ€ ๋‚ ์•„์š”~")
    }
}
class Person{
    var id: Int=0
    var name: String = "์ฒ ์ด"
    companion object{
        var language : String = "Korean"
        fun work(){
            println("working")
        }
    }
}

fun main(){
    println(Person.language) 	//์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    Person.language = "Engligh" 	//๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
    println(Person.language) 	//๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•จ
    Person.work() 	//๋ฉ”์„œ๋“œ ์‹คํ–‰
    
    //println(Person.name) 	//name์€ ์ปดํŒจ๋‹ˆ์–ธ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ˆ๊นŒ ์•ˆ๋จ
    
}

 

2) ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ

fun main() {
    // trash์™€ ๊ฐ™์ด ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ ๊ฐ€๋Šฅ
    var singletonObject1 = MySingletonClass.getInstance(trash = 1)
    singletonObject1.setNum(5)
    println("num๊ฐ’์€: ${singletonObject1.getNum()}")

    // singletonObject2์—์„œ num์„ 10์œผ๋กœ ๋Œ€์ž…
    var singletonObject2 = MySingletonClass.getInstance(trash = 1)
    singletonObject2.setNum(10)

    // singletonObject1์˜ num์ด 10์œผ๋กœ ์ถœ๋ ฅ๋จ
    // singletonObject1๊ณผ singletonObject2๋Š” ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ
    println("num๊ฐ’์€: ${singletonObject1.getNum()}")

}

class MySingletonClass private constructor() {
    private var num:Int = 0

    companion object {
        @Volatile private var instance: MySingletonClass? = null
        private var trash = 0

        fun getInstance(trash: Int): MySingletonClass {
            this.trash = trash
            // ์™ธ๋ถ€์—์„œ ์š”์ฒญ์™”์„๋•Œ instance๊ฐ€ null์ธ์ง€ ๊ฒ€์ฆ
            if(instance == null) {
		            // synchronized๋กœ ์™ธ๋ถ€ ์“ฐ๋ ˆ๋“œ์˜ ์ ‘๊ทผ์„ ๋ง‰์Œ
								// ์“ฐ๋ ˆ๋“œ๋Š” ๋‹ค์Œ์ฑ•ํ„ฐ์—์„œ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค!
		            // ์“ฐ๋ ˆ๋“œ๊ฐ„์˜ ๊ฐ์ฒด์ƒํƒœ ํ˜ผ๋ˆ์„ ๋ง‰๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ดํ•ดํ•ด์ฃผ์„ธ์š”
                synchronized(this) {
                    instance = MySingletonClass()
                }
            }
            return instance!!
            
//            ์—˜๋น„์Šค์—ฐ์‚ฐ์ž์™€ ๋’ท์žฅ์—์„œ๋ฐฐ์šธ scope function์„ ์ด์šฉํ•˜๋ฉด
//            ์•„๋ž˜์™€๊ฐ™์ด ๋”์šฑ ์ง๊ด€์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
//            return instance ?: synchronized(this) {
//                // also๋Š” ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋ฅผ it์œผ๋กœ ๋„˜๊น€
//                // instance๊ฐ€ null์ด๋ผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์•„๋‹ˆ๋ฉด ๋ฌด์‹œํ•จ
//                instance ?: MySigletonClass().also {
//                    instance = it
//                }
//            }
        }
    }
    fun setNum(num: Int) {
        this.num = num
    }

    fun getNum(): Int{
        return this.num
    }
}