[JAVA] 더 μžλ°”, Java 8 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€ λžŒλ‹€ ν‘œν˜„μ‹

2022. 4. 6. 09:51ㆍJAVA/study

728x90

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

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λž€ 좔상 λ©”μ„œλ“œλ₯Ό λ”± ν•˜λ‚˜λ§Œ 가지고 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§ν•œλ‹€. 

SAM(Single Abstract Method) μΈν„°νŽ˜μ΄μŠ€ 

@FunctionalInterface μ• λ…Έν…Œμ΄μ…˜μ„ 가지고 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. 

 

2️⃣ λžŒλ‹€ ν‘œν˜„μ‹ (Lambda Expression) 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” λ°©λ²•μœΌλ‘œ 쓰일 수 μžˆλ‹€.

μ½”λ“œλ₯Ό 쀄일 수 μžˆλ‹€!!

λ§€μ†Œλ“œ λ§€κ°œλ³€μˆ˜, 리턴 νƒ€μž…, λ³€μˆ˜λ‘œ λ§Œλ“€μ–΄ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€. 

-> μ΄λ ‡κ²Œ 읡λͺ… λ‚΄λΆ€ ν•¨μˆ˜λ‘œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆλŠ”λ° μ—¬κΈ°μ„œ λžŒλ‹€λ₯Ό μ‚¬μš©ν•΄μ„œ μ½”λ“œλ₯Ό μ’€ 더 쀄일 수 μžˆλ‹€. 

 

3️⃣ μžλ°”μ—μ„œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 

ν•¨μˆ˜λ₯Ό First Class Object둜 μ‚¬μš©ν•  수 μžˆλ‹€. 

 

순수 ν•¨μˆ˜ (Pure Function)

- μ‚¬μ΄λ“œ μ΄νŒ©νŠΈκ°€ μ—†λ‹€. ( ν•¨μˆ˜ 밖에 μžˆλŠ” 값을 λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€.)

- μƒνƒœκ°€ μ—†λ‹€.(ν•¨μˆ˜ 밖에 μžˆλŠ” 값을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.)

 

κ³ μ°¨ ν•¨μˆ˜ (Higer-Order Function) 

ν•¨μˆ˜κ°€ ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 받을 수 있고 ν•¨μˆ˜λ₯Ό 리턴할 수 도 μžˆλ‹€. 

ν•¨μˆ˜λ₯Ό μ „λ‹¬μΈμž argument λ˜λŠ” λ§€κ°œλ³€μˆ˜ parameter둜 λ°›κ±°λ‚˜ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ 

 

λΆˆλ³€μ„±

 

❗ First Class Object(일급 객체) λž€? 

μΌκΈ‰κ°μ²΄λž€ λ‹€λ₯Έ 객체듀에 일반적으둜 적용 κ°€λŠ₯ν•œ 연산을 λͺ¨λ‘ μ§€μ›ν•˜λŠ” 객체λ₯Ό λ§ν•œλ‹€. 

(ν•¨μˆ˜λ₯Ό 데이터 String, number, boolean, array, object  닀루 듯이 λ‹€λ£° 수 μžˆλ‹€λŠ” 점이닀.)

 

- 일급 객체의 쑰건

λ³€μˆ˜λ‚˜ 데이터에 ν• λ‹Ήν•  수 μžˆλ‹€. 

λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό 인자둜 전달 λ°›λŠ”λ‹€. -> 객체의 인자둜 λ„˜κΈΈ 수 μžˆμ–΄μ•Ό ν•œλ‹€.  

λ‹€λ₯Έ ν•¨μˆ˜μ˜ κ²°κ³Όλ‘œμ„œ 리턴될 수 μžˆλ‹€. -> 객체의 λ¦¬ν„΄κ°’μœΌλ‘œ 리턴할 수 μžˆμ–΄μ•Ό ν•œλ‹€. 

 

μ›λž˜ javaμ—μ„œλŠ” ν•¨μˆ˜κ°€ 1κΈ‰ 객체에 ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ”λ° Java의 Lambdaλ₯Ό μ‚¬μš©ν•˜λ©΄ λ©”μ„œλ“œκ°€ 1개만 μ‘΄μž¬ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€/클래슀λ₯Ό 톡해, 마치 ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•˜λŠ” κ²ƒμ²˜λŸΌ μ—¬κ²¨μ„œ, ν•¨μˆ˜λ₯Ό 1κΈ‰ 객체둜 μ·¨κΈ‰ν•˜μ§€ μ•ŠλŠ” java의 단점을 μ–΄λŠμ •λ„ ν•΄κ²°ν•  수 μžˆλ‹€. 

 

- 일급 객체이기 λ•Œλ¬Έμ— ν•  수 μžˆλŠ” 것

κ³ μ°¨ ν•¨μˆ˜(Higher Order fucntion)을 λ§Œλ“€ 수 μžˆλ‹€. 

μ½œλ°±μ„ μ‚¬μš©ν•  수 μžˆλ‹€. 

 

- 콜백 ν•¨μˆ˜ callback

전달 인자둜 λ°›λŠ” ν•¨μˆ˜ 

 

 

4️⃣ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 

 

javaκ°€ 기본으둜 μ œκ³΅ν•˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 

- Function<T,R>

T  νƒ€μž…μ„ λ°›μ•„μ„œ R νƒ€μž…μ„ λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€ 

R apply(T t) 

ν•¨μˆ˜ μ‘°ν•©μš© λ©”μ†Œλ“œ 

- andThen

- compose 

 

- BiFunction<T, U, R>

두 개의 κ°’(T, U) λ₯Ό λ°›μ•„μ„œ R νƒ€μž…μ„ λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€ 

