🌝Coding/🌟Kotlin

03. ν•¨μˆ˜

λΏŒμ•Ό._. 2021. 4. 4. 17:41

πŸ€”ν•¨μˆ˜

fun ν•¨μˆ˜μ΄λ¦„ ([λ³€μˆ˜ 이름: μžλ£Œν˜•]): [λ°˜ν™˜κ°’μ˜ μžλ£Œν˜•] {
	ν‘œν˜„μ‹
    [return λ°˜ν™˜κ°’]
}

 

 - κ°€λ³€ 인자: 인자의 κ°œμˆ˜κ°€ λ³€ν•œλ‹€ 

fun ν•¨μˆ˜μ΄λ¦„ (vararg [λ³€μˆ˜ 이름: μžλ£Œν˜•]): [λ°˜ν™˜κ°’μ˜ μžλ£Œν˜•] {
	ν‘œν˜„μ‹
    [return λ°˜ν™˜κ°’]
}

 

πŸ€”μ½”ν‹€λ¦° == 닀쀑 νŒ¨λŸ¬λ‹€μž„ μ–Έμ–΄

 

1) ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°: μ½”λ“œ κ°„λž΅, ν…ŒμŠ€νŠΈλ‚˜ μž¬μ‚¬μš©μ„± 증가, λžŒλ‹€μ‹, κ³ μ°¨ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ ꡬ성, 순수 ν•¨μˆ˜

2) 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°

 

 

πŸ€”μˆœμˆ˜ ν•¨μˆ˜

 

λΆ€μž‘μš©(side-effect)이 μ—†λŠ” ν•¨μˆ˜

-> λ™μΌν•œ μž…λ ₯ μΈμžμ— λŒ€ν•΄μ„œλŠ” 항상 같은 κ²°κ³Όλ₯Ό 좜λ ₯, λ°˜ν™˜ν•¨

-> 값이 예츑 κ°€λŠ₯ν•˜μ—¬ 결정적

 

쑰건

-> 같은 μΈμžμ— λŒ€ν•˜μ—¬ 항상 같은 값을 λ°˜ν™˜

-> ν•¨μˆ˜ μ™ΈλΆ€μ˜ μ–΄λ–€ μƒνƒœλ„ 바꾸지 μ•ŠμŒ 

 

μž₯점

-> μž…λ ₯, λ‚΄μš©μ„ λΆ„λ¦¬ν•˜κ³  λͺ¨λ“ˆν™” ν•˜μ—¬ μž¬μ‚¬μš©μ„±μ΄ 높아짐

-> νŠΉμ • μƒνƒœμ— 영ν–₯ 주지 μ•ŠμŒ -> 병행 μž‘μ—… μ‹œ μ•ˆμ „

-> ν•¨μˆ˜μ˜ κ°’ 좔적, 예츑 κ°€λŠ₯ -> ν…ŒμŠ€νŠΈ, 디버깅 유리

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— 적용

-> ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜, μΈμžμ— 혹인 λ°˜ν™˜ 값에 적용 (κ³ μ°¨ ν•¨μˆ˜)

-> ν•¨μˆ˜λ₯Ό λ³€μˆ˜λ‚˜ 데이터 ꡬ쑰에 μ €μž₯

-> μœ μ—°μ„± 증가

 

 

πŸ€”λžŒλ‹€μ‹

 

- 읡λͺ… ν•¨μˆ˜μ˜ ν•˜λ‚˜μ˜ ν˜•νƒœλ‘œ 이름 없이 μ‚¬μš© 및 싀행이 κ°€λŠ₯

- λžŒλ‹€ λŒ€μˆ˜λ‘œλΆ€ν„° 유래

 

이용

-> λžŒλ‹€μ‹μ€ κ³ μ°¨ ν•¨μˆ˜μ—μ„œ 인자둜 λ„˜κΈ°κ±°λ‚˜ κ²°κ³Όκ°’μœΌλ‘œ λ°˜ν™˜ 등을 ν•  수 있음

 

