ν‹°μŠ€ν† λ¦¬ λ·°

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

: λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ '식(expression)'으둜 ν‘œν˜„ν•œ 것

: 읡λͺ…ν•¨μˆ˜λΌκ³ λ„ 함(λ§€μ„œλ“œμ˜ 이름X, λ°˜ν™˜κ°’X)

 

πŸ’πŸ»‍♀️ λžŒλ‹€μ‹μ˜ μž₯점

βœ”οΈ 클래슀λ₯Ό λ§Œλ“€κ³ , μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 과정을 μƒλž΅ν•˜κ³  λ©”μ„œλ“œ(ν•¨μˆ˜)λ₯Ό λ§Œλ“€ 수 있음!

βœ”οΈ λ©”μ„œλ“œλ₯Ό λ³€μˆ˜μ²˜λŸΌ λ‹€λ£° 수 있음

 

// κΈ°μ‘΄ λ©”μ„œλ“œ
int max(int a, int b) {
    return a > b ? a : b;
}
// λžŒλ‹€μ‹
(int a, int b) -> { return a > b ? a : b; }
(int a, int b) -> a > b ? a : b
(a, b) -> a > b ? a : b

βœ”οΈ λžŒλ‹€μ‹μ˜ λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μ˜ νƒ€μž…μ€ 좔둝이 κ°€λŠ₯ν•œ 경우 μƒλž΅O (λŒ€λΆ€λΆ„μ˜ 경우 μƒλž΅)

βœ”οΈ λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜λ©΄ (κ΄„ν˜Έ) μƒλž΅ κ°€λŠ₯

βœ”οΈ {κ΄„ν˜Έ} μ•ˆμ— λ¬Έμž₯이 ν•˜λ‚˜λ©΄ (κ΄„ν˜Έ} μƒλž΅ κ°€λŠ₯ (λ¬Έμž₯ 끝에 μ„Έλ―Έμ½œλ‘ (;)X)

 

 

πŸ“Œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

: λžŒλ‹€μ‹μ„ 닀루기 μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€

βœ”οΈ 였직 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ μ •μ˜ (λžŒλ‹€μ‹κ³Ό μΈν„°νŽ˜μ΄μŠ€λ₯Ό 1:1둜 μ—°κ²°ν•˜κΈ° μœ„ν•΄)

 

πŸ’πŸ»‍♀️ λžŒλ‹€μ‹μ„ μ™œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ 닀루죠?

πŸ’‘ λžŒλ‹€μ‹μ€ 사싀 λ©”μ„œλ“œμ™€ 같은 λ™λ“±ν•œ 것이 μ•„λ‹ˆλΌ 읡λͺ… 클래슀의 객체와 동등

 

πŸ–πŸ» 객체지ν–₯ β…‘μ—μ„œ 읡λͺ… 클래슀λ₯Ό λ°°μ› μŒ

https://uijin.tistory.com/80

 

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

πŸ“Œ 상속 : κΈ°μ‘΄ 클래슀λ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 것 : (+) μ½”λ“œ μž¬μ‚¬μš©μ„±↑, ν”„λ‘œκ·Έλž¨ 생산성↑, μœ μ§€λ³΄μˆ˜πŸ‘πŸ» : extends ν‚€μ›Œλ“œ μ‚¬μš© class Child extends Parent { ... } : μƒμ„±μžμ™€ μ΄ˆκΈ°ν™”

uijin.tistory.com

 μ¦‰,

(a, b) -> a > b ? a : b

❗ 이 λžŒλ‹€μ‹ μžμ²΄κ°€ 읡λͺ…ν΄λž˜μŠ€μ˜ μ„ μ–Έ + μΈμŠ€ν„΄μŠ€ν™” (일회용) → 이게 κ°€λŠ₯ν•œ μ΄μœ λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ 였직 1개의 μΆ”μƒλ©”μ„œλ“œλ₯Ό κ°€μ§€κ³  μžˆμ–΄μ„œ!

 

1️⃣ λ¨Όμ €, λžŒλ‹€μ‹μœΌλ‘œ μ„ μ–Έλœ 읡λͺ… 객체의  λ©”μ„œλ“œλ₯Ό μ–΄λ–»κ²Œ ν˜ΈμΆœν•  수 μžˆμ„κΉŒ?

    → 일반적으둜 객체의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ €λ©΄, 읡λͺ… 객체의 μ°Έμ‘°λ³€μˆ˜κ°€ ν•„μš”

νƒ€μž… f = (a, b) -> a > b ? a : b;

