꾸쀀함이 진리닀!!

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ 였늘이 λ˜κ³ ν”ˆ πŸ§‘πŸ»β€πŸ’» 의 λΈ”λ‘œκ·Έ

Tutorial/tutorial

[Kotlin] μ—¬λŸ¬κ°€μ§€ ν•¨μˆ˜(function)의 μ‚¬μš©λ²•

λŽμš” 2022. 9. 17. 12:38

μ•ˆλ…•ν•˜μ„Έμš” μ˜€λŠ˜μ€ Kotlinμ—μ„œ μ œκ³΅ν•˜λŠ” μ—¬λŸ¬ κ°€μ§€ ν•¨μˆ˜λ“€μ— λŒ€ν•΄μ„œ κ³΅λΆ€ν•œ 것을 정리해보렀 ν•©λ‹ˆλ‹€.


Kotlinμ—μ„œλŠ” Java와 λ‹€λ₯΄κ²Œ funμ΄λΌλŠ” ν‚€μ›Œλ“œλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. : λ’€μ—λŠ” λ°˜ν™˜ νƒ€μž…μ„ μ„€μ •ν•©λ‹ˆλ‹€. Unit은 μžλ°”μ—μ„œ μ‚¬μš©λ˜λŠ” void와 λ™μΌν•©λ‹ˆλ‹€. μ˜ˆμ‹œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

fun testFunction(param1 : String , param2: String) : Stirng {
 //todo something
}

fun testUnitFunction() : Unit {
//todo something μœ„ Unit은 μƒλž΅ κ°€λŠ₯ν•˜λ‹€.
}

이제 Kotlinμ—μ„œ μ œκ³΅ν•˜λŠ” μ—¬λŸ¬κ°€μ§€ ν•¨μˆ˜λ“€μ— λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€.

β–ͺ️ Default μ§€μ • ν•¨μˆ˜ & λ³€μˆ˜ μ§€μ • ν•¨μˆ˜

ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œ νŒŒλΌλ―Έν„° 값을 기본적으둜 μ§€μ •ν•˜μ—¬ μ‚¬μš©ν•  수 있으며. 값을 μ§€μ •ν•˜μ§€ μ•Šμ„ 경우 μ„ μ–Έν•œ 기본값을 μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

import java.text.DecimalFormat
import java.util.*

val decimalFormat  = DecimalFormat("###,###,###,###")
val currency : String? = Currency.getInstance(Locale.getDefault()).symbol
val currentMonth = Calendar.getInstance().get(Calendar.MONTH) + 1

const val MONTH_OF_YEAR = 12

fun paycheck(annualSalary : Long = 50_000_000 , tax : Float = 0.333f) : Long{
    var salary = annualSalary / MONTH_OF_YEAR
    salary -= (salary * tax).toLong()
    return salary
}

fun main() {
    var salary = paycheck(36_000_000) // 첫번째 μΈμžκ°’ 적용
    println("${currentMonth}μ›” 총 κΈ‰μ—¬λŠ” $currency${decimalFormat.format(salary)}μž…λ‹ˆλ‹€.")

    salary = paycheck() // κΈ°λ³Έ μΈμžκ°’μ„ 적용
    println("${currentMonth}μ›” 총 κΈ‰μ—¬λŠ” $currency${decimalFormat.format(salary)}μž…λ‹ˆλ‹€.")

    salary = paycheck(90_000_000 , 0.025f) // λ‘λ²ˆμ§Έ μΈμžκ°’ κΉŒμ§€ 적용
    println("${currentMonth}μ›” 총 κΈ‰μ—¬λŠ” $currency${decimalFormat.format(salary)}μž…λ‹ˆλ‹€.")

    salary = paycheck(tax = 0.045f) // νŒŒλΌλ―Έν„°κ°’μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•¨μœΌλ‘œ λ‘λ²ˆμ§Έ μΈμžκ°’μ„ λ³€κ²½ ν•  수 μžˆλ‹€.
    println("${currentMonth}μ›” 총 κΈ‰μ—¬λŠ” $currency${decimalFormat.format(salary)}μž…λ‹ˆλ‹€.")
}

β–ͺ️ μ§€μ—­ ν•¨μˆ˜(Local Function) 

ν•¨μˆ˜ 내뢀에 ν•΄λ‹Ή ν•¨μˆ˜μ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” μ§€μ—­ ν•¨μˆ˜λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 예제 μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

const val MANAGER = "Manager"
const val STAFF = "Staff"
const val INTERN = "Intern"

fun paycheck(annualSalary : Long , position : String) : Long{
    var tax = 0.0f
    fun applyTax(){ // LocalFunction 으둜 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜λ₯Ό μƒˆλ‘œ μ •μ˜κ°€ κ°€λŠ₯ν•˜λ‹€ λ‹€λ§Œ, 자주 μ‚¬μš©ν•˜μ§€λŠ” μ•ŠμŒ
        tax = if(annualSalary > 0 ) when (position){
            MANAGER -> 0.027f
            STAFF -> 0.033f
            else -> 0.047f
        } else {
            throw IllegalAccessException("$annualSalary κ°’μœΌλ‘  연봉을 계산 ν•  수 μ—†μŠ΅λ‹ˆλ‹€.")
        }
    }
    applyTax()
    var salary = annualSalary/12
    salary -= (salary*tax).toLong()
    return salary
}