//일반 λ³€μˆ˜μ— λžŒλ‹€μ‹ ν• λ‹Ή
// 1
val multi={a:Int, b:Int -> a*b}

// 2
val multi:(a:Int, b:Int) -> Int = {a,b -> a*b}

result=multi(a:10, b:20) //λžŒλ‹€μ‹μ΄ ν• λ‹Ήλœ λ³€μˆ˜λŠ” ν•¨μˆ˜μ²˜λŸΌ μ‚¬μš© κ°€λŠ₯

 

- λ§€κ°œλ³€μˆ˜ κ°œμˆ˜μ— 따라 λžŒλ‹€μ‹μ„ κ΅¬μ„±ν•˜λŠ” 방법

fun main(){
	//λ§€κ°œλ³€μˆ˜ μ—†λŠ” λžŒλ‹€μ‹ ν•¨μˆ˜
    noParam({"Hello World!"})
    noParam {"Hello World!"} //μœ„μ™€ 동일 κ²°κ³Ό, μ†Œκ΄„ν˜Έ μƒλž΅ κ°€λŠ₯
    
    //λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜ μžˆλŠ” λžŒλ‹€μ‹ ν•¨μˆ˜
    oneParam ({a->"Hello World! $a"})
    oneParam {a->"Hello World! $a"} //μœ„μ™€ 동일 κ²°κ³Ό, μ†Œκ΄„ν˜Έ μƒλž΅ κ°€λŠ₯
    oneParam {"Hello World! $it"} //μœ„μ™€ 동일 κ²°κ³Ό, it으둜 λŒ€μ²΄ κ°€λŠ₯
    
    //λ§€κ°œλ³€μˆ˜κ°€ 두 개 μžˆλŠ” λžŒλ‹€μ‹ ν•¨μˆ˜
    moreParam {a,b -> "Hello World! $a $b"} //λ§€κ°œλ³€μˆ˜λͺ… μƒλž΅ λΆˆκ°€
    
    //λ§€κ°œλ³€μˆ˜λ₯Ό μƒλž΅ν•˜λŠ” 경우
    moreParam {_, b -> "Hello World! $b"} //첫 번째 λ¬Έμžμ—΄μ€ μ‚¬μš©ν•˜μ§€ μ•Šκ³  μƒλž΅
}

//λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” λžŒλ‹€μ‹ ν•¨μˆ˜κ°€ noParam ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ out 으둜 지정됨
fun noParam(out:()->String)=println(out())

//λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜ μžˆλŠ” λžŒλ‹€μ‹ ν•¨μˆ˜κ°€ oneParamν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ out으둜 지정됨
fun oneParam(out: (String) -> String) {
	println(out("OneParam"))
}

//λ§€κ°œλ³€μˆ˜κ°€ 두 개 μžˆλŠ” λžŒλ‹€μ‹ ν•¨μˆ˜κ°€ moreParam ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ 지정됨
fun moreParam(out: (String,String) -> String) {
	println(out("OneParam","TwoParam"))
}



 

πŸ€”μΌκΈ‰ 객체

 

- ν•¨μˆ˜μ˜ 인자둜 전달할 수 있음

- ν•¨μˆ˜μ˜ λ°˜ν™˜ 값에 μ‚¬μš© κ°€λŠ₯

- λ³€μˆ˜μ— 담을 수 있음

 

-> μ½”ν‹€λ¦°μ—μ„œ ν•¨μˆ˜λŠ” 일급 객체둜 λ‹€λ£Έ

 

 

πŸ€”κ³ μ°¨ ν•¨μˆ˜

fun main() {
	println(highFunc( {x,y -> x+y }, 10, 20) ) //λžŒλ‹€μ‹ ν•¨μˆ˜λ₯Ό 인자둜 λ„˜κΉ€
}

