๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Category/Java

[JAVA] ๋žŒ๋‹ค ํ‘œํ˜„์‹(Lambda Expression)๊ณผ ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ(Method Reference)

by Corinee 2025. 1. 12.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ 1. Function ์ธํ„ฐํŽ˜์ด์Šค

Function<T, R>๋Š” ์ž๋ฐ”์˜ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ž…๋ ฅ ํƒ€์ž… T์™€ ์ถœ๋ ฅ ํƒ€์ž… R์„ ๊ฐ–๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t); // T๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ R์„ ๋ฐ˜ํ™˜
}

โœ… ์˜ˆ์ œ ์„ค๋ช…:

Function<String, Integer> stringToInt;
  • Function<String, Integer>: String์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ Integer๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
  • stringToInt๋Š” Function ํƒ€์ž…์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ 2. ๋žŒ๋‹ค ํ‘œํ˜„์‹ (Lambda Expression)

๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

stringToInt = (s) -> Integer.parseInt(s);
  • (s) → String ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ s๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • -> → ๋žŒ๋‹ค ์—ฐ์‚ฐ์ž (์ž…๋ ฅ๊ณผ ์‹คํ–‰๋ถ€๋ฅผ ๋ถ„๋ฆฌ)
  • Integer.parseInt(s) → s๋ฅผ int๋กœ ๋ณ€ํ™˜ํ•˜๋Š” Integer ํด๋ž˜์Šค์˜ ์ •์  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

๐Ÿ“ฆ ์‚ฌ์šฉ ์˜ˆ์ œ:

System.out.println(stringToInt.apply("100"));  // ์ถœ๋ ฅ: 100

 

๐Ÿ“Œ 3. ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ (Method Reference)

๋ฉ”์†Œ๋“œ ์ฐธ์กฐ๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

stringToInt = Integer::parseInt;

โœ… ํ•ด์„:

  • Integer::parseInt → Integer ํด๋ž˜์Šค์˜ ์ •์  ๋ฉ”์†Œ๋“œ parseInt๋ฅผ ์ฐธ์กฐ.
  • ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ๋Š” ๊ธฐ์กด ๋žŒ๋‹ค ํ‘œํ˜„์‹์˜ ๊ฐ„๋žตํ™”๋œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
  • ์œ„ ์ฝ”๋“œ๋Š” s -> Integer.parseInt(s)์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 4. apply() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

Function ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” apply() ๋ฉ”์†Œ๋“œ๋Š” ์ •์˜๋œ ํ•จ์ˆ˜์˜ ๋กœ์ง์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

stringToInt.apply("100");  // ๊ฒฐ๊ณผ: 100
  • apply ๋ฉ”์†Œ๋“œ๋Š” "100"์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ Integer.parseInt("100")์„ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋กœ 100์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 5. ์ •๋ฆฌ: Function vs ๋žŒ๋‹ค์‹ vs ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ

       ๋ฐฉ์‹                       ์„ค๋ช…                                                                               ์˜ˆ์ œ

์ต๋ช… ํด๋ž˜์Šค ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉ new Function<String, Integer>() { public Integer apply(String s) { return Integer.parseInt(s); }}
๋žŒ๋‹ค ํ‘œํ˜„์‹ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •์˜ (s) -> Integer.parseInt(s)
๋ฉ”์†Œ๋“œ ์ฐธ์กฐ ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ Integer::parseInt

 

๐Ÿ“Œ 6. ์˜ˆ์ œ ์ฝ”๋“œ (์ „์ฒด)

import java.util.function.Function;

public class LambdaExample {
    public static void main(String[] args) {
        // ๋žŒ๋‹ค ํ‘œํ˜„์‹ ์‚ฌ์šฉ
        Function<String, Integer> stringToIntLambda = (s) -> Integer.parseInt(s);
        System.out.println("Lambda ๊ฒฐ๊ณผ: " + stringToIntLambda.apply("123"));

        // ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ ์‚ฌ์šฉ
        Function<String, Integer> stringToIntMethodRef = Integer::parseInt;
        System.out.println("Method Reference ๊ฒฐ๊ณผ: " + stringToIntMethodRef.apply("123"));
    }
}

โœ… ์ถœ๋ ฅ:

Lambda ๊ฒฐ๊ณผ: 123
Method Reference ๊ฒฐ๊ณผ: 123

๐ŸŽฏ ์š”์•ฝ:

  1. Function<T, R>: T๋ฅผ ๋ฐ›์•„ R์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค
  2. ๋žŒ๋‹ค ํ‘œํ˜„์‹ ((x) -> {...}): ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ต๋ช… ํ•จ์ˆ˜ ์ •์˜
  3. ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ (ClassName::method): ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹

์ž๋ฐ” 8 ์ด์ƒ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

'Category > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JAVA] instanceof vs getClass() ์•Œ์•„๋ณด๊ธฐ  (1) 2025.02.27
[JAVA] var๋ž€?  (0) 2025.02.27
[JAVA] ๋ฐ˜๋ณต๋ฌธ ์ •๋ฆฌ  (0) 2025.01.12