IT/development

[Java] Java Lambda 정리(jdk 1.8λΆ€ν„° μ‚¬μš© κ°€λŠ₯)

μ•Œ 수 μ—†λŠ” μ‚¬μš©μž 2022. 11. 23.

λͺ©μ°¨

    image source:https://unsplash.com/s/photos/java

    μ—°μ°¨λŠ” μŒ“μ΄λŠ”λ° κ³΅λΆ€λŠ” 끝이 μ—†κ³  아직 λͺ¨λ₯΄λŠ”κ²Œ λ„ˆλ¬΄ λ§Žλ‹€.

    κ·Έλž˜μ„œ λ…Έμ‡ ν•΄μ„œ 코딩을 λͺ»ν•˜κΈ° μ „κΉŒμ§€λŠ” κΎΈμ€€νžˆ λΆ€μ‘±ν•œ 뢀뢄을 κ³΅λΆ€ν•΄μ„œ λ©”κΏ€ 생각이닀.

    Java Lambda 정리(java 1.8 이상뢀터 κ°€λŠ₯)

    Java의 Lambda에 λŒ€ν•΄μ„œ κ³΅λΆ€ν•œ λ’€ 이λ₯Ό 기둝해 보겠닀.πŸ˜ƒ

    java의 λžŒλ‹€μ‹μ€ 읡λͺ…객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν‘œν˜„μ‹μž„(예제λ₯Ό λ³΄λ©΄μ„œ μ΄ν•΄ν•˜λŠ”κ²Œ μ—­μ‹œ λΉ λ₯΄λ‹€.)


    image source:https://ko.wikipedia.org/wiki/%CE%9B

    λžŒλ‹€ν•¨μˆ˜λž€?πŸ™„

    더보기

    λžŒλ‹€ν•¨μˆ˜μ˜ κ°œλ…μ€ λ‚˜λ¬΄μœ„ν‚€λ₯Ό 보면 μ•„λž˜μ²˜λŸΌ λ‚˜μ™€μžˆλ‹€.

    λžŒλ‹€μ‹, λ˜λŠ” λžŒλ‹€ ν•¨μˆ˜λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‚¬μš©λ˜λŠ” κ°œλ…μœΌλ‘œ μ΅λͺ… ν•¨μˆ˜(匿名函數, Anonymous functions)λ₯Ό μ§€μΉ­ν•˜λŠ” μš©μ–΄μ΄λ‹€. 

    읡λͺ…ν•¨μˆ˜λŠ” 말 κ·ΈλŒ€λ‘œ 이름이 μ—†λŠ” ν•¨μˆ˜μ΄λ‹€.

    읡λͺ…ν•¨μˆ˜λ“€μ€ κ³΅ν†΅μœΌλ‘œ 일급객체(First Class citizen)λΌλŠ” νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλ‹€.

    μ΄λŠ” λ‹€λ₯Έ 객체듀에 일반적으둜 적용 κ°€λŠ₯ν•œ 연산을 λͺ¨λ‘ μ§€μ›ν•˜λŠ” 객체λ₯Ό 가리킀고 보톡 ν•¨μˆ˜μ— 인자둜 λ„˜κΈ°κΈ°, μˆ˜μ •ν•˜κΈ°, λ³€μˆ˜μ— λŒ€μž…ν•˜κΈ°μ™€ 같은 연산을 지원할 λ•Œ 일급 객체라고 ν•œλ‹€κ³  μœ„ν‚€λ°±κ³Όμ— λ‚˜μ™€μžˆλ‹€.

    ν•¨μˆ˜λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  ν•¨μˆ˜μ²˜λŸΌ μ‚¬μš©ν•˜λŠ” 것(ν•¨μˆ˜λ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„)

    λžŒλ‹€μ˜ μž₯λ‹¨μ πŸ€”

    λžŒλ‹€μ˜ μž₯점

    1. μ½”λ“œμ˜ κ°„κ²°μ„± : λžŒλ‹€ μ‚¬μš© μ‹œ 뢈 ν•„μš”ν•œ λ°˜λ³΅λ¬Έμ„ 쀄이고 λ³΅μž‘ν•œ 식을 λ‹¨μˆœν•˜κ²Œ ν‘œν˜„ κ°€λŠ₯

    2. μ§€μ—°μ—°μ‚° μˆ˜ν–‰ : λžŒλ‹€λŠ” 지연연상을 μˆ˜ν–‰ ν•¨μœΌλ‘œμ¨ λΆˆν•„μš”ν•œ μ—°μ‚° μ΅œμ†Œν™” κ°€λŠ₯

    μ§€μ—°μ—°μ‚°μ΄λž€ 말 κ·ΈλŒ€λ‘œ λΆˆν•„μš”ν•œ 연산을 ν”Όν•˜λ €κ³  연산을 μ§€μ—°μ‹œν‚΄μ„ μ˜λ―Έν•œλ‹€.

    3. λ³‘λ ¬μ²˜λ¦¬ κ°€λŠ₯ : λ©€ν‹°μ“°λ ˆλ“œλ₯Ό ν™œμš©ν•˜μ—¬ λ³‘λ ¬μ²˜λ¦¬λ₯Ό μ‚¬μš©ν•  수 있음

    λ³‘λ ¬μ²˜λ¦¬λž€ μ‰¬μš΄ 예둜 ν•˜λ‚˜μ˜ 일(ν”„λ‘œκ·Έλž¨)을 μ—¬λŸ¬ λͺ…(ν”„λ‘œμ„Έμ„œ)μ΄μ„œ λ‚˜λˆ μ„œ ν•¨μœΌλ‘œ 처리 속도λ₯Ό μ˜¬λ¦¬λŠ” κ±Έ μ˜λ―Έν•œλ‹€.

    μš°λ¦¬λ‚˜λΌ μ†λ‹΄μœΌλ‘œ λ”°μ§€λ©΄ "λ°±μ§€μž₯도 λ§žλ“€λ©΄ λ‚«λ‹€"

    λžŒλ‹€μ˜ 단점

    1. λžŒλ‹€μ‹μ˜ 호좜이 κΉŒλ‹€λ‘­λ‹€.(문법을 λͺ¨λ₯΄λ©΄ 그럴 수 μžˆμ„ λ“―)

    2. λžŒλ‹€ stream μ‚¬μš© μ‹œ λ‹¨μˆœ 반볡문(for, while) μ‚¬μš© μ‹œ μ„±λŠ₯이 떨어짐

    3. λΆˆν•„μš”ν•˜κ²Œ λ‚¨μš© μ‹œ 였히렀 가독성을 λ–¨μ–΄ 뜨릴 수 있음

    4. λžŒλ‹€λ‘œ λ§Œλ“  ν•¨μˆ˜λŠ” μž¬μ‚¬μš© λΆˆκ°€

    5. 디버깅이 κΉŒλ‹€λ‘œμ›€

    μ—­μ‹œ μ΄λ‘ λ³΄λ‹€λŠ” μ½”λ“œλ₯Ό λ³΄λŠ”κ²Œ λ‚œ 더 이해가 λΉ λ₯Ό 것 κ°™λ‹€.

    λžŒλ‹€μ‹ μ½”λ“œπŸ˜Ž

    λžŒλ‹€μ‹ 이전 java 문법

    μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•΄ λ‹€ν˜•μ„±μ„ μ œκ³΅ν•˜κΈ° μœ„ν•΄μ„œ μΈν„°νŽ˜μ΄μŠ€(Goods)λ₯Ό λ§Œλ“€κ³  그것을 κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄ 클래슀(Computer)λ₯Ό λ§Œλ“  λ’€ μ‚¬μš© μ‹œ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜(com)에 μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄ 클래슀의 객체λ₯Ό μƒμ„±ν•΄μ„œ μ‚¬μš©ν•˜κ±°λ‚˜ μ•„λž˜μ²˜λŸΌ μ‹€ν–‰ν•˜λŠ” μͺ½μ—μ„œ 읡λͺ… 객체λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν–ˆμ—ˆμŒ

    일회용으둜 μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ μ•„λ‹ˆλΌ 만일 Goods κ΅¬ν˜„μ²΄κ°€ 자주 μ‚¬μš©λ˜μ–΄μ•Ό λ˜λŠ” κ²½μš°λŠ” μœ„μ²˜λŸΌ

    읡λͺ… 객체λ₯Ό 계속 μ‚¬μš© μ‹œ μ½”λ“œκ°€ 맀우 μ§€μ €λΆ„ν•΄μ§ˆ κ²ƒμž„

    λžŒλ‹€μ‹

    κ΅¬ν˜„μ²΄μ˜ 좜λ ₯문을 μ£Όμ„μ²˜λ¦¬ν•˜κ³  메인 λ©”μ†Œλ“œμ—μ„œ λžŒλ‹€μ‹μœΌλ‘œ λ°”λ‘œ 좜λ ₯문을 μ •μ˜ν–ˆμŒ

    핡심은 λ§€κ°œλ³€μˆ˜ + μ‹€ν–‰λ¬ΈμœΌλ‘œ ꡬ성됨(μ ‘κ·Όμž, λ°˜ν™˜ν˜• λͺ¨λ‘ μƒλž΅λ˜λŠ” κ΅¬μ‘°μž„)

    () -> {} ν˜•νƒœμ΄κ³  첫 κ΄„ν˜Έ()에 ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μž…λ ₯ν•˜λ©΄ 됨

    κ·Έ λ‹€μŒ ->λ₯Ό μž…λ ₯ ν›„ μ€‘κ΄„ν˜Έ{} μ•ˆμ— μˆ˜ν–‰ν•  μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ 됨

    Ob ob = new Ob(); μΈμŠ€ν„΄μŠ€ν™” ν•  ν•„μš” μ—†μŒ

    ν•¨μˆ˜λ₯Ό λ”°λ‘œ λ§Œλ“€μ§€ μ•Šκ³  (λ§€κ°œλ³€μˆ˜)λ₯Ό μ΄μš©ν•΄μ„œ -> {μˆ˜ν–‰μ½”λ“œ} 이걸 λ°”λ‘œ μ‹€ν–‰ν•œλ‹€κ³  μ΄ν•΄ν•˜λ©΄ 될 λ“―

    λžŒλ‹€μ‹ 예제🀑

    1. κΈ°λ³Έ μ‚¬μš©λ²•( (νƒ€μž… λ§€κ°œλ³€μˆ˜)-> {}; )

    λžŒλ‹€μ‹μ— ν•„μš”ν•œ 기호λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•œ 경우

    2. λ§€κ°œλ³€μˆ˜ νƒ€μž… μƒλž΅( (λ§€κ°œλ³€μˆ˜)-> {}; )

    λ§€κ°œλ³€μˆ˜κ°€ 1개 μ΄κ±°λ‚˜ 2개 μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ΄ λͺ¨λ‘ 같을 경우 νƒ€μž… μƒλž΅ κ°€λŠ₯

    λ§€κ°œλ³€μˆ˜ νƒ€μž… 같은 경우

    λ§€κ°œλ³€μˆ˜κ°€ 1개인 경우

    3. λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” 경우( ()-> {}; )

    λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” 경우 μ•„λž˜μ²˜λŸΌ μ½”λ“œ λͺΈν†΅λ§Œ κ΅¬ν˜„ν•˜λ©΄ λ˜λŠ”λ° 만일 return type이 μžˆλŠ” 경우 return ν•΄μ€˜μ•Ό ν•œλ‹€.

    4. μ€‘κ΄„ν˜Έ μƒλž΅( ()->; )

    μˆ˜ν–‰ν•  μ½”λ“œκ°€ 1개일 λ•ŒλŠ” μ€‘κ΄„ν˜Έ{}λ₯Ό μƒλž΅ν•  수 있음, 이 λ•Œ μ€‘μš”ν•œ 점은 return이 ν•„μš”ν•œ λ©”μ†Œλ“œμΈ 경우 return ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•΄μ•Ό 함

    μ˜ˆμ œμ— μ‚¬μš©λœ μΈν„°νŽ˜μ΄μŠ€λŠ” return type이 int이기에 return을 μƒλž΅ν•΄μ•Ό ν•œλ‹€.

    return 뢙일 경우 μ•„λž˜μ²˜λŸΌ μ—λŸ¬ λ°œμƒ

    5. μ†Œκ΄„ν˜Έ μ€‘κ΄„ν˜Έ μƒλž΅( λ§€κ°œλ³€μˆ˜ -> ; )

    λ§€κ°œλ³€μˆ˜κ°€ 1개이고 μˆ˜ν–‰ν•  μ½”λ“œλ„ 1개이면 μ•„λž˜μ²˜λŸΌ ()와 {} μƒλž΅ κ°€λŠ₯(λ©”μ†Œλ“œ return type이 voidμ—¬μ•Ό 함)

    ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€ 좔상 λ©”μ†Œλ“œμ˜ return type이 μžˆλŠ” κ²½μš°λŠ” {} μƒλž΅ λΆˆκ°€

    μœ„ μƒνƒœμ—μ„œ 좔상 λ©”μ†Œλ“œμ˜ return type을 int둜 λ³€κ²½ν•˜λ©΄ μ•„λž˜μ²˜λŸΌ μ—λŸ¬λ°œμƒ

    String νƒ€μž… λžŒλ‹€μ‹ 

    μ‚¬μš© 예제 μ½”λ“œ

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

    @FunctionalInterface
    public interface Caculator {
    	// return type void둜 λ°”κΏ¨λ‹€ int둜 λ°”κΏ¨λ‹€, λ§€κ°œλ³€μˆ˜ μΆ”κ°€ ν•˜λ©΄μ„œ ν…ŒμŠ€νŠΈ
    	public int cal(int num1);
    }

    λžŒλ‹€μ‹ μ½”λ“œ

    public class Test2 {
    	public static void main(String[] args) {
    		// λžŒλ‹€μ‹ λͺ¨λ“  기호 μ‚¬μš©
    		//Caculator cal = (int n1, int n2) -> {return n1 + n2;};
    		//System.out.println(cal.cal(1000, 20000));
    		// νƒ€μž… μƒλž΅(λ§€κ°œλ³€μˆ˜ 2개 νƒ€μž…μ΄ κ°™μŒ)
    		//Caculator cal2 = (n1, n2) -> {return n1+n2;};
    		//System.out.println(cal2.cal(10, 200));
    		// λ§€κ°œλ³€μˆ˜ μƒλž΅
    		//Caculator cal3 = () -> System.out.println("λ§€κ°œλ³€μˆ˜ μ—†μŒ");
    		//cal3.cal();
    		// μ€‘κ΄„ν˜Έ μƒλž΅(μˆ˜ν–‰μ½”λ“œ 1개)
    		//Caculator cal = (n1) -> n1 + 1000;
    		//System.out.println(cal.cal(1000000));
    		// μ†Œκ΄„ν˜Έ, μ€‘κ΄„ν˜Έ μƒλž΅(λ§€κ°œλ³€μˆ˜ 1개, μˆ˜ν–‰μ½”λ“œ 1개)
    		//Caculator cal = n1 -> System.out.println(n1);
    		//cal.cal(10000);
    		//Caculator cal = n1 -> n1 + 10000;
    		//cal.cal(10000);
    	}	
    }

     

    λžŒλ‹€ μ‚¬μš© μ‘°κ±΄πŸ€—

    λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€μ—λŠ” 쑰건이 있음, λ°”λ‘œ μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ†Œλ“œκ°€ 1개인 κ²½μš°μ–΄μ•Ό 함

    λžŒλ‹€μ‹μ€ 읡λͺ…ν•¨μˆ˜μ΄κΈ° λ•Œλ¬Έμ— λ©”μ†Œλ“œκ°€ μ—¬λŸ¬κ°œμΈ 경우 μ–΄λ–€ λ©”μ†Œλ“œλ₯Ό 읡λͺ…ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•œ 건지 μ•Œ 수 μ—†λ‹€.

    이λ₯Ό μœ„ν•œ μ—¬λŸ¬κ°€μ§€ κ·œμΉ™μ΄ μžˆμ§€λ§Œ 제일 λͺ…ν™•ν•œ 것은 @FunctionalInterface을 λΆ™μ—¬μ£ΌλŠ” 것이닀.

    μ•„λž˜μ²˜λŸΌ λžŒλ‹€μ‹ ν‘œν˜„μ— μ‚¬μš©λ  μΈν„°νŽ˜μ΄μŠ€μ— @FunctionalInterface을 뢙이면 μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ μ—λŸ¬λ₯Ό μž‘μ•„μ€Œ

    ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— μ•„λž˜μ²˜λŸΌ 좔상 λ©”μ†Œλ“œλ₯Ό 1개 더 λ§Œλ“€ 경우 μ—λŸ¬ λ°œμƒ μ‹œν‚΄

    λžŒλ‹€μ‹ μ‚¬μš© μΈν„°νŽ˜μ΄μŠ€μ— @FunctionalInterface을 λΆ™μ΄λŠ” μŠ΅κ΄€μ„ κΈ°λ₯Ό 것

    μ°Έμ‘° : νžˆμ§„μ“°μ˜ μ„œλ²„μ‚¬μ΄λ“œ 기뢈 λΈ”λ‘œκ·Έ, 2018.09.28, https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95

     

    [JAVA] λžŒλ‹€μ‹(Lambda)의 κ°œλ… 및 μ‚¬μš©λ²•

    λžŒλ‹€ν•¨μˆ˜λž€? λžŒλ‹€ ν•¨μˆ˜λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‚¬μš©λ˜λŠ” κ°œλ…μœΌλ‘œ 읡λͺ… ν•¨μˆ˜(Anonymous functions)λ₯Ό μ§€μΉ­ν•˜λŠ” μš©μ–΄μž…λ‹ˆλ‹€. ν˜„μž¬ μ‚¬μš©λ˜κ³  μžˆλŠ” λžŒλ‹€μ˜ 근간은 μˆ˜ν•™κ³Ό 기초 컴퓨터과학 λΆ„μ•Όμ—μ„œμ˜ 

    khj93.tistory.com

     

    배움이 즐거운 개발자, 2019,04,09, https://galid1.tistory.com/509

     

    Java - Lambda Expression(λžŒλ‹€μ‹)μ΄λž€?

    λžŒλ‹€μ‹μ΄λž€ λžŒλ‹€μ‹ μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”. κ·Έ λ™μ•ˆ javaλ₯Ό μ΄μš©ν•˜λ‹€κ°€ lambda식 μ΄λž€ 것을 처음 λ³΄μ•˜μ„λ•ŒλŠ” 맀우 μƒμ†Œν•˜κ³  거뢀감이 λŠκ»΄μ‘ŒμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, java8μ—μ„œ μΆ”κ°€λœ streamκ³Ό κ°™μ€κ³³μ—μ„œ ν•œλ‘λ²ˆ

    galid1.tistory.com

    ν‹€λ¦° 점 μžˆμ„ 경우 λŒ“κΈ€ 뢀탁 λ“œλ¦½λ‹ˆλ‹€.πŸ˜…

    λŒ“κΈ€