R apply(T t, U u)

 

- Consumer<T>

T νƒ€μž…μ„ λ°›μ•„μ„œ 아무것도 λ¦¬ν„΄ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€ 

void Accept(T t)

ν•¨μˆ˜ μ‘°ν•©μš© λ©”μ†Œλ“œ 

andThen 

 

- Supplier<T>

T νƒ€μž…μ˜ 값을 μ œκ³΅ν•˜λŠ” ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€ 

T get() 

 

- Predicate<T>

T νƒ€μž…μ„ λ°›μ•„μ„œ boolean을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€ 

boolean test(T t)

ν•¨μˆ˜ μ‘°ν•©μš© λ©”μ†Œλ“œ 

And

Or 

Negate 

 

- UnaryOperator<T>

Function<T, R> 의 νŠΉμˆ˜ν•œ ν˜•νƒœλ‘œ, μž…λ ₯κ°’ ν•˜λ‚˜λ₯Ό λ°›μ•„μ„œ λ™μΌν•œ νƒ€μž…μ„ λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€ 

 

- BinaryOperator<T>

BiFunction<T, U, R> 의 νŠΉμˆ˜ν•œ ν˜•νƒœλ‘œ, λ™μΌν•œ νƒ€μž…μ˜ μž…λ ₯κ°’ λ‘κ°œλ₯Ό λ°›μ•„ λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ μΈν„°νŽ˜μ΄μŠ€ 

 

 

5️⃣ λžŒλ‹€ ν‘œν˜„μ‹

(인자 리슀트) -> {λ°”λ””} 

 

인자 리슀트 

- μΈμžκ°€ 없을 λ•Œ : () 

- μΈμžκ°€ ν•œκ°œμΌ λ•Œ: (one) λ˜λŠ” one

- μΈμžκ°€ μ—¬λŸ¬κ°œμΌ λ•Œ : (one, two)

- 인자의 νƒ€μž…μ€ μƒλž΅ κ°€λŠ₯, μ»΄νŒŒμΌλŸ¬κ°€ μΆ”λ‘ infer ν•˜μ§€λ§Œ λͺ…μ‹œν•  μˆ˜λ„ μžˆλ‹€. (Integer one, Integer two) 

 

 λ°”λ”” 

- ν™”μ‚΄ν‘œ 였λ₯Έμͺ½μ— ν•¨μˆ˜ 본문을 μ •μ˜ν•œλ‹€. 

- μ—¬λŸ¬ 쀄인 κ²½μš°μ— {} λ₯Ό μ‚¬μš©ν•΄μ„œ λ¬ΆλŠ”λ‹€. 

- ν•œ 쀄인 κ²½μš°μ— μƒλž΅ κ°€λŠ₯,  return 도 μƒλž΅ κ°€λŠ₯ 

λ³€μˆ˜ 캑처 (Variable Capture)

- 둜컬 λ³€μˆ˜ 캑처 

: final μ΄κ±°λ‚˜  effective final 인 κ²½μš°μ—λ§Œ μ°Έμ‘°ν•  수 μžˆλ‹€. 

 κ·Έλ ‡μ§€ μ•Šμ„ 경우 concurrency  λ¬Έμ œκ°€ 생길 수 μžˆμ–΄μ„œ μ»΄νŒŒμΌλŸ¬κ°€ λ°©μ§€ν•œλ‹€. 

 

- effective final 

μžλ°” 8λΆ€ν„° μ§€μ›ν•˜λŠ” κΈ°λŠ₯으둜 사싀상 final인 λ³€μˆ˜ 

final ν‚€μ›Œλ“œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ³€μˆ˜λ₯Ό 읡λͺ… 클래슀 κ΅¬ν˜„μ²΄ λ˜λŠ” λžŒλ‹€μ—μ„œ μ°Έμ‘°ν•  수 μžˆλ‹€. 

읡λͺ… 클래슀 κ΅¬ν˜„μ²΄μ™€ 달리 μ‰λ„μž‰ ν•˜μ§€ μ•ŠλŠ”λ‹€. 

-> 읡λͺ… ν΄λž˜μŠ€λŠ” μƒˆλ‘œμš΄ scopeλ₯Ό λ§Œλ“€μ§€λ§Œ λžŒλ‹€λŠ” λžŒλ‹€λ₯Ό 감싸고 μžˆλŠ” scope와 κ°™λ‹€. 

 

6️⃣ λ©”μ†Œλ“œ 레퍼런슀 

λžŒλ‹€κ°€ ν•˜λŠ” 일이 κΈ°μ‘΄ λ©”μ†Œλ“œ λ˜λŠ” μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” 거라면, λ©”μ†Œλ“œ 레퍼런슀λ₯Ό μ‚¬μš©ν•΄μ„œ 맀우 κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€. 

 

λ©”μ†Œλ“œ μ°Έμ‘°ν•˜λŠ” 방법

Static λ©”μ†Œλ“œ μ°Έμ‘° νƒ€μž…::μŠ€νƒœν‹± λ©”μ†Œλ“œ 
νŠΉμ • 객체의 μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ μ°Έμ‘° 객체 레퍼런슀::μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ 
μž„μ˜ 객체의 μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ μ°Έμ‘° νƒ€μž…::μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ 
μƒμ„±μž μ°Έμ‘°  νƒ€μž…::new 

λ©”μ†Œλ“œ λ˜λŠ” μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ‘œ λžŒλ‹€μ˜ μž…λ ₯값을 λ°›λŠ”λ‹€. 

리턴값 λ˜λŠ” μƒμ„±ν•œ κ°μ²΄λŠ” λžŒλ‹€μ˜ 리턴값이닀. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90