Coding Planet

λžŒλ‹€μ‹ - λ©”μ„œλ“œ μ°Έμ‘°(μƒμ„±μžμ˜ λ©”μ„œλ“œ μ°Έμ‘° μ˜ˆμ‹œ 포함) λ³Έλ¬Έ

πŸ’» Java Study/Java 이둠 정리

λžŒλ‹€μ‹ - λ©”μ„œλ“œ μ°Έμ‘°(μƒμ„±μžμ˜ λ©”μ„œλ“œ μ°Έμ‘° μ˜ˆμ‹œ 포함)

jhj.sharon 2024. 3. 4. 16:35
λ°˜μ‘ν˜•

λžŒλ‹€μ‹μ— κ΄€ν•œ κ°œκ΄„μ μΈ ν¬μŠ€νŠΈλŠ” μ•„λž˜ μ°Έμ‘°!

https://sharonprogress.tistory.com/330

 

λžŒλ‹€μ‹(Lamda expression) 총정리와 ν™œμš©μ˜ˆμ œ

μ•„λž˜ 포슀트의 μ˜ˆμ‹œ 및 λ‚΄μš©μ€ 남ꢁ성 μ €μžμ˜ μžλ°”μ˜ 정석을 많이 μ°Έκ³ ν–ˆλ‹€. | λžŒλ‹€μ‹μ΄λž€ λžŒλ‹€μ‹μ€ κ°„λ”˜νžˆ λ§ν•΄μ„œ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ '식(expression)'으둜 ν‘œν˜„ν•œ 것이닀. μžλ°” 8λΆ€ν„° λ“±μž₯ν•œ κ°œλ…μœΌ

sharonprogress.tistory.com

 

 

 

μ•ž μ„  ν¬μŠ€νŠΈμ—μ„œ μ„€λͺ…ν•œλŒ€λ‘œ λžŒλ‹€μ‹μ€ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„ν•΄ κ°„λž΅ν•˜λ©΄μ„œ λͺ…ν™•ν•˜κ²Œ μ‹μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ„λ‘ν•˜λŠ” ν‘œν˜„μ‹μ΄λ‹€. 이에 더해 λžŒλ‹€μ‹μ΄ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œ ν˜ΈμΆœν•˜λŠ” κ²½μš°μ—λŠ” 'λ©”μ„œλ“œ μ°Έμ‘°(method reference)'λΌλŠ” λ°©λ²•μœΌλ‘œ λžŒλ‹€μ‹μ„ λ”μš± κ°„λž΅ν•˜κ²Œ μ“Έ 수 μžˆλ‹€.

 

| λ©”μ„œλ“œ μ°Έμ‘° 원리

μ•„λž˜ λžŒλ‹€μ‹μ„ λ©”μ„œλ“œλ‘œ ν‘œν˜„ν•œ 뢀뢄을 확인해보면 wrapper λ©”μ„œλ“œλŠ” 사싀상 λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ•„ μ „λ‹¬ν•˜λŠ” 것 μ™Έμ—λŠ” κΈ°λŠ₯이 μ—†λ‹€. 

      // λžŒλ‹€μ‹ ν‘œν˜„λ°©λ²•
      Function<String, Integer> f =(String s) -> Integer.parseInt(s);

	  // λ©”μ„œλ“œλ‘œ ν‘œν˜„ν•˜κΈ°
        Integer wrapper(String s){
            return Integer.parseInt(s);
        }

 

이럴 경우 μ•„λž˜μ™€ 같이 λ©”μ„œλ“œ μ°Έμ‘°ν˜•μ‹μœΌλ‘œ 정리할 수 μžˆλ‹€.

'::' μ—°μ‚°μžλŠ” λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό 생성할 λ•Œ μ‚¬μš©λ˜λ©°, λ©”μ„œλ“œκ°€ 호좜될 λŒ€μƒ(클래슀 λ˜λŠ” 객체)κ³Ό λ©”μ„œλ“œ 이름을 μ—°κ²°ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

μ»΄νŒŒμΌλŸ¬λŠ” λžŒλ‹€μ‹μ˜ 일뢀가 μƒλž΅λ˜μ—ˆλ”λΌλ„ μ’Œλ³€μ˜ μ§€λ„€λ¦­μŠ€λ₯Ό 톡해 μƒλž΅λœ 뢀뢄을 μΆ©λΆ„νžˆ μΆ”μΈ‘ν•  수 μžˆλ‹€.

 

Function<String, Integer> f = Integer::parseInt;

 

 

| λ©”μ„œλ“œ μ°Έμ‘° 원리

λ©”μ„œλ“œ μ°Έμ‘°λŠ” 크게 λ„€ 가지 ν˜•νƒœλ‘œ λ‚˜λ‰œλ‹€.

ν˜•νƒœ λžŒλ‹€ λ©”μ„œλ“œ μ°Έμ‘° 예
static λ©”μ„œλ“œ μ°Έμ‘° (x)->ClassName.method(x) 클래슀λͺ…::λ©”μ„œλ“œλͺ… Integer::parseInt
μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œ μ°Έμ‘° (obj,x)->obj.method(x) 객체 μ°Έμ‘°::λ©”μ„œλ“œλͺ… String::length
νŠΉμ • 객체 μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œ μ°Έμ‘° (x) -> obj.method(x) 클래슀λͺ…::λ©”μ„œλ“œλͺ…
(obj::method)
System.out::println
μƒμ„±μžμ˜ λ©”μ„œλ“œ μ°Έμ‘° () -> new ClassName 클래슀λͺ… ::new ArrayList::new

 

 

|μƒμ„±μžμ˜ λ©”μ„œλ“œ μ°Έμ‘°

μƒμ„±μž λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό μ‚¬μš©ν•  λ•Œ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ₯Ό μ°Έμ‘°ν•˜λŠ” κ²½μš°, λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ νƒ€μž…에 λ§žλŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. Javaμ—μ„œ μ œκ³΅ν•˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ λ§€κ°œλ³€μˆ˜μ˜ μ‘°κ±΄μ„ λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ” κ²½μš°, μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•  μˆ˜ μžˆλ‹€.

1. λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μž μ°Έμ‘°

Supplier<List<String>> supplier = ArrayList::new;
List<String> list = supplier.get(); // ArrayList의 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό 생성

 

2. ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 가진 μƒμ„±μž μ°Έμ‘°

Java의 Function μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›λŠ” μƒμ„±μžλ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.

Function<Integer, List<String>> function = ArrayList::new;
List<String> list = function.apply(10); // 초기 μš©λŸ‰μ΄ 10인 ArrayList의 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό 생성

 

3. 두 개의 λ§€κ°œλ³€μˆ˜λ₯Ό 가진 μƒμ„±μž μ°Έμ‘°:

BiFunction<String, Integer, MyClass> biFunction = MyClass::new;
MyClass myClass = biFunction.apply("test", 1); // Stringκ³Ό Integerλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” MyClass의 μƒμ„±μž μ°Έμ‘°


이 μ˜ˆμ‹œλ“€μ€ κ°κ° λ‹€λ₯Έ λ§€κ°œλ³€μˆ˜ μ‘°κ±΄μ„ κ°€μ§„ μƒμ„±μžλ₯Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄ μ–΄λ–»κ²Œ μ°Έμ‘°ν•˜λŠ”지 λ³΄μ—¬μ€€λ‹€. ν•„μš”μ— λ”°λΌ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•  μˆ˜ μžˆλ‹€λŠ” μ μ„ κΈ°μ–΅ν•˜μž.

λ°˜μ‘ν˜•
Comments