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

[Chap 5] μ½”ν‹€λ¦°μ˜ μœ μš©ν•œ 기법

by nitronium102 2021. 11. 23.

λžŒλ‹€ ν•¨μˆ˜μ™€ κ³ μ°¨ ν•¨μˆ˜

λžŒλ‹€ ν•¨μˆ˜(λžŒλ‹€μ‹)

- 읡λͺ… ν•¨μˆ˜(anonymous funciton) μ •μ˜ 기법

- 주둜 ν•¨μˆ˜λ₯Ό κ°„λ‹¨ν•˜κ²Œ μ •μ˜ν•  λ•Œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— κ³ μ°¨ ν•¨μˆ˜μ— 많이 μ‚¬μš©

* κ³ μ°¨ν•¨μˆ˜ : ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ°›κ±°λ‚˜ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

 

λžŒλ‹€ ν•¨μˆ˜ μ„ μ–Έκ³Ό 호좜

fun ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ§€ μ•ŠμœΌλ©° ν•¨μˆ˜ 이름이 μ—†μŒ. -> 주둜 λžŒλ‹€ ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— λŒ€μž…ν•΄ μ‚¬μš© 

{ λ§€κ°œλ³€μˆ˜ -> ν•¨μˆ˜ λ³Έλ¬Έ }

λžŒλ‹€ ν•¨μˆ˜ μ‚¬μš© κ·œμΉ™

- μ€‘κ΄„ν˜Έ { } 둜 ν‘œν˜„

- { } μ•ˆμ— ν™”μ‚΄ν‘œ(->)κ°€ 있으며 ν™”μ‚΄ν‘œ μ™Όμͺ½μ€ λ§€κ°œλ³€μˆ˜, 였λ₯Έμͺ½μ€ ν•¨μˆ˜ λ³Έλ¬Έ

- ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ€ ν•¨μˆ˜ 본문의 λ§ˆμ§€λ§‰ ν‘œν˜„μ‹

// λžŒλ‹€ ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— λŒ€μž…
val sum = {no1: Int, no2: Int -> no1 + no2}
sum(10, 20) // λžŒλ‹€ ν•¨μˆ˜ 호좜문

// λžŒλ‹€ ν•¨μˆ˜ μ„ μ–Έκ³Ό 호좜
{no1: Int, no2: Int -> no1 + no2} (10, 20)

 

λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” λžŒλ‹€ ν•¨μˆ˜

- λ§€κ°œλ³€μˆ˜κ°€ 없을 경우 ν™”μ‚΄ν‘œ μ™Όμͺ½μ„ λΉ„μ›Œλ‘¬λ„ λœλ‹€. (ν™”μ‚΄ν‘œκΉŒμ§€ μƒλž΅ κ°€λŠ₯)

// λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” λžŒλ‹€ ν•¨μˆ˜
{-> println("function call")}
// ν™”μ‚΄ν‘œλ₯Ό μƒλž΅ν•œ λžŒλ‹€ ν•¨μˆ˜
{println("function call")}

 

λ§€κ°œλ³€μˆ˜κ°€ 1개인 λžŒλ‹€ ν•¨μˆ˜

- λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ ν•¨μˆ˜λ‘œ μ „λ‹¬λœ 값을 μ‰½κ²Œ μ΄μš©ν•  수 μžˆλ‹€. 

- μ€‘κ΄„ν˜Έ μ•ˆμ— λ§€κ°œλ³€μˆ˜ 선언을 μƒλž΅ν•˜κ³  it ν‚€μ›Œλ“œλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό μ΄μš©ν•  수 μžˆλ‹€. 

* it ν‚€μ›Œλ“œ : ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ 식별할 수 μžˆμ„ λ•Œλ§Œ κ°€λŠ₯

// λ§€κ°œλ³€μˆ˜κ°€ 1개인 ν•¨μˆ˜μ— it ν‚€μ›Œλ“œ μ‚¬μš©
fun main(){
	// val some = {no: Int -> println(no)}
    val some: (Int) -> Unit = {println(it)} // ν•¨μˆ˜ νƒ€μž… : (Int) -> Unit
    some(10)
}

 

λžŒλ‹€ ν•¨μˆ˜μ˜ λ°˜ν™˜

- returnλ¬Έ λŒ€μ‹  λ³Έλ¬Έμ—μ„œ λ§ˆμ§€λ§‰ μ€„μ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό λ°˜ν™˜

 

ν•¨μˆ˜ νƒ€μž…κ³Ό κ³ μ°¨ ν•¨μˆ˜