fun highFunc( sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a,b) //sum λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜

 

πŸ€”μ΅λͺ… ν•¨μˆ˜

 

- ν•¨μˆ˜κ°€ 이름이 μ—†λŠ” 것

- λžŒλ‹€μ‹λ„ μΌμ’…μ˜ 읡λͺ… ν•¨μˆ˜

- 일반 읡λͺ… ν•¨μˆ˜μ—μ„œλŠ” return, break continueκ°€ μ‚¬μš© κ°€λŠ₯ν•˜μ§€λ§Œ, λžŒλ‹€μ‹μ—μ„œλŠ” μ‚¬μš©ν•˜κΈ° 어렀움

fun (x: Int, y:Int): Int= x+y //ν•¨μˆ˜ 이름이 μƒλž΅λœ 읡λͺ… ν•¨μˆ˜

val add: (Int, Int) -> Int=fun(x,y)=x+y //읡λͺ… ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ add μ„ μ–Έ
val result=add(10,2) //add의 μ‚¬μš©

 

 

πŸ€”μΈλΌμΈ ν•¨μˆ˜

 

- ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” 곳에 λ‚΄μš©μ„ λͺ¨λ‘ 볡사

- ν•¨μˆ˜μ˜ λΆ„κΈ° 없이 처리 -> μ„±λŠ₯ 증가

- 단점: μ½”λ“œκ°€ λ³΅μ‚¬λ˜λ―€λ‘œ λ‚΄μš©μ΄ λ§Žμ€ ν•¨μˆ˜μ— μ‚¬μš©ν•˜λ©΄ μ½”λ“œκ°€ λŠ˜μ–΄λ‚¨

 

- noinline ν‚€μ›Œλ“œ: 일뢀 λžŒλ‹€μ‹ ν•¨μˆ˜λ₯Ό 인라인 λ˜μ§€ μ•Šκ²Œ ν•˜κΈ° μœ„ν•΄