fun main() {
    var salary = paycheck(36_000_000 , STAFF)
    println("${currentMonth}μ›” 총 κΈ‰μ—¬λŠ” $currency${decimalFormat.format(salary)}μž…λ‹ˆλ‹€.")
}

β–ͺ️ μ€‘μœ„ ν•¨μˆ˜(infix Function) 

클래슀의 멀버 호좜 μ‹œ μ‚¬μš©λ˜λŠ” (.)κ³Ό ν•¨μˆ˜ 이름 뒀에 μ†Œκ΄„ν˜Έλ₯Ό μƒλž΅ν•΄ 직관적인 이름을 μ‚¬μš©ν•˜μ—¬ ν‘œν˜„ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ€‘μœ„ ν•¨μˆ˜κ°€ 되기 μœ„ν•΄μ„œλŠ” 3κ°€μ§€ 쑰건이 μžˆμŠ΅λ‹ˆλ‹€.

 

1. 멀버 λ©”μ„œλ“œ λ˜λŠ” ν™•μž₯ ν•¨μˆ˜μ—¬μ•Ό ν•œλ‹€.

2. ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ Έμ•Ό ν•œλ‹€.

3. infixν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€

import java.util.Scanner

fun main() {
    val num = 5
    println("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.")
    val num2 = Scanner(System.`in`).nextInt()

    println(num multiply num2)
}

infix fun Int.multiply(num : Int) : Int {
    return this * num
}

β–ͺ️ ν™•μž₯ ν•¨μˆ˜(Extension Function) 

클래슀λ₯Ό 상속받지 μ•Šκ³  κΈ°λ³Έ 클래슀의 ν•¨μˆ˜λ₯Ό μΆ”κ°€ κ΅¬ν˜„ν•˜λŠ” ν•¨μˆ˜λ‘œ μ•„λž˜ μ˜ˆμ œμ—μ„œλŠ” ν‘œμ€€ 라이브러리 class와 μž„μ˜λ‘œ μƒμ„±ν•œ classλ₯Ό λ‘˜ λ‹€ ν™•μž₯ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

[ TextClass.kt ]

//Testλ₯Ό μœ„ν•œ 같은 νŒ¨ν‚€μ§€μ— class 생성함

package com.lee.extensionfunction

class TestClass {
    fun isResult(grade : Int) : Boolean {
        return grade >= 60
    }
}

[EntryPoint]

package com.lee.extensionfunction

fun main() {
    val testClass  = TestClass()
    val score = 95
    if(testClass.isResult(score)){
        if(testClass.isExcellent(score)){
            println("당신은 μ—μ΄μŠ€κ΅°μš”!!")
        }
        else {
            println("μ‹œν—˜μ— ν†΅κ³Όν•˜μ…¨μŠ΅λ‹ˆλ‹€.")
        }
    } else {
        println("μ‹œν—˜μ—μ„œ λ–¨μ–΄μ§€μ…¨μŠ΅λ‹ˆλ‹€.")
    }
    
    /**
     μ•„λž˜λŠ” μ •κ·œ class Extension Function
     **/
    
    var list = arrayListOf(23, 22, 3)
    println("swap μ „ list = $list")
    list = list.swap(0,2)
    println("swap ν›„ list = $list")

    val result = "@$@$#@$%#$^%#@$%@# Kotlin %^#$%#$ World!@#!@#!@#!@#!@#".removeSpecialCharacters()
    println(result)
}

fun TestClass.isExcellent(grade : Int) : Boolean { 
		//TextClass에 μƒˆλ‘œμš΄ ν™•μž₯ν•¨μˆ˜ 
    return grade >= 95
}

fun ArrayList<Int>.swap(item1 : Int , item2: Int) : ArrayList<Int> {
		//ArrayList 의 ν™•μž₯ ν•¨μˆ˜
    val temp = this[item1]
    this[item1] = this[item2]
    this[item2] = temp
    return this
}

fun String.removeSpecialCharacters() : String { //μ •κ·œλ¬Έμžκ°€ μ•„λ‹Œ λ¬ΈμžλŠ” μ „λΆ€ 곡백으둜 λŒ€μ²΄
		//String의 ν™•μž₯ ν•¨μˆ˜
    val match = """[^A-Za-z0-9]""".toRegex()
    return replace(match , "")
}

 

외에도 inline ν•¨μˆ˜ , 꼬리 μž¬κ·€ ν•¨μˆ˜ 등이 μžˆμ§€λ§Œ.. 아직 μ’€ 더 곡뢀가 ν•„μš”ν•  것 κ°™μŠ΅λ‹ˆλ‹€..

 

μ΄μƒμœΌλ‘œ Kotlin의 Function에 λŒ€ν•˜μ—¬ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 😎