[JAVA] 22. λžŒλ‹€μ‹ (Lambda Expression)

2022. 6. 1. 18:33ㆍJAVA/μžλ°”μ˜ 정석

728x90

 

1️⃣ λžŒλ‹€μ‹μ΄λž€? 

λžŒλ‹€μ‹μ΄λž€ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„ν•œ 것이닀. 

λžŒλ‹€μ‹μ€ ν•¨μˆ˜λ₯Ό κ°„λž΅ν•˜λ©΄μ„œλ„ λͺ…ν™•ν•œ μ‹μœΌλ‘œ ν‘œν˜„ν•  수 있게 ν•΄μ€€λ‹€. 

λ©”μ„œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ©”μ„œλ“œμ˜ 이름과 λ°˜ν™˜κ°’μ΄ μ—†μ–΄μ§€λ―€λ‘œ λžŒλ‹€μ‹μ„ 읡λͺ…ν•¨μˆ˜λΌκ³ λ„ ν•œλ‹€. 

 

 

β“λ©”μ„œλ“œμ™€ ν•¨μˆ˜μ˜ 차이 

λ©”μ„œλ“œμ™€ ν•¨μˆ˜λŠ” κ·Όλ³΅μ μœΌλ‘œλŠ” λ™μΌν•˜λ‚˜ ν•¨μˆ˜λŠ” 일반적인 μš©μ–΄μ΄κ³  λ©”μ„œλ“œλŠ” 객체지ν–₯ μš©μ–΄μ΄λ‹€. 

ν•¨μˆ˜λŠ” ν΄λž˜μŠ€μ— λ…λ¦½μ μ΄λ‚˜ λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€μ— 쒅속적이닀. 

 

 

- λžŒλ‹€μ‹ μž‘μ„±ν•˜κΈ°

 

λžŒλ‹€μ‹μ€ 읡λͺ…ν•¨μˆ˜ λ‹΅κ²Œ λ©”μ„œλ“œμ—μ„œ 이름과 λ°˜ν™˜νƒ€μž…μ„ μ œκ±°ν•˜κ³  λ§€κ°œλ³€μˆ˜ 선언뢀와 λͺΈν†΅{} 사이에 -> λ₯Ό μΆ”κ°€ν•΄μ£Όλ©΄ λœλ‹€. 

그리고 λ°˜ν™˜κ°’μ΄ μžˆλŠ” λ©”μ„œλ“œμ˜ κ²½μš°μ— return λ¬Έ λŒ€μ‹  μ‹μœΌλ‘œ λŒ€μ‹ ν•  수 μžˆλ‹€. 

λžŒλ‹€μ‹μ— μ„ μ–Έλœ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ€ 좔둠이 κ°€λŠ₯ν•œ κ²½μš°λŠ” μƒλž΅ν•  수 μžˆλŠ”λ° λŒ€λΆ€λΆ„ μƒλž΅κ°€λŠ₯ν•˜λ‹€. 

 

 

 

 

2️⃣ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (Fucntional Interface) 

μžλ°”μ—μ„œ λͺ¨λ“  λ©”μ„œλ“œλŠ” 클래슀 내에 ν¬ν•¨λ˜μ–΄μ•Ό ν•˜λŠ”λ° λžŒλ‹€μ‹λ„ 읡λͺ… 객체둜 읡λͺ… ν•¨μˆ˜κ°€ μ•„λ‹ˆλ‹€!!!

Object ν΄λž˜μŠ€μ—λŠ” max() λ©”μ„œλ“œκ°€ μ—†μ–΄μ„œ μ—λŸ¬κ°€ λ‚œλ‹€. 그럼 μ°Έμ‘°λ³€μˆ˜ νƒ€μž…μ€  μ–΄λ–€ 것이어야 ν•˜λŠ”κ°€? 

-> μ°Έμ‘°ν˜•μ΄λ‹ˆκΉŒ 클래슀 λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ κ°€λŠ₯ν•˜λ‹€. 그리고 λžŒλ‹€μ‹κ³Ό λ™μΌν•œ λ©”μ„œλ“œκ°€ μ •μ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€!

κ·Έλž˜μ•Όλ§Œ μ°Έμ‘°λ³€μˆ˜λ‘œ 읡λͺ…κ°μ²΄μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 있기 λ•Œλ¬Έμ΄λ‹€. 

 

MyFunction μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 읡λͺ… 객체λ₯Ό λžŒλ‹€μ‹μœΌλ‘œ λŒ€μ²΄ κ°€λŠ₯ν•œ μ΄μœ λŠ” λžŒλ‹€μ‹λ„ μ‹€μ œλ‘œλŠ” 읡λͺ… 객체이고, MyFunction μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 읡λͺ… 객체의 λ©”μ„œλ“œ max()와 λžŒλ‹€μ‹μ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…κ³Ό 개수 그리고 λ°˜ν™˜κ°’μ΄ μΌμΉ˜ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€!

 

λ”°λΌμ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 λžŒλ‹€μ‹μ„ λ‹€λ£¨κΈ°λ‘œ ν–ˆκ³ , λžŒλ‹€μ‹μ„ 닀루기 μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌκ³  ν•œλ‹€. 

단 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 였직 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ μ •μ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€λŠ” μ œμ•½μ΄ μžˆλ‹€. 

-> κ·Έλž˜μ•Ό λžŒλ‹€μ‹κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œκ°€ 1:1둜 연결될 수 있기 λ•Œλ¬Έμ΄λ‹€.

 @FunctionInterfaceλ₯Ό 뢙이면 μ»΄νŒŒμΌλŸ¬κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ •μ˜ν•˜μ˜€λŠ”μ§€ 확인해쀀닀!

 

 

- ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜νƒ€μž…

 

λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜κ°€ MyFunction νƒ€μž…μ΄λ©΄, μ΄λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ λžŒλ‹€μ‹μ„ μ°Έμ‘°ν•˜λŠ” μ°Έμ‘°λ³€μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 지정해야 ν•œλ‹€λŠ” 것이닀. 

그리고 λ©”μ„œλ“œμ˜ λ°˜ν™˜νƒ€μž…μ΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ΄λ©΄ 이 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œμ™€ λ™λ“±ν•œ λžŒλ‹€μ‹μ„ κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ³€μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ±°λ‚˜, λžŒλ‹€μ‹μ„ 직접 λ°˜ν™˜ν•  수 μžˆλ‹€. 

 

λžŒλ‹€μ‹μ„ μ°Έμ‘°λ³€μˆ˜λ‘œ λ‹€λ£° 수 μžˆλ‹€λŠ” 것은 λ©”μ„œλ“œλ₯Ό 톡해 λžŒλ‹€μ‹μ„ μ£Όκ³  받을 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€!

즉, λ³€μˆ˜μ²˜λŸΌ λ©”μ„œλ“œλ₯Ό μ£Όκ³ λ°›λŠ” 것이 κ°€λŠ₯해진 것이닀. 

 

 

3️⃣ java.util.function νŒ¨ν‚€μ§€ 

λŒ€λΆ€λΆ„μ˜ λ©”μ„œλ“œ νƒ€μž…μ΄ λΉ„μŠ·ν•˜κ²Œ λ§€κ°œλ³€μˆ˜κ°€ μ—†κ±°λ‚˜, ν•œ 개 λ˜λŠ” 두 개, λ°˜ν™˜ 값은 μ—†κ±°λ‚˜ ν•œ 개, κ²Œλ‹€κ°€ 지넀릭 λ©”μ„œλ“œλ‘œ μ •μ˜ν•˜λ©΄ λ§€κ°œλ³€μˆ˜λ‚˜ λ°˜ν™˜ νƒ€μž…μ΄ 달라도 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ”λ‹€. 

κ·Έλž˜μ„œ java.util.function νŒ¨ν‚€μ§€μ— 일반적으둜 자주 μ“°μ΄λŠ” ν˜•μ‹μ˜ λ©”μ„œλ“œλ₯Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ 미리 μ •μ˜ν•΄ λ†“μ•˜λ‹€. 

맀번 μƒˆλ‘œμš΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜μ§€ 말고, κ°€λŠ₯ν•˜λ©΄ νŒ¨ν‚€μ§€μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•˜λŠ” 것이 μ’‹λ‹€.

-> μ™œλƒν•˜λ©΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œ 이름도 ν†΅μΌλ˜κ³ , μž¬μ‚¬μš©μ„±μ΄λ‚˜ μœ μ§€λ³΄μˆ˜ μΈ‘λ©΄μ—μ„œλ„ μ’‹κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ˜ μΈν„°νŽ˜μ΄μŠ€μ—λ„ λ‹€μˆ˜μ˜ λ””ν΄νŠΈ λ©”μ„œλ“œκ°€ μΆ”κ°€λ˜μ—ˆλŠ”λ° κ·Έ μ€‘μ˜ μΌλΆ€λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•œλ‹€. 

Map의 compute둜 μ‹œμž‘ν•˜λŠ” λ©”μ„œλ“œλŠ” 맡의 valueλ₯Ό λ°˜ν™˜ν•˜λŠ” 일을 ν•˜κ³ , merge()λŠ” Map을 λ³‘ν•©ν•˜λŠ” 일을 ν•œλ‹€. 

 

 

 

4️⃣ Function의 ν•©μ„±κ³Ό Predicate의 κ²°ν•© 

μˆ˜ν•™μ—μ„œ 두 ν•¨μˆ˜λ₯Ό ν•©μ„±ν•΄μ„œ ν•˜λ‚˜μ˜ μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ λ‚Ό 수 μžˆλŠ” κ²ƒμ²˜λŸΌ 두 λžŒλ‹€μ‹μ„ ν•©μ„±ν•΄μ„œ μƒˆλ‘œμš΄ λžŒλ‹€μ‹μ„ λ§Œλ“€ 수 μžˆλ‹€. 

f.andThen(g)λŠ” f λ¨Όμ € μ μš©ν•˜κ³  κ·Έ λ‹€μŒ gλ₯Ό μ μš©ν•œλ‹€. 

f.compose(g)λŠ” gλ₯Ό λ¨Όμ € μ μš©ν•˜κ³  fλ₯Ό μ μš©ν•œλ‹€.

 

μ—¬λŸ¬ 쑰건식을 논리 μ—°μ‚°μžμΈ &&(and), || (or), !(not)으둜 μ—°κ²°ν•΄μ„œ ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ꡬ성할 수 μžˆλŠ” κ²ƒμ²˜λŸΌ Predicateλ₯Ό and(), or(), negate()둜 μ—°κ²°ν•΄μ„œ ν•˜λ‚˜μ˜ Predicate둜 κ²°ν•©ν•  수 μžˆλ‹€. 

 

그리고 static λ©”μ„œλ“œμΈ isEqual()은 두 λŒ€μƒμ„ λΉ„κ΅ν•˜λŠ” Predicateλ₯Ό λ§Œλ“€ λ•Œ μ‚¬μš©ν•œλ‹€. 

λ¨Όμ €, isEqual()의 λ§€κ°œλ³€μˆ˜λ‘œ 비ꡐ λŒ€μƒμ„ ν•˜λ‚˜ μ§€μ •ν•˜κ³ , 또 λ‹€λ₯Έ 비ꡐ λŒ€μƒμ€ test()의 λ§€κ°œλ³€μˆ˜λ‘œ μ§€μ •ν•œλ‹€. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90