[Java] Lamda Function

2021. 6. 21. 13:37γ†κ°œλ… 정리 μž‘μ—…μ‹€/Java

728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘μž…λ‹ˆλ‹€!

μ˜€λŠ˜μ€ JDK 1.8λΆ€ν„° 지원이 λ˜λŠ” Lamda에 λŒ€ν•΄ 곡뢀 ν•΄ 보도둝 ν•  κ²ƒμ΄μ—μš”!

Spring Boot둜 Web Projectλ₯Ό ν•˜κ³  μžˆλŠ”λ°, Lamda와 Optional이 μ‚¬μš©λ˜κΈ°μ— 곡뢀λ₯Ό ν•΄ λ³΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

이것을 μ„€λͺ…ν•˜κΈ°μ— μ•ž 써 μš°λ¦¬λŠ” ν•¨μˆ˜ν˜• 언어에 λŒ€ν•΄μ„œ μ•Œ ν•„μš”κ°€ μžˆλŠ” κ²ƒμ΄μ—μš”.

μžλ°”λŠ” μš°λ¦¬κ°€ μ•Œ λ“― OOPμ–Έμ–΄(객체 지ν–₯ μ–Έμ–΄)인데, JDK 1.8 λΆ€ν„° ν•¨μˆ˜ν˜• 언어에 κΈ°λŠ₯을 μΆ”κ°€ν•œ κ²ƒμ΄μ—μš”.

사싀 ν•¨μˆ˜ν˜• μ–Έμ–΄ κΈ°λŠ₯을 κ°€μ‘Œλ‹€λΌκ³  ν•˜κΈ°μ—λŠ” μ•½ν•˜κ³ , κ·Έ κΈ°λŠ₯을 ν¬ν•¨ν–ˆλ‹€λΌκ³  λ³΄λŠ” 것이 λ§žμŠ΅λ‹ˆλ‹€!

 

파이썬, JavaScript μ—­μ‹œ OOPμ΄μ§€λ§Œ, ν•¨μˆ˜ν˜• μ–Έμ–΄ κΈ°λŠ₯을 가지고 μžˆλ‹΅λ‹ˆλ‹€!

 

그럼 μ‹œμž‘ ν•΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€!


 

πŸ“Œ λžŒλ‹€μ‹(Lambda Expression)


     πŸ“ ν•¨μˆ˜(Method)λ₯Ό κ°„λ‹¨ν•œ '식(Expression)'으둜 ν‘œν˜„ν•˜λŠ” 방법

int max ( int a, int b ) {
	return a > b ? a : b;
}

 

예λ₯Ό λ“€μ–΄ μœ„μ™€ 같은 식이 μžˆμ„ λ•Œ, 이것을 κ°„λ‹¨ν•˜κ²Œ ν‘œν˜„ν•˜κ²Œ 되면 μ–΄λ–»κ²Œ ν•  수 μžˆμ„κΉŒμš”?

 

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

μœ„μ™€ 같이 ν‘œν˜„μ„ ν•  수 μžˆλŠ”λ°, μ΄λ ‡κ²Œ ν‘œκΈ°ν•˜λŠ” 방법이 Labda식 μ΄λΌλŠ” κ²ƒμ΄μ—μš”.

 

 

     πŸ“ 읡λͺ… ν•¨μˆ˜(이름이 μ—†λŠ” ν•¨μˆ˜, Anonymous Function)

πŸ‘‰ 이름이 μžˆλŠ” ν•¨μˆ˜λŠ”?

int max ( int a, int b ) {	// 'max'λΌλŠ” 이름 쑴재
	return a > b ? a : b;
}

 

πŸ‘‰ 이름이 μ—†λŠ” ν•¨μˆ˜λŠ”?

(int a, int b) -> {		// λ°˜ν™˜ μžλ£Œν˜• νƒ€μž…κ³Ό 이름이 μƒλž΅
	return a > b ? a : b;
}

 

즉, λžŒλ‹€μ‹μœΌλ‘œ λ³€κ²½ν•  λ•Œ 방법은 λ¨Όμ € λ°˜ν™˜ μžλ£Œν˜• νƒ€μž…κ³Ό 이름을 μ—†μ•±λ‹ˆλ‹€. 그런 λ’€ λ§€κ°œλ³€μˆ˜μ™€ μ€‘κ΄„ν˜Έμ‚¬μ΄μ— '->' 이런 ν‘œμ‹œλ₯Ό λ„£μ–΄μ£Όλ©΄ λœλ‹΅λ‹ˆλ‹€!

 

μ΄λ ‡κ²Œ 이름이 사라지기 λ•Œλ¬Έμ— 읡λͺ…ν•¨μˆ˜λΌκ³  λΆ€λ₯΄λŠ” κ²ƒμ΄μ—μš”.

 

     πŸ“ ν•¨μˆ˜(Function)와 Method(λ©”μ„œλ“œ)의 차이

