[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item03 μ™„λ²½κ³΅λž΅. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

2023. 1. 10. 10:34ㆍJAVA/Effective JAVA

728x90

 

item03. private μƒμ„±μžλ‚˜ μ—΄κ±° νƒ€μž…μœΌλ‘œ μ‹±κΈ€ν†€μž„μ„ λ³΄μ¦ν•˜λΌ. 

" p24. Supplier<T>, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€"

 

 

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ Functional Interface λž€? 

: μžλ°”κ°€ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ 1개의 좔상 λ©”μ„œλ“œλ₯Ό 가지고 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ˜λ―Έν•œλ‹€. 

Single Abstract Method (SAM) 이라고 ν•œλ‹€. 

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” λžŒλ‹€ ν‘œν˜„μ‹κ³Ό λ©”μ„œλ“œ 참쑰에 λŒ€ν•œ "타켓 νƒ€μž…"을 μ œκ³΅ν•œλ‹€. 

그리고 이 νƒ€κ²Ÿ νƒ€μž…μ€ λ³€μˆ˜ ν• λ‹Ή, λ©”μ„œλ“œ 호좜, νƒ€μž… λ³€ν™˜μ— ν™œμš©ν•  수 μžˆλ‹€. 

/**
 * ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€
 */
@FunctionalInterface
public interface MyFunction
{
   String valueOf(Integer integer);
}

-> 이처럼 좔상 λ©”μ„œλ“œ ν•˜λ‚˜λ₯Ό κ°–λŠ” 것을 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌκ³  ν•œλ‹€. 

그리고 μ—¬κΈ°μ„œ @FunctionalInterface μ–΄λ…Έν…Œμ΄μ…˜μ€ ꡳ이 뢙이지 μ•Šμ•„λ„ λ˜μ§€λ§Œ 이 μΈν„°νŽ˜μ΄μŠ€κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것을 λ‚˜νƒ€λ‚΄κΈ°λ„ ν•˜λ©°, 없어도 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ μΈμ‹ν•˜κΈ°λŠ” ν•œλ‹€.  ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€ 검증과 μœ μ§€λ³΄μˆ˜λ₯Ό μœ„ν•΄μ„œ λΆ™μ—¬μ£ΌλŠ”κ²ƒμ΄ μ’‹λ‹€. 

 

그리고 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 1개의 좔상 λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€κ³  ν–ˆκΈ° λ•Œλ¬Έμ— default method λ„λŠ” static methodλŠ” μ—¬λŸ¬ 개 μ‘΄μž¬ν•΄λ„ λœλ‹€. 

좔상 λ©”μ„œλ“œκ°€ μ—¬λŸ¬κ°œλ©΄ μ–΄μ°¨ν”Ό μ—λŸ¬λ₯Ό ν†΅ν•΄μ„œ μ•Œλ €μ€€λ‹€. 

 

MyFunction lambdaMyfunction = (i) -> String.valueOf(i); // lambda
MyFunction myFunction = String::valueOf;

 

 

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ Functional Interface μ‚¬μš© 이유 

: ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” μžλ°”μ˜ λžŒλ‹€μ‹μ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 

즉, μžλ°”μ˜ λžŒλ‹€ ν‘œν˜„μ‹μ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. 

 

 

 

κΈ°λ³Έ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 

: μžλ°”μ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (java.util.functionνŒ¨ν‚€μ§€) 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€  Descripter Method
Predicate T -> boolean boolean test(T t)
Consumer T -> void  void accept (T t)
Supplier () -> T T get () 
Function<T,R> T -> R R apply(T t) 

 

 

Supplier<T> 

: supplierλŠ” 인자λ₯Ό 받지 μ•Šκ³  T νƒ€μž… 객체λ₯Ό λ¦¬ν„΄ν•œλ‹€. 

Supplier<Person> personSupplier = Person::new;

 

 

Consumer<T>

: cosumerλŠ” T νƒ€μž…μ˜ 객체λ₯Ό 인자둜 λ°›κ³ , 리턴값은 μ—†λ‹€. 

Consumer<Integer> integerConsumer =  System.out::println;

 

 

 

Function<T,R>

: Function은 T νƒ€μž…μ„ 인자둜 λ°›κ³ , R νƒ€μž…μ˜ 객체λ₯Ό λ¦¬ν„΄ν•œλ‹€. 

Function<Integer, String> intToString = Objects::toString;

 

 

Predicate<T>

: PredicateλŠ” T νƒ€μž…μ„ 인자둜 λ°›κ³  결과둜 boolean νƒ€μž…μ„ λ¦¬ν„΄ν•œλ‹€. 

Predicate<Integer> integerPredicate;

 

 

 

πŸ’Œ μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” μ΅ν˜€ λ‘λŠ” 것이 μ’‹λ‹€. 

κ·Έλž˜μ•Ό μžλ°”μ—μ„œ μ œκ³΅ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ•Œκ³ , ν•„μš”ν•œ 것은 λ§Œλ“€ 수 있기 λ•Œλ¬Έμ΄λ‹€. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90