λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
개발/Java

[JAVA 8] λžŒλ‹€ ν‘œν˜„μ‹

by 1mj 2022. 1. 13.

λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)

읡λͺ… ν•¨μˆ˜(Anonymous Function)λ₯Ό λ‹¨μˆœν™”ν•˜μ—¬ κ°„λ‹¨ν•˜κ²Œ 쀄인 ν‘œν˜„μ‹μ΄λ‹€.

λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•˜κ³ , λ©€ν‹°μŠ€λ ˆλ“œλ₯Ό ν™œμš©ν•˜μ—¬ λ³‘λ ¬μ²˜λ¦¬λ₯Ό μˆ˜ν–‰ν•  수 있으며 지연연산을 μˆ˜ν–‰ν•˜μ—¬ λΆˆν•„μš”ν•œ 연산을 μ΅œμ†Œν™”ν•  수 μžˆλ‹€.

 

읡λͺ… ν•¨μˆ˜(Anonymous Function)

λ³€μˆ˜μ— ν•¨μˆ˜ λ¦¬ν„°λŸ΄ λ°©μ‹μœΌλ‘œ μ €μž₯ν•œ 이름 μ—†λŠ” ν•¨μˆ˜μ΄λ‹€.

λ³€μˆ˜μ— μ΄ˆκΈ°ν™”ν•œ 읡λͺ… ν•¨μˆ˜λŠ” 호좜 μ‹œ λ³€μˆ˜λͺ…을 ν•¨μˆ˜λͺ…μ²˜λŸΌ μ‚¬μš©ν•œλ‹€.

🧐 읡λͺ…ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 이유
μ„ μ–Έ ν•¨μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘λ˜λ©΄ λͺ¨λ‘ μ „μ—­μœΌλ‘œ μ΄ˆκΈ°ν™”λ˜λ©° λ©”λͺ¨λ¦¬λ₯Ό μž‘μ•„λ¨ΉλŠ”λ‹€.
μž¬μ‚¬μš©μ΄ ν•„μš”ν•˜μ§€ μ•Šλ‹€λ©΄ κΈ°λŠ₯을 μˆ˜ν–‰ν•  λ•Œλ§ˆλ‹€ μ„ μ–Έ ν•¨μˆ˜λ₯Ό μ°Ύμ•„μ„œ ν˜ΈμΆœν•  μ΄μœ κ°€ μ—†λ‹€.
읡λͺ…ν•¨μˆ˜λŠ” 일급 객체(First Class citizen)λΌλŠ” νŠΉμ§•μ„ 가진닀.

 

일급 μ‹œλ―Ό(First Class Citizen) / 일급 객체(First Class Object) / 일급 ν•¨μˆ˜(First Class Function)

λ‹€λ₯Έ 객체듀에 일반적으둜 적용 κ°€λŠ₯ν•œ 연산을 λͺ¨λ‘ μ§€μ›ν•˜λ©΄ 일급 μ‹œλ―Ό, 일급 μ‹œλ―Όμ˜ 쑰건을 λͺ¨λ‘ μΆ©μ‘±ν•˜λŠ” κ°μ²΄λŠ” 일급 객체, ν•¨μˆ˜λ₯Ό 일급 객체둜 μ·¨κΈ‰ν•˜λ©΄ 일급 ν•¨μˆ˜μ΄λ‹€.

 

  • λ³€μˆ˜μ— 담을 수 μžˆλ‹€.
  • ν•¨μˆ˜μ˜ 인자둜 전달할 수 μžˆλ‹€.
  • ν•¨μˆ˜μ˜ λ°˜ν™˜ κ°’μœΌλ‘œ 전달할 수 μžˆλ‹€.

 

지연 μ—°μ‚°(Lazy Evaluation)

ν•΄κ²°ν•΄μ•Ό ν•  연산듀이 주어지더라도 λ§ˆμ§€λ§‰ 연산을 μ•Œκ²Œλ˜λ©΄ κ·Έ λ•Œ 연산을 μ‹œμž‘ν•΄ λΆˆν•„μš”ν•œ 연산을 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” 것이닀. 연산을 μ§€μ—°μ‹œμΌœ λΆˆν•„μš”ν•œ 연산을 ν”Όν•  수 μžˆλ‹€.

 