πŸ‘‰ κ·Όλ³Έμ μœΌλ‘œλŠ” λ™μΌν•˜λ‚˜, ν•¨μˆ˜λŠ” 일반적 μš©μ–΄μ΄κ³ , λ©”μ„œλ“œλŠ” 객체 지ν–₯ κ°œλ… μš©μ–΄μΈ κ²ƒμ΄μ—μš”.

πŸ‘‰ ν•¨μˆ˜λŠ” Class에 λ…λ¦½μ μ΄λ‚˜, λ©”μ„œλ“œλŠ” Class에 μ’…μ†μ μ΄λžλ‹ˆλ‹€.

     μ¦‰, λ©”μ„œλ“œλŠ” 무쑰건 Classμ•ˆμ— μžˆμ–΄μ•Ό ν•˜λŠ” κ²ƒμ΄μ—μš”.

 

 

     πŸ“ λžŒλ‹€μ‹ μž‘μ„±ν•˜κΈ°

πŸ‘‰ λ©”μ„œλ“œμ˜ 이름과 λ°˜ν™˜ μžλ£Œν˜• νƒ€μž…μ„ μ œκ±°ν•˜κ³ , ' -> 'λ₯Ό μ€‘κ΄„ν˜Έ '{}' μ•žμ— μΆ”κ°€

πŸ‘‰ λ°˜ν™˜κ°’μ΄ μžˆλŠ” 경우, μ‹μ΄λ‚˜ κ°’λ§Œ 적고, returnλ¬Έ μƒλž΅ ( 끝에 ' ; ' μƒλž΅)

πŸ’¬ μƒλž΅ ν•˜κΈ° μ „

(int a, b) -> {
	return a > b ? a : b
}

 

πŸ’¬ μƒλž΅ κ²°κ³Ό

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

 

πŸ‘‰ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄ μΆ”λ‘  κ°€λŠ₯ν•˜λ©΄ μƒλž΅κ°€λŠ₯ (λŒ€λΆ€λΆ„ μƒλž΅ κ°€λŠ₯)

πŸ’¬ μƒλž΅ ν•˜κΈ° μ „

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

 

πŸ’¬ μƒλž΅ κ²°κ³Ό

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

 

 

 

     πŸ“ λžŒλ‹€μ‹ μž‘μ„±ν•˜κΈ° - μ£Όμ˜μ‚¬ν•­

πŸ‘‰ λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜μΈ 경우, μ†Œκ΄„ν˜Έ ' () ' μƒλž΅ κ°€λŠ₯ (μžλ£Œν˜• νƒ€μž…μ΄ 없을 λ•Œλ§Œ!)

πŸ’¬ μƒλž΅ ν•˜κΈ° μ „

(a) - > a * a
(int a) -> a * a

 

πŸ’¬ μƒλž΅ κ²°κ³Ό

a -> a * a 	// 정상

int a -> a * a 	// Error (μžλ£Œν˜• νƒ€μž…μ΄ μžˆμ„ 경우 μ†Œκ΄„ν˜Έ μƒλž΅ λΆˆκ°€)

 

πŸ‘‰ 블둝 μ•ˆμ˜ λ¬Έμž₯이 ν•˜λ‚˜μΌ λ•ŒλŠ” μ€‘κ΄„ν˜Έ ' {} ' μƒλž΅ κ°€λŠ₯ ( 끝에 ' ; ' μƒλž΅)

πŸ’¬ μƒλž΅ ν•˜κΈ° μ „

(int i) -> {
	System.out.println(i);
}

 

πŸ’¬ μƒλž΅ κ²°κ³Ό

(int i) -> System.out.println(i)

 

 

πŸ‘‰ ν•˜λ‚˜λΏμΈ λ¬Έμž₯이 return문이라면 μ€‘κ΄„ν˜Έ ' {} ' μƒλž΅ λΆˆκ°€

(int a, int b) -> {
	return a > b ? a : b;
}

// μœ„μ˜ λ‚΄μš©μ„ μ•„λž˜μ²˜λŸΌ μƒλž΅ν•  수 μ—†λ‹€.

(int a, int b) -> return a > b ? a : b		// Error

 

 

     πŸ“ λžŒλ‹€μ‹μ˜ 예

Method Lamda

 

 

 

     πŸ“ μžλ°”μ—μ„œμ˜ λžŒλ‹€μ‹μ€ 읡λͺ… ν•¨μˆ˜κ°€ μ•„λ‹Œ 읡λͺ… 객체이닀!

