Search

λžŒλ‹€μ‹

λžŒλ‹€μ‹

읡λͺ… ν•¨μˆ˜λ₯Ό (λ§€κ°œλ³€μˆ˜) -> { μ‹€ν–‰λ¬Έ } ν˜•νƒœλ‘œ μ •μ˜ν•œ 방식
β€’
μˆ˜ν•™μ˜ ν•¨μˆ˜
β€’
μˆ˜ν•™μ˜ λžŒλ‹€μ‹
β€’
λ©”μ†Œλ“œ
β€’
λžŒλ‹€μ‹
β—¦
λžŒλ‹€μ‹ ν˜•νƒœ
β—¦
λžŒλ‹€μ‹ λ¬Έλ²•κ·œμΉ™
β—¦
λžŒλ‹€μ‹ μ‚¬μš©

μˆ˜ν•™μ˜ ν•¨μˆ˜

ν•œ μ§‘ν•©μ˜ 각 μ›μ†Œλ₯Ό λ‹€λ₯Έ μ§‘ν•©μ˜ μ›μ†Œμ™€ λŒ€μ‘μ‹œν‚€λŠ” κ·œμΉ™
f(x, y) = x + y
Java
볡사

μˆ˜ν•™μ˜ λžŒλ‹€μ‹

ν•¨μˆ˜μ˜ μ •μ˜λ₯Ό κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•œ 기법
(x, y) -> x + y
Java
볡사

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

클래슀둜 객체λ₯Ό μ •μ˜ν•˜μ—¬ 객체 κ°„μ˜ μƒν˜Έ μž‘μš©μ„ ν†΅ν•œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λŠ” νŒ¨λŸ¬λ‹€μž„
μΊ‘μŠν™”, 상속, λ‹€ν˜•μ„±, 좔상화λ₯Ό 핡심 μ›μΉ™μœΌλ‘œ ν•΄μ„œ ν˜„μ‹€ μ„Έκ³„μ˜ λŒ€μƒμ„ μ†Œν”„νŠΈμ›¨μ–΄μ˜ 객체둜 직관적이고 μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ μž…λ‹ˆλ‹€.

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

ν•¨μˆ˜λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λŠ” 방식
β€’
μž‘μ€ ν•¨μˆ˜λ“€μ„ μ—¬λŸ¬ 개 μ‘°ν•©ν•˜μ—¬ λ³΅μž‘ν•œ λ™μž‘μ„ κ΅¬ν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ° ν•œλ‹€.
β€’
데이터λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 값을 μƒμ„±ν•˜μ—¬ μ²˜λ¦¬ν•œλ‹€.
β€’
μž…λ ₯에 λŒ€ν•΄μ„œ μ²˜λ¦¬ν•˜κ³  같은 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” 것이 μ£Ό λͺ©μ μ΄ λ˜λŠ” ν”„λ‘œκ·Έλž˜λ°μ΄λ‹€.

λ©”μ†Œλ“œ

λ©”μ†Œλ“œλŠ” 클래슀 λ‚΄λΆ€μ˜ μ •μ˜ν•œ ν•¨μˆ˜
객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ— κΈ°λ°˜ν•œ κ°œλ…

λ©”μ†Œλ“œ ν˜•νƒœ

μ ‘κ·Όμ§€μ •μž λ°˜ν™˜νƒ€μž… λ©”μ†Œλ“œλͺ…( λ§€κ°œλ³€μˆ˜ ) { }
Plain Text
볡사

λžŒλ‹€μ‹ (Lambda Expression)

μˆ˜ν•™μ˜ λžŒλ‹€μ‹ κ°œλ…μ„ μ°¨μš©ν•˜μ—¬, 읡λͺ… ν•¨μˆ˜λ₯Ό κ°„κ²°ν•˜κ²Œ μ •μ˜ν•˜λŠ” 기법
ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— κΈ°λ°˜ν•œ κ°œλ…
μžλ°”λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° 언어이기 λ•Œλ¬Έμ—, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 방식을 μ§μ ‘μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 방식을 λ³„λ„μ˜ λ°©λ²•μœΌλ‘œ μ§€μ›ν•©λ‹ˆλ‹€.
java.util.function νŒ¨ν‚€μ§€λ₯Ό ν†΅ν•΄μ„œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•©λ‹ˆλ‹€.
β€’
ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€
β€’
λžŒλ‹€μ‹
μžλ°”μ—μ„œλŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€, λžŒλ‹€μ‹μ„ μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

