Lambda

λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ 식(Expression)으둜 ν‘œν˜„ν•œ κ²ƒμœΌλ‘œ, μžλ°”λŠ” 객체지ν–₯ μ–Έμ–΄μ΄μ§€λ§Œ λžŒλ‹€μ‹μ„ 톡해 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•μ„ λΆ€λΆ„μ μœΌλ‘œ μ§€μ›ν•œλ‹€.

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

λžŒλ‹€μ‹μ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” λ°©μ‹μœΌλ‘œ, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 단 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œμ„ κ°€μ§€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ˜λ―Έν•œλ‹€.

  • 쑰건

    • 였직 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ μ‘΄μž¬ν•΄μ•Ό 함

    • static λ©”μ„œλ“œλ‚˜ default λ©”μ„œλ“œλŠ” κ°œμˆ˜μ— μ œν•œ μ—†μŒ

    • java.lang.Object의 λ©”μ„œλ“œ(toString, equals λ“±)λ₯Ό μ˜€λ²„λΌμ΄λ”©ν•œ 좔상 λ©”μ„œλ“œλŠ” μΉ΄μš΄νŠΈμ—μ„œ μ œμ™Έ

  • @FunctionalInterface

    • μ»΄νŒŒμΌλŸ¬μ—κ²Œ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 쑰건을 μΆ©μ‘±ν•˜λŠ”μ§€ κ²€μ‚¬ν•˜λ„λ‘ μš”μ²­ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜

    • μœ μ§€λ³΄μˆ˜ κ³Όμ •μ—μ„œ 좔상 λ©”μ„œλ“œκ°€ μΆ”κ°€λ˜λŠ” μ‹€μˆ˜ λ°©μ§€


@FunctionalInterface
interface MyFunction {

    int max(int a, int b);
    // int min(int a, int b); // 주석 ν•΄μ œ μ‹œ 컴파일 μ—λŸ¬ λ°œμƒ
}

class Main {

    public static void main(String[] args) {
        // 1. 읡λͺ… 클래슀 μ‚¬μš©
        MyFunction f1 = new MyFunction() {
            public int max(int a, int b) {
                return a > b ? a : b;
            }
        };

        // 2. λžŒλ‹€μ‹ μ‚¬μš© (읡λͺ… 객체λ₯Ό λŒ€μ²΄)
        MyFunction f2 = (a, b) -> a > b ? a : b;
    }
}

읡λͺ… ν΄λž˜μŠ€μ™€μ˜ 차이점

λžŒλ‹€μ‹μ€ 읡λͺ… ν΄λž˜μŠ€μ™€ λΉ„μŠ·ν•΄ λ³΄μ΄μ§€λ§Œ μŠ€μ½”ν”„(Scope) 처리 λ°©μ‹μ—μ„œ 차이가 μžˆλ‹€.

  • 읡λͺ… 클래슀

    • μƒˆλ‘œμš΄ 클래슀 μŠ€μ½”ν”„λ₯Ό 생성함

    • λ‚΄λΆ€μ—μ„œ thisλ₯Ό ν˜ΈμΆœν•˜λ©΄ 읡λͺ… 클래슀 μžμ‹ μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킴

  • λžŒλ‹€μ‹

    • μƒˆλ‘œμš΄ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμŒ(run-time에 λ³„λ„μ˜ 클래슀 νŒŒμΌμ„ μƒμ„±ν•˜μ§€ μ•ŠμŒ)

    • λ‚΄λΆ€μ—μ„œ thisλ₯Ό ν˜ΈμΆœν•˜λ©΄ λžŒλ‹€μ‹μ„ 감싸고 μžˆλŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 가리킴

java.util.function νŒ¨ν‚€μ§€

μžλ°”μ—μ„œ 자주 μ‚¬μš©λ˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νŒ¨ν„΄μ„ 미리 μ •μ˜ν•΄ λ‘” νŒ¨ν‚€μ§€λ‘œ, λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μ˜ μœ λ¬΄μ— 따라 κ΅¬λΆ„λœλ‹€.

μΈν„°νŽ˜μ΄μŠ€
λ©”μ„œλ“œ
λ§€κ°œλ³€μˆ˜
λ°˜ν™˜κ°’
μ„€λͺ…

Runnable

void run()

X

X

μ‹€ν–‰λ§Œ ν•˜λŠ” 경우

Supplier<T>

T get()

X

O

값을 곡급(λ°˜ν™˜)만 ν•˜λŠ” 경우

Consumer<T>

void accept(T t)

O

X

값을 λ°›μ•„ μ†ŒλΉ„λ§Œ ν•˜λŠ” 경우

Function<T, R>

R apply(T t)

O

O

값을 λ°›μ•„ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” 경우

Predicate<T>

boolean test(T t)

O

boolean

쑰건식을 ν™•μΈν•˜μ—¬ μ°Έ/κ±°μ§“ λ°˜ν™˜

UnaryOperator<T>

T apply(T t)

O

O

단항 μ—°μ‚°(μž…λ ₯κ³Ό 좜λ ₯ νƒ€μž…μ΄ κ°™μŒ)

BinaryOperator<T>

T apply(T t1, T t2)

O, O

O

이항 μ—°μ‚°(μž…λ ₯ 2κ°œμ™€ 좜λ ₯ νƒ€μž…μ΄ κ°™μŒ)

λ©”μ„œλ“œ μ°Έμ‘°(Method Reference)

λžŒλ‹€μ‹μ΄ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œ ν˜ΈμΆœν•˜λŠ” 경우, 이λ₯Ό 더 κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλŠ” 문법이닀.

μ’…λ₯˜
λžŒλ‹€μ‹ μ˜ˆμ‹œ
λ©”μ„œλ“œ μ°Έμ‘°

정적(Static) λ©”μ„œλ“œ μ°Έμ‘°

(x) -> ClassName.method(x)

ClassName::method

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘°

(obj, x) -> obj.method(x)

ClassName::method

νŠΉμ • 객체 λ©”μ„œλ“œ μ°Έμ‘°

(x) -> obj.method(x)

obj::method

μƒμ„±μž μ°Έμ‘°

() -> new ClassName()

ClassName::new

λ°°μ—΄ μƒμ„±μž μ°Έμ‘°

(x) -> new int[x]

int[]::new

참고자료

Last updated

Was this helpful?