μ½”ν‹€λ¦°μ—μ„œλŠ” ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— λŒ€μž…ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ λ³€μˆ˜λŠ” νƒ€μž…μ„ 가지며, νƒ€μž…μ„ μœ μΆ”ν•  수 μžˆμ„ λ•Œλ₯Ό μ œμ™Έν•˜κ³ λŠ” μƒλž΅ν•  수 μ—†λ‹€. κ·Έλž˜μ„œ λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό λŒ€μž…ν•˜λ €λ©΄ λ³€μˆ˜λ₯Ό ν•¨μˆ˜ νƒ€μž…μœΌλ‘œ μ„ μ–Έν•΄μ•Ό ν•œλ‹€. 

 

ν•¨μˆ˜ νƒ€μž…

ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ λ‚˜νƒ€λ‚˜λŠ” λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜ νƒ€μž…

// format : ν•¨μˆ˜ νƒ€μž… = ν•¨μˆ˜ λ‚΄μš©
val some: (Int, Int) -> Int = { no1: Int, no2: Int -> no1 + no2 }

 

νƒ€μž… 별칭 - typealias

νƒ€μž…μ˜ 별칭을 μ„ μ–Έν•˜λŠ” ν‚€μ›Œλ“œλ‘œ, ν•¨μˆ˜ νƒ€μž…λΏλ§Œ μ•„λ‹ˆλΌ 데이터 νƒ€μž…μ„ μ„ μ–Έν•  λ•Œλ„ μ‚¬μš©

typealias MyFunType = (Int, Int) -> Boolean
fun main() {
	val someFun: MyFunType = { no1: Int, no2: Int -> no1>no2 }
}

 

λ§€κ°œλ³€μˆ˜ νƒ€μž… μƒλž΅

λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ μœ μΆ”ν•  수 μžˆλ‹€λ©΄ νƒ€μž… μ„ μ–Έ μƒλž΅ κ°€λŠ₯

 

κ³ μ°¨ ν•¨μˆ˜

ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ°›κ±°λ‚˜ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

 

널 μ•ˆμ „μ„±

null : 객체가 μ„ μ–Έλ˜μ—ˆμ§€λ§Œ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μƒνƒœ, 객체가 μ£Όμ†Œλ₯Ό 가지지 λͺ»ν•œ μƒνƒœ

 

널 ν—ˆμš© - ? μ—°μ‚°μž

λ³€μˆ˜ νƒ€μž… 뒀에 ? μ—°μ‚°μžλ₯Ό μΆ”κ°€ν•˜λ©΄ 널 ν—ˆμš© λ³€μˆ˜λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€ 

var data1: String="kang"
data1 = null // 였λ₯˜
var data2: String?="kang"
data2 = null // 성곡

 

널 μ•ˆμ „μ„± 호좜 - ?. μ—°μ‚°μž

널 ν—ˆμš©μœΌλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ˜ 멀버에 μ ‘κ·Όν•  λ•ŒλŠ” λ°˜λ“œμ‹œ ?. μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄μ•Ό ν•œλ‹€. 

?. μ—°μ‚°μž : λ³€μˆ˜κ°€ null이 μ•„λ‹ˆλ©΄ 멀버에 μ ‘κ·Όν•˜μ§€λ§Œ null이면 멀버에 μ ‘κ·Όν•˜μ§€ μ•Šκ³  null을 λ°˜ν™˜

var data: String? = "kang" // 널 ν—ˆμš© λ³€μˆ˜
var length = data?.length // 성곡

 

μ—˜λΉ„μŠ€ - ?: μ—°μ‚°μž

λ³€μˆ˜κ°€ 널이면 널을 λ°˜ν™˜(λ³€μˆ˜κ°€ 널일 λ•Œ λŒ€μž…ν•΄μ•Ό ν•˜λŠ” κ°’μ΄λ‚˜ μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” ꡬ문이 μžˆμ„ λ•Œ)

data = null
println("data = $data : ${data?.length ?: -1}") // null

 

μ˜ˆμ™Έ λ°œμƒ - !! μ—°μ‚°μž

객체가 널일 λ•Œ μ˜ˆμ™Έλ₯Ό μΌμœΌν‚€λŠ” μ—°μ‚°μž

fun some(data: String?): Int {
	return data!!.length
}
fun main() {
	println(some("kang")) // 5
    println(some(null)) // Exception in thread "main" java.lang.NullPointerException
}

λŒ“κΈ€