2️⃣ νƒ€μž…μ€ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

    → μ°Έμ‘° λ³€μˆ˜μ΄λ―€λ‘œ 클래슀 λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ κ°€λŠ₯!

    → 즉, λ‚˜μ˜ λžŒλ‹€μ‹κ³Ό μΌμΉ˜ν•˜λŠ” μ„ μ–ΈλΆ€λ₯Ό κ°€μ§„ μΆ”μƒλ©”μ„œλ“œλ₯Ό κ°€μ§€κ³  μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ ν•„μš”! (κ·Έλž˜μ•Ό νƒ€μž…μ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ ν•˜κ³ , ν•΄λ‹Ή 좔상 λ©”μ„œλ“œλ₯Ό λ‚˜μ˜ λžŒλ‹€μ‹μœΌλ‘œ κ΅¬ν˜„ν•œκ±Έλ‘œ μƒκ°ν•˜κ³  μ‚¬μš©ν•  수 μžˆμœΌλ‹ˆκΉŒ!) 

interface MyFunction {
    public abstract int max(int a, int b);
}
MyFunction f = (a, b) -> a > b ? a : b;
f.max(1, 2); // λ“œλ””μ–΄ λžŒλ‹€μ‹μ„ μ‹€μ œλ‘œ μ‚¬μš©γ…œγ…œ

    → κ·Έλž˜μ„œ λ“±μž₯ν•œ 것이 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (ex. μœ„μ˜ MyFunction μΈν„°νŽ˜μ΄μŠ€)

사싀, μœ„λŠ” λ‹€μŒκ³Ό κ°™μŒ 

MyFunction f = new MyFunction() { // MyFunction μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 읡λͺ… 클래슀
                    public int max(int a, int b) {
                        return a > b ? a : b;
                    }
                };

μ΄λ•Œ, MyFunction이 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ©΄ λžŒλ‹€μ‹μœΌλ‘œ λŒ€μ²΄κ°€ κ°€λŠ₯ β•λžŒλ‹€μ‹λ„ μ‹€μ œλ‘œλŠ” 읡λͺ… 객체이기 λ•Œλ¬Έβ•

❗ ν•˜λ‚˜μ˜ λ©”μ„œλ“œκ°€ μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•΄μ„œ λžŒλ‹€μ‹μ„ λ‹€λ£¨λŠ” 것은 기쑴의 μžλ°”μ˜ κ·œμΉ™λ“€μ„ μ–΄κΈ°μ§€ μ•ŠμœΌλ©΄μ„œλ„ μžμ—°μŠ€λŸ¬μ›€ :-)

 

βœ”οΈ λžŒλ‹€μ‹μ„ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•˜κΈ°

: ν•΄λ‹Ή λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ λ˜λŠ” λ°˜ν™˜κ°’μ΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ΄λ©΄ λžŒλ‹€μ‹ μ‚¬μš©κ°€λŠ₯!

void myMethod(MyFunction f) { ... }
myMethod(() -> System.out.println("MyFunction"));

λ˜λŠ” 

MyFunction f = () -> System.out.println("MyFunction"));
myMethod(f);

 

βœ”οΈ λžŒλ‹€μ‹μ˜ νƒ€μž…? ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…?

: ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ λžŒλ‹€μ‹μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 것일 뿐, λžŒλ‹€μ‹μ˜ νƒ€μž…μ΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ νƒ€μž…κ³Ό μΌμΉ˜ν•˜λŠ” 것은 μ•„λ‹˜! (λžŒλ‹€μ‹μ€ 읡λͺ… 객체이고 읡λͺ… κ°μ²΄λŠ” νƒ€μž…μ΄ μ—†μŒ! - μ •ν™•ν•˜κ²ŒλŠ” νƒ€μž…μ΄ μžˆμ§€λ§Œ μ»΄νŒŒμΌλŸ¬κ°€ μž„μ˜λ‘œ μ •ν•˜κΈ° λ•Œλ¬Έμ— μ•Œ 수 μ—†λŠ” 것) but λžŒλ‹€μ‹μ΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 κ΅¬ν˜„ν•˜μ§„ μ•Šμ•˜μ§€λ§Œ, κ·Έ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 객체와 μ™„μ „νžˆ λ™μΌν•˜κΈ° λ•Œλ¬Έμ— ν˜•λ³€ν™˜μ„ ν—ˆμš©!

MyFunction f = (MyFunction) (() -> System.out.println("MyFunction"))); // λͺ…μ‹œμ  ν˜•λ³€ν™˜ μƒλž΅ κ°€λŠ₯!

❗ λžŒλ‹€μ‹μ€ 였직 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œλ§Œ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ (Object도 X)

 