μ•„λž˜ μ½”λ“œλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•΄ 짝수인 μ–‘μ˜ μ •μˆ˜λ₯Ό 뽑아내 100λ°°ν•˜λŠ” μ½”λ“œμ΄λ‹€.

 

List<Integer> list = Arrays.asList(-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5);

System.out.println(
    list.stream()
        .filter(i -> i > 0)			// μ–‘μ˜ μ •μˆ˜ μΆ”μΆœ
        .filter(i -> i % 2 == 0)		// 짝수 μΆ”μΆœ
        .map(i -> i * 100)			// 100λ°°
        .collect(Collectors.toList())
);

 

μΌλ°˜μ μœΌλ‘œλŠ” ν•„ν„° μˆœμ„œλŒ€λ‘œ μ–‘μ˜ μ •μˆ˜ μΆ”μΆœ, 짝수 μΆ”μΆœ, 100λ°°λ₯Ό ν•œλ‹€κ³  생각할 수 μžˆλ‹€.

ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” 각 (λ°˜λ³΅λ˜λŠ”) μš”μ†Œλ“€μ— λŒ€ν•΄ 순차적으둜 연산을 μ§„ν–‰ν•œλ‹€. 각 μš”μ†Œλ³„λ‘œ 연산을 μ§„ν–‰ν•˜λ‹€κ°€ μš”μ†Œμ˜ 값을 κ΅¬ν•˜λ©΄ κ·Έ μ΄ν›„μ˜ 연산을 ν•˜μ§€ μ•Šμ•„ λΆˆν•„μš”ν•œ 연산을 쀄일 수 μžˆλ‹€. 

μ˜ˆμ œμ—μ„œλŠ” (0, 1, 2, 3, 4, 5) -> (0, 2, 4) ->  (0, 200, 400)이 μ•„λ‹ˆλΌ 첫 번째 μš”μ†ŒμΈ [-5]에 λŒ€ν•΄ 각 단계λ₯Ό μˆ˜ν–‰ν•˜λŠ” 방식이닀. λ§Œμ•½ 첫 번째 κ°’λ§Œ κ΅¬ν•˜κ³  μ‹Άλ‹€λ©΄ 첫 번째 μš”μ†Œμ— λŒ€ν•΄μ„œλ§Œ 연산을 μˆ˜ν–‰ν•  것이닀.

 

 

μ•„λž˜ 링크에 μ˜ˆμ‹œμ™€ ν•¨κ»˜ 지연연산에 λŒ€ν•΄ μžμ„Έν•œ μ„€λͺ…이 μžˆμœΌλ‹ˆ 참고해보면 쒋을 것 κ°™λ‹€.

https://dororongju.tistory.com/137

 

[μžλ°”] Lazy Evaluation μ΄λž€?

Lazy Evaluation μ§μ—­ν•˜λ©΄ "게으λ₯Έ μ—°μ‚°"인데, 연산을 λΆˆν•„μš”ν•œ 연산을 ν”Όν•˜κΈ° μœ„ν•΄ 연산을 μ§€μ—°μ‹œν‚€λŠ” 것을 λ§ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. μ•„λž˜μ˜ μ½”λ“œλŠ” 1~10κΉŒμ§€μ˜ μ •μˆ˜λ₯Ό κ°–λŠ” Listμ—μ„œ 6보닀

dororongju.tistory.com

 

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

ν™”μ‚΄ν‘œ( -> )λ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ—λŠ” 맀개 λ³€μˆ˜, 였λ₯Έμͺ½μ€ λ°”λ”” λΆ€λΆ„μœΌλ‘œ 맀개 λ³€μˆ˜λ₯Ό μ΄μš©ν•΄ μ‹€ν–‰ν•  μ½”λ“œλΈ”λ‘( {} )을 μž‘μ„±ν•œλ‹€.

 

// λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κΈ°μ‘΄ 방식
λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…(λ§€κ°œλ³€μˆ˜, ...) {
	μ‹€ν–‰λ¬Έ
}

// λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜λŠ” 방식
(λ§€κ°œλ³€μˆ˜, ...) -> { μ‹€ν–‰λ¬Έ ... }

 

  • λžŒλ‹€μ‹μ˜ νŒŒλΌλ―Έν„°λ₯Ό μΆ”λ‘ ν•  수 μžˆλŠ” 경우 λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ μƒλž΅ν•  수 μžˆλ‹€.
  • λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜μΈ 경우 κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
  • λ§€κ°œλ³€μˆ˜κ°€ 두 개 이상인 경우 κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μ—†λ‹€.
  • 바디에 ν•˜λ‚˜μ˜ ν¬ν˜„μ‹λ§Œ μ˜€λŠ” 경우 μ€‘κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
  • μ€‘κ΄„ν˜Έκ°€ μƒλž΅λœ λžŒλ‹€μ‹μ—λŠ” μ„Έλ―Έμ½œλ‘ (;)을 뢙이지 μ•ŠλŠ”λ‹€.
  • 바디에 return문이 μžˆλŠ” 경우 μ€‘κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μ—†λ‹€.

 

μœ„μ˜ κ·œμΉ™μ— 따라 리슀트의 순회λ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

 

List<String> list = Arrays.asList("A", "B", "C");

// case 1
for (String x : list) {
	System.out.println(x);
}

// case 2
list.forEach(x -> System.out.println(x));

// case 3
list.forEach(System.out::println);

 

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

λ©”μ„œλ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μ§€μΉ­ν•˜λŠ” λ°©λ²•μœΌλ‘œ λžŒλ‹€μ‹μ—μ„œ 이미 μ‘΄μž¬ν•˜λŠ” 이름을 가진 λ©”μ„œλ“œλ₯Ό λžŒλ‹€λ‘œμ¨ μ‚¬μš©ν•  수 μžˆλ„λ‘ κ°€λ¦¬ν‚€λŠ” 역할을 ν•œλ‹€. μ€‘μš”ν•œ 점은 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ‹€ν–‰ν•˜λŠ” 것이 μ•„λ‹Œ 참쑰만 ν•˜λŠ” κ²ƒμ΄λΌλŠ” 점이닀.

 

λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜λ©΄ λΆˆν•„μš”ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ œκ±°ν•˜κ³  '::' 기호λ₯Ό μ‚¬μš©ν•˜μ—¬ ν‘œν˜„ν•  수 μžˆλ‹€.

클래슀 이름::λ©”μ„œλ“œ 이름
μ°Έμ‘° λ³€μˆ˜ 이름::λ©”μ„œλ“œ 이름

 

λžŒλ‹€ ν‘œν˜„μ‹κ³Ό λ©”μ†Œλ“œ μ°Έμ‘°λ₯Ό λΉ„κ΅ν•˜λŠ” μ˜ˆμ œμ΄λ‹€.

 

// κΈ°μ‘΄ λžŒλ‹€μ‹ 이용
Function<String, Integer> useLambda = (String s) -> Integer.parseInt(s);
System.out.println(ft.apply("99"));

// λ©”μ†Œλ“œ μ°Έμ‘° 이용
Function<String, Integer> useMethodRefer = Integer::parseInt;
System.out.println(ft.apply("99"));

 

Function μΈν„°νŽ˜μ΄μŠ€λŠ” ν•œ 개의 인자λ₯Ό 전달 λ°›μ•„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•˜λŠ” java.util.function νŒ¨ν‚€μ§€μ—μ„œ μ œκ³΅ν•˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. λžŒλ‹€ ν‘œν˜„μ‹λ§Œ μ΄ν•΄ν•˜κΈ°λ³΄λ‹€ μ‹€μ œλ‘œ λžŒλ‹€μ‹μ΄ μ‚¬μš©λ˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš© 방법도 μ΅ν˜€μ•Ό ν•œλ‹€.

 

 

μ°Έκ³  자료 및 좜처 πŸ™‡‍♂️

http://junil-hwang.com/blog/javascript-1%EA%B8%89%ED%95%A8%EC%88%98/#section1

https://frontsom.tistory.com/3

https://dororongju.tistory.com/137

https://edu.goorm.io/learn/lecture/2010/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-%EA%B3%A0%EB%9E%AD-%EA%B8%B0%EC%B4%88/lesson/174457/%EC%9D%B5%EB%AA%85-%ED%95%A8%EC%88%98

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

 

λŒ“κΈ€