πŸ‘‰ μžλ°”μ—μ„œμ˜ λžŒλ‹€μ‹μ€ 읡λͺ… ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ 읡λͺ… 객체.

     μ™œλƒν•˜λ©΄ μžλ°”μ—μ„œλŠ” Methodκ°€ Class 밖에 μ‘΄μž¬ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄μ—μš”.

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

// μœ„μ˜ μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

new Object() {
	int max(int a, int b) {
    return a > b ? a : b;
}

μœ„μ˜ μ½”λ“œλŠ” 읡λͺ… Class의 읡λͺ… 객체인 κ²ƒμ΄μ—μš”. 이것은 객체의 μ„ μ–Έκ³Ό 생성을 λ™μ‹œμ— ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ”°λΌμ„œ λžŒλ‹€μ‹μ€ 객체인 κ²ƒμ΄μ—μš”.

 

πŸ‘‰ λžŒλ‹€μ‹ (읡λͺ… 객체)을 닀루기 μœ„ν•œ μ°Έμ‘° λ³€μˆ˜κ°€ ν•„μš”. μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ€?

Object obj = new Object() {
	int max ( int a, int b ) {
    return a > b ? a : b;
    }
};


// μœ„μ˜ μ½”λ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ λ³€ν™˜ν•˜λ©΄?

Type obj = (a, b) -> a > b ? a : b;		// 이것은 μ–΄λ–€ μžλ£Œν˜• νƒ€μž…?

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

이것은 객체인 κ²ƒμ΄μ—μš”.

κ·Έλ ‡λ‹€λ©΄ μ°Έμ‘° λ³€μˆ˜ obj의 μžλ£Œν˜• νƒ€μž…μ„ λ¬΄μ—‡μœΌλ‘œ ν•΄μ•Ό λ κΉŒμš”? Object둜 ν•œλ‹€λ©΄ Errorκ°€ λ‚˜κ²Œ 될 κ²ƒμ΄μ—μš”.

int value = obj.max(3, 5);		// Error

μ™œ? μœ„μ˜ μ½”λ“œλŠ” Errorκ°€ λ‚˜κ²Œ λ˜λŠ” κ²ƒμΌκΉŒμš”? 그것은 λ°”λ‘œ Object Classμ—λŠ” maxλΌλŠ” Methodκ°€ μ—†κΈ° λ•Œλ¬ΈμΈ κ²ƒμ΄μ—μš”.

objλΌλŠ” κ°μ²΄λŠ” maxλΌλŠ” Methodλ₯Ό 가지고 μžˆμ§€λ§Œ, Methodλ₯Ό μ‚¬μš©ν•  μˆ˜λŠ” μ—†λŠ” κ²ƒμ΄μ—μš”.

κ·Έ μ΄μœ λŠ” ObjectλΌλŠ” νšŒμ‚¬(리λͺ¨μ»¨)μ—λŠ” maxλΌλŠ” νŒ€(λ²„νŠΌ)이 μ—†κΈ° λ•Œλ¬ΈμΈ κ²ƒμ΄μ—μš”.

λ”°λΌμ„œ 객체가 maxλ₯Ό 가지고 μžˆμ–΄λ„ ν˜ΈμΆœμ„ ν•  수 μ—†λŠ” κ²ƒμ΄μ—μš”.

 

πŸ“ 예제 μ½”λ“œ

class lamda_ex {
	public static void main (Stringp[] args) {
 	
//    Object obj = (a, b) -> a > b ? a : b		// λžŒλ‹€μ‹ μž‘μ„± (읡λͺ… 객체)
// μœ„μ™€ 같이 ν•˜λ©΄ ν•¨μˆ˜ν˜•μœΌλ‘œ 닀루지 μ•ŠλŠ”λ‹€κ³  Error λ°œμƒ
// κ²°κ΅­ μœ„μ™€ μ•„λž˜ μ½”λ“œλŠ” κ°™λ‹€.

	  Object obj = new Object() {
    	int max ( int a, int b ) {
        return a > b ? a : b;
        }
      };
    
//    int value = obj.max(3, 5);					// Error (Objectμ—λŠ” maxλ₯Ό κ°–κ³  μžˆμ§€ μ•Šλ‹€)
// μœ„μ™€ 같을 λ•Œ ν˜•λ³€ν™˜μ„ ν•΄μ€˜μ•Ό ν•˜λŠ”λ°, 이런 경우 ν˜•λ³€ν™˜μ„ ν•  수 μ—†λ‹€.  

}

 

 

 


μ£Όλ‹ˆν•˜λž‘μ˜ 글이 λ§ˆμŒμ— λ“œμ…¨λ‚˜μš”? ꡬ독과 곡감! 그리고, λŒ“κΈ€μ€ μ£Όλ‹ˆν•˜λž‘μ—κ²Œ λ§Žμ€ 힘이 λ©λ‹ˆλ‹€!

728x90
λ°˜μ‘ν˜•