βœ”οΈ λžŒλ‹€μ‹λ„ λ‚΄λΆ€ ν΄λž˜μŠ€μ΄λ―€λ‘œ, λžŒλ‹€μ‹ 외뢀에 μ„ μ–Έλœ λ³€μˆ˜μ— μ ‘κ·Όν•˜λŠ” κ·œμΉ™μ΄ λ‚΄λΆ€ ν΄λž˜μŠ€μ™€ κ°™μŒ!

: λžŒλ‹€μ‹ λ‚΄μ—μ„œ μ°Έμ‘°ν•˜λŠ” μ§€μ—­λ³€μˆ˜λŠ” final이 λΆ™μ§€ μ•Šμ•˜μ–΄λ„ μƒμˆ˜λ‘œ κ°„μ£Ό (κ°’ λ³€κ²½X)

: μ™ΈλΆ€ μ§€μ—­λ³€μˆ˜μ™€ 같은 μ΄λ¦„μ˜ λžŒλ‹€μ‹ λ§€κ°œλ³€μˆ˜ ν—ˆμš©X

 

 

πŸ“Œ java.util.function νŒ¨ν‚€μ§€

https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html

 

Function (Java Platform SE 8 )

 

docs.oracle.com

: 자주 μ“°μ΄λŠ” ν˜•μ‹μ˜ λ©”μ„œλ“œλ₯Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ 미리 μ •μ˜ν•΄ 놓은 νŒ¨ν‚€μ§€

 

πŸ’πŸ»‍♀️ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒˆλ‘œ μ •μ˜ν•˜λŠ” 것보닀 어떀점이 μ’‹μ£ ?

βœ”οΈ λŒ€λΆ€λΆ„μ˜ λ©”μ„œλ“œλŠ” νƒ€μž…μ΄ λΉ„μŠ·ν•¨ (λ§€κ°œλ³€μˆ˜λŠ” 0 -2개, λ°˜ν™˜κ°’μ€ 0 - 1개)

βœ”οΈ μ§€λ„€λ¦­ λ©”μ„œλ“œλ‘œ μ •μ˜ν•˜λ©΄ λ§€κ°œλ³€μˆ˜λ‚˜ λ°˜ν™˜ νƒ€μž…μ΄ 달라도 문제X

βœ”οΈ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œ 이름이 톡일 → μž¬μ‚¬μš©μ„±πŸ‘πŸ» μœ μ§€λ³΄μˆ˜πŸ‘πŸ»

 

 

βœ”οΈ λ§€κ°œλ³€μˆ˜κ°€ 두 개인 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 

❕ 두 개 μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό κ°–λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ ν•„μš”ν•˜λ©΄ 직접 λ§Œλ“€μ–΄μ•Ό 함!

 

βœ”οΈ UnaryOperator와 BinaryOperator

 

        ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€             Descripter                 Method

UnaryOperator                    T -> T                   T applay(T t)

BinaryOperator                   (T, T) -> T            T applay(T t, T t)

 

: λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μ˜ νƒ€μž…μ΄ λͺ¨λ‘ μΌμΉ˜ν•œλ‹€λŠ” 점만 μ œμ™Έν•˜κ³ λŠ” Functionκ³Ό κ°™μŒ

 

βœ”οΈ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬

 

βœ”οΈ κΈ°λ³Έν˜•μ„ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

: λ§€κ°œλ³€μˆ˜ λ˜λŠ” λ°˜ν™˜κ°’μ˜ νƒ€μž…μ΄ κΈ°λ³Έν˜•(ex. int, double)을 μ‚¬μš©ν•˜μ‘ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

 

πŸ”— μ°Έκ³  링크

https://bcp0109.tistory.com/313

 

Java 8 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (Functional Interface)

Overview ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λž€ 1 개의 좔상 λ©”μ†Œλ“œλ₯Ό κ°–λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§ν•©λ‹ˆλ‹€. Java8 λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€λŠ” κΈ°λ³Έ κ΅¬ν˜„μ²΄λ₯Ό ν¬ν•¨ν•œ λ””ν΄νŠΈ λ©”μ„œλ“œ (default method) λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ 개의 λ””

bcp0109.tistory.com

 

πŸ’πŸ»‍♀️ ꡳ이 κΈ°λ³Έν˜•μ„ μ‚¬μš©ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ”°λ‘œ μ“°λŠ” μ΄μœ κ°€ μžˆλ‚˜μš”?

πŸ‘©πŸ»‍🏫 μ›λž˜ κΈ°λ³Έν˜• νƒ€μž…μ˜ 값을 μ²˜λ¦¬ν•  λ•Œ 래퍼 클래슀λ₯Ό μ‚¬μš©ν–ˆμ§€λ§Œ, 래퍼클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 λΉ„νš¨μœ¨μ μž„!

 

        ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€                  Descripter                    Method                                     μ„€λͺ…