inline fun sub (out1: () -> Unit, noinline out2: () -> Unit) {

 

 

πŸ€”ν™•μž₯ ν•¨μˆ˜

 

- 클래슀의 멀버 ν•¨μˆ˜λ₯Ό μ™ΈλΆ€μ—μ„œ 더 μΆ”κ°€ν•  수 μžˆλ‹€.

- 기쑴의 ν‘œμ€€ 라이브러리λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ ν™•μž₯ κ°€λŠ₯

fun ν™•μž₯λŒ€μƒ.ν•¨μˆ˜λͺ…(λ§€κ°œλ³€μˆ˜, ...): λ°˜ν™˜κ°’{
	...
    retrun κ°’
}

 

 

πŸ€”μ€‘μœ„ ν•¨μˆ˜

 

- μ€‘μœ„ ν‘œν˜„λ²•: 클래슀의 멀버 호좜 μ‹œ μ‚¬μš©ν•˜λŠ” 점(.)을 μƒλž΅ν•˜κ³  ν•¨μˆ˜ 이름 뒀에 μ†Œκ΄„ν˜Έλ₯Ό μƒλž΅ν•΄ 직관적인 이름을 μ‚¬μš©ν•  수 μžˆλŠ” ν‘œν˜„λ²”

- μ€‘μœ„ ν•¨μˆ˜μ˜ 쑰건

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

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

   -> infix ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•œλ‹€.

fun main(){
	//μ€‘μœ„ ν‘œν˜„λ²”
    val multi=3 multiply 10
    println("multi: $multi")
}

//Int ν™•μž₯ν•΄μ„œ multiply() ν•¨μˆ˜κ°€ ν•˜λ‚˜ 더 μΆ”κ°€λ˜μ—ˆμŒ
infix fun Int.multiply(x:Int): Int{ //infix둜 μ„ μ–Έλ˜λ―€λ‘œ μ€‘μœ„ ν•¨μˆ˜
	return this*x
}

 

 

πŸ€”κΌ¬λ¦¬ μž¬κ·€ ν•¨μˆ˜

 

- μž¬κ·€: 자기 μžμ‹ μ„ λ‹€μ‹œ μ°Έμ‘°/ μž¬κ·€ ν•¨μˆ˜λŠ” 자기 μžμ‹ μ„ 계속 ν˜ΈμΆœν•˜λŠ” νŠΉμ§•

-꼬리 μž¬κ·€ ν•¨μˆ˜

   -> μŠ€νƒμ— 계속 μŒ“μ΄λŠ” 방식이 ν•¨μˆ˜κ°€ 계속 μ”Œμ›Œμ§€λŠ” 꼬리λ₯Ό λ¬΄λŠ” ν˜•νƒœ

   -> μ½”ν‹€λ¦° 고유의 tailrec ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ„ μ–Έ

#꼬리 μž¬κ·€ - μŠ€νƒμ„ μ‚¬μš©ν•˜μ§€ μ•ŠμŒ

fun main() {
    val number=5
    println("Factorial: $number -> ${factorial(number)}")
}

tailrec fun factorial(n: Int, run: Int=1): Long {
	return if (n==1) run.toLong() else factorial(n-1, run*n)
}

 

πŸ€”ν•¨μˆ˜μ˜ μ‹€ν–‰ 블둝

 

- ν•¨μˆ˜μ˜ 블둝({}): 블둝 λ‚΄μ—μ„œ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜ - 지역 λ³€μˆ˜

- μ΅œμƒμœ„ 및 지역 ν•¨μˆ˜ μ‚¬μš© λ²”μœ„

   -> μ΅œμƒμœ„ ν•¨μˆ˜λŠ” main() ν•¨μˆ˜ μ „, ν›„ μ–΄λ””λ“  μ„ μ–Έν•˜κ³  μ½”λ“œ λ‚΄μ—μ„œ 호좜 κ°€λŠ₯

   -> 지역 ν•¨μˆ˜λŠ” λ¨Όμ € μ„ μ–Έλ˜μ–΄μ•Ό κ·Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 있음

 

- μ „μ—­ λ³€μˆ˜

   -> μ΅œμƒμœ„μ— μžˆλŠ” λ³€μˆ˜λ‘œ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ μ‚­μ œλ˜μ§€ μ•Šκ³  λ©”λͺ¨λ¦¬μ— μœ μ§€

   -> μ—¬λŸ¬ μš”μ†Œκ°€ λ™μ‹œμ— μ ‘κ·Όν•˜λŠ” κ²½μš°μ— 잘λͺ»λœ λ™μž‘μ„ 유발 κ°€λŠ₯

   -> 자주 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μ „μ—­ λ³€μˆ˜λŠ” λ©”λͺ¨λ¦¬ μžμ› λ‚­λΉ„

- μ§€μ—­λ³€μˆ˜

   -> νŠΉμ • μ½”λ“œ 블둝 λ‚΄μ—μ„œλ§Œ μ‚¬μš©

   -> 블둝 μ‹œμž‘ μ‹œ μž„μ‹œλ‘œ μ‚¬μš©λ˜λ©° 주둜 μŠ€νƒ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©

 

 


좜처) www.boostcourse.org/mo132

 

μ½”ν‹€λ¦° ν”„λ‘œκ·Έλž˜λ° κΈ°λ³Έ 1

λΆ€μŠ€νŠΈμ½”μŠ€ 무료 κ°•μ˜

www.boostcourse.org

 

'🌝Coding > 🌟Kotlin' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

04. ν”„λ‘œκ·Έλž¨ νλ¦„μ˜ μ œμ–΄  (0) 2021.04.16
02. λ³€μˆ˜μ™€ μžλ£Œν˜•, μ—°μ‚°μž  (0) 2021.04.01
01. Kotlinμ΄λž€  (0) 2021.03.27
00. KotlinπŸ‘  (0) 2021.03.27