λžŒλ‹€μ‹ ν˜•νƒœ

β€’
κΈ°λ³Έ ν˜•νƒœ
( λ§€κ°œλ³€μˆ˜1, λ§€κ°œλ³€μˆ˜2 ) -> { μ‹€ν–‰λ¬Έ }
Java
볡사
β€’
λ§€κ°œλ³€μˆ˜κ°€ 1개인 경우, ( ) μƒλž΅ κ°€λŠ₯
λ§€κ°œλ³€μˆ˜ -> { μ‹€ν–‰λ¬Έ }
Java
볡사
β€’
싀행문이 ν•œ λ¬Έμž₯인 경우, { } μƒλž΅ κ°€λŠ₯
( λ§€κ°œλ³€μˆ˜1, λ§€κ°œλ³€μˆ˜2 ) -> μ‹€ν–‰λ¬Έ
Java
볡사
β€’
μ—¬λŸ¬ λ¬Έμž₯ μž‘μ„± μ‹œ, λ°˜ν™˜ 값이 있으면 return ν•„μˆ˜
( λ§€κ°œλ³€μˆ˜1, λ§€κ°œλ³€μˆ˜2 ) -> { μ‹€ν–‰λ¬Έ1 return κ²°κ³Όκ°’; }
Java
볡사

λ©”μ†Œλ“œ μ°Έμ‘°