DoubleToIntFunction                double -> int               int applyAsInt(double d)       AToBFunction은 μž…λ ₯이 Aνƒ€μž… 좜λ ₯이 Bνƒ€μž…

TonIntFunction<T>                   T -> int                        int applyAsInt(T value)         ToBFunction은 좜λ ₯이 Bνƒ€μž…μ΄λ‹€. μž…λ ₯은 μ§€λ„€λ¦­νƒ€μž…

IntFunction                                int -> T                        R apply(T t, U u)                   AFunction은 μž…λ ₯이 Aνƒ€μž…μ΄κ³  좜λ ₯은 μ§€λ„€λ¦­νƒ€μž…

ObjIntConsumer<T>                (T, int) -> void             void accept(T t, U u)            ObjAFunction은 μž…λ ₯이 T, Aνƒ€μž…μ΄κ³  좜λ ₯은 μ—†μŒ

 

❕ IntToIntFunction이 μ—†λŠ” μ΄μœ λŠ” IntUnaryOperatorκ°€ ν•΄λ‹Ή 역할을 ν•  수 있기 λ•Œλ¬Έ! Function<Integer, Integer>μ΄λ‚˜ IntFunction<Integer>보닀 더 νš¨μœ¨μ μž„!

 

 

πŸ“Œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ ν•©μ„±!

β–ͺ️ Function

default <V> Function<T, V> andThen(Function<? super P, ? extends V> after)

default <V> Function<V, R> compose(Function<? super V, ? extends T> before)

static <T> Function<T, V> identity()

Function<String, Integer> f = (s) -> Integer.parsrInt(s, 16);
Function<Integer, String> g = (i) -> Integer.toBinaryString(i);
Function<String, String> h = f.andThen(g); // h("FF")λŠ” g(f("FF"))

❕ identity()λŠ” x -> x인 항등식

 

β–ͺ️ Predicate

default Predicate<T>          and(Predicate<? super T> other)

default Predicate<T>         or(Predicate<? super T> other)

default Predicate<T>         negate()

static <T> Predicate<T>    isEqual(Object targetRef)

Predicate<Integer> p = i -> i < 100;
Predicate<Integer> q = i -> i < 200;
Predicate<Integer> r = i -> i%2 == 0;
Predicate<Integer> notP = p.negate(); // i >= 100

Predicate<Integer> all = notP.and(q.or(r)); // all.test(150) μ΄λŸ°μ‹μœΌλ‘œ μ‚¬μš© κ°€λŠ₯!

 

 

πŸ“Œ λ©”μ„œλ“œ μ°Έμ‘°

βœ”οΈ λžŒλ‹€μ‹μ΄ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œ ν˜ΈμΆœν•˜λŠ” 경우 λ©”μ„œλ“œ 참쑰둜 λžŒλ‹€μ‹μ„ κ°„λž΅νžˆ ν•  수 있음!

βœ”οΈ ν΄λž˜μŠ€μ΄λ¦„::λ©”μ„œλ“œμ΄λ¦„ or μ°Έμ‘°λ³€μˆ˜::λ©”μ„œλ“œμ΄λ¦„ ν˜•μ‹μœΌλ‘œ μ‚¬μš©!

(String s) -> Integer.parseInt(s); // κΈ°μ‘΄ λžŒλ‹€μ‹
Integer::parseInt // λ©”μ„œλ“œ μ°Έμ‘°
x -> obj.equals(x)
obj::equals // 이런 경우 μ°Έμ‘°λ³€μˆ˜::λ©”μ„œλ“œμ΄λ¦„ ν˜•μ‹μ„ 써야함!

βœ”οΈ μƒμ„±μžλ„ λ©”μ„œλ“œ 참쑰둜 λ³€ν™˜ κ°€λŠ₯

() -> new MyClass();
MyClass::new

x -> new int[x]
int[]::new

❕ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλΌλ©΄, λ§€κ°œλ³€μˆ˜μ˜ κ°―μˆ˜μ— 따라 μ•Œλ§žμ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©! ν•„μš”ν•˜λ‹€λ©΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒˆλ‘œ μ •μ˜!

 

'μ–Έμ–΄ > μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

λ‚ μ§œμ™€ μ‹œκ°„ & ν˜•μ‹ν™”  (0) 2023.08.13
슀트림(stream)  (0) 2023.08.06
μ“°λ ˆλ“œ  (0) 2023.07.30
μ• λ„ˆν…Œμ΄μ…˜  (0) 2023.07.20
μ—΄κ±°ν˜•  (0) 2023.07.17
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2025/05   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
κΈ€ 보관함