:: 기호λ₯Ό μ‚¬μš©ν•˜μ—¬ λžŒλ‹€μ‹μ„ λ”μš± κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•˜λŠ” 기법
ν΄λž˜μŠ€μ΄λ¦„::λ©”μ†Œλ“œμ΄λ¦„
Java
볡사
import java.util.function.Function; public class Main { public static void main(String[] args) { // κΈ°λ³Έ λžŒλ‹€μ‹ Function<String, Integer> lambda = (str) -> { return Integer.parseInt(str); }; int result = lambda.apply( "100" ); System.out.println( result ); // 100 (int) // λ©”μ†Œλ“œ μ°Έμ‘° Function<String, Integer> methodRef = Integer::parseInt; int result2 = methodRef .apply( "200" ); System.out.println( result2 ); // 200 (int) } }
Java
볡사

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

객체λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” λžŒλ‹€μ‹ λŒ€μ‹  클래슀::new ν˜•νƒœλ‘œ μƒμ„±μžλ₯Ό μ°Έμ‘°ν•˜λŠ” 방법
import java.util.function.Supplier; public class Main { public static void main(String[] args) { // κΈ°λ³Έ λžŒλ‹€μ‹ // Supplier<Person> lambda = () -> { return new Person(); }; Supplier<Person> lambda = () -> new Person(); Person p1 = lambda.get(); // λžŒλ‹€μ‹μ„ ν†΅ν•œ 객체 생성 System.out.println( p1.getName() ); // μƒμ„±μž μ°Έμ‘° Supplier<Person> constructorRef = Person::new; Person p2 = constructorRef.get(); // μƒμ„±μž μ°Έμ‘°λ₯Ό ν†΅ν•œ 객체 생성 System.out.println( p2.getName() ); } }
Java
볡사
import java.util.function.Function; public class Main { public static void main(String[] args) { // κΈ°λ³Έ λžŒλ‹€μ‹ // Function<String, Person> lambda = (name) -> { return new Person("aloha"); }; Function<String, Person> lambda = (name) -> new Person(name); Person p1 = lambda.apply("aloha"); // λžŒλ‹€μ‹μ„ ν†΅ν•œ 객체 생성 System.out.println( p1.getName() ); // μƒμ„±μž μ°Έμ‘° Function<String, Person> constructorRef = Person::new; Person p2 = constructorRef.apply("aloha"); // μƒμ„±μž μ°Έμ‘°λ₯Ό ν†΅ν•œ 객체 생성 System.out.println( p2.getName() ); } }
Java
볡사

λžŒλ‹€μ‹ 문법 κ·œμΉ™

단일 νŒŒλΌλ―Έν„°λ₯Ό κ°€μ§€λŠ” 경우, ( ) κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
두 개 μ΄μƒμ˜ νŒŒλΌλ―Έν„°λ₯Ό κ°€μ§€λŠ” 경우, κ΄„ν˜Έλ₯Ό λ°˜λ“œμ‹œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
λžŒλ‹€μ‹μ΄ 단일 ν‘œν˜„μ‹λ§Œμ„ ν¬ν•¨ν•˜λŠ” 경우, { } μ€‘κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
{ } μ€‘κ΄„ν˜Έ μƒλž΅ μ‹œ, return 은 λ°˜λ“œμ‹œ μƒλž΅ν•΄μ•Όν•©λ‹ˆλ‹€.

λžŒλ‹€μ‹ μ‚¬μš©

1.
ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ •μ˜
a.
좔상 λ©”μ†Œλ“œκ°€ 1개인 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜
2.
λžŒλ‹€μ‹ 읡λͺ…ν•¨μˆ˜ μ •μ˜ν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€μ— μ„ μ–Έ
3.
λžŒλ‹€μ‹ ν•¨μˆ˜ 호좜
@FunctionalInterface // μ»΄νŒŒμΌλŸ¬μ— ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μž„μ„ λͺ…μ‹œμ μœΌλ‘œ μ•Œλ €μ€€λ‹€. interface FuncInterface { // * @FunctionalInterface λ₯Ό μ§€μ •ν•˜λ©΄, μΆ”μƒλ©”μ†Œλ“œλ₯Ό 2κ°œμ΄μƒ μ •μ˜ν•˜λ©΄ μ—λŸ¬λ₯Ό λ°œμƒν•˜κ²Œ ν•œλ‹€. void method(); // void method2(); * ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ”, 좔상 λ©”μ†Œλ“œ 1개만 μ •μ˜ν•΄μ•Όν•œλ‹€. } public class LambdaFormat { public static void main(String[] args) { // λ§€κ°œλ³€μˆ˜, λ°˜ν™˜νƒ€μž… μ—†λŠ” λžŒλ‹€μ‹ // () -> { System.out.println("λžŒλ‹€μ‹"); } // () -> System.out.println("λžŒλ‹€μ‹"); * ν•œ λ¬Έμž₯이면 {}μ€‘κ΄„ν˜Έ μƒλž΅κ°€λŠ₯ FuncInterface fi = () -> System.out.println("μžλ°”λžŒλ‹€μ‹"); fi.method(); } }
Java
볡사

μžλ°” ν‘œμ€€ 라이브러리의 μ£Όμš” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

μΈν„°νŽ˜μ΄μŠ€
λ©”μ†Œλ“œ
μ„€λͺ…
Function<T, R>
R apply(T t)
ν•˜λ‚˜μ˜ 인자λ₯Ό λ°›μ•„ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
Consumer<T>
void accept(T t)
ν•˜λ‚˜μ˜ 인자λ₯Ό λ°›μ•„ μ²˜λ¦¬ν•˜μ§€λ§Œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
Predicate<T>
boolean test(T t)
ν•˜λ‚˜μ˜ 인자λ₯Ό λ°›μ•„ boolean 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
Supplier<T>
T get()
μΈμžκ°€ μ—†κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
BinaryOperator<T>
T apply(T t1, T t2)
두 개의 λ™μΌν•œ νƒ€μž… 인자λ₯Ό λ°›μ•„ λ™μΌν•œ νƒ€μž…μ˜ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
UnaryOperator<T>
T apply(T t)
ν•˜λ‚˜μ˜ 인자λ₯Ό λ°›μ•„ 같은 νƒ€μž…μ˜ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.