Java์˜ Functional Interface์™€ Method Reference ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - Java์˜ Functional Interface์™€ Method Reference ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ Java์˜ ์„ธ๊ณ„์—์„œ ์•„์ฃผ ํฅ๋ฏธ์ง„์ง„ํ•œ ์—ฌํ–‰์„ ๋– ๋‚˜๋ณผ ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์ง€๋Š” ๋ฐ”๋กœ Functional Interface์™€ Method Reference๋ผ๋Š” ์‹ ๋น„๋กœ์šด ๋‚˜๋ผ์ž…๋‹ˆ๋‹ค. ๐ŸŒŸ ์ด ์—ฌํ–‰์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒˆ๋กœ์šด ์ฐจ์›์„ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”!

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ๋ชจํ—˜์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐ŸŽ’ ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์ถœ๋ฐœ~!

๐Ÿ’ก ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”? Java 8๋ถ€ํ„ฐ ๋„์ž…๋œ Functional Interface์™€ Method Reference๋Š” ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๊ธฐ๋Šฅ์ด์—์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ฐพ๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ด ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋‹ค์–‘ํ•œ "์žฌ๋Šฅ"์„ ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

1. Functional Interface: ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฌธ์„ ์—ด๋‹ค ๐Ÿšช

Functional Interface, ์ด๋ฆ„๋ถ€ํ„ฐ ๋ญ”๊ฐ€ ๋ฉ‹์ ธ ๋ณด์ด์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Ž ์ด๊ฒƒ์€ ๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋งŒ์„ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งํ•ด์š”. "๋‹จ ํ•˜๋‚˜๋ผ๊ณ ์š”? ๊ทธ๊ฒŒ ๋ญ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํŠน๋ณ„ํ•œ๊ฐ€์š”?" ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์ด ์ž‘์€ ํŠน์ง•์ด Java์˜ ์„ธ๊ณ„๋ฅผ ์™„์ „ํžˆ ๋ฐ”๊ฟ”๋†“์•˜๋‹ต๋‹ˆ๋‹ค!

๐ŸŽญ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: Functional Interface๋ฅผ ๋ฌด๋Œ€ ์œ„์˜ ๋ฐฐ์šฐ๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ํ•œ ๋ฐฐ์šฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋”ฑ ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ๋งก๋Š” ๊ฑฐ์˜ˆ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ด€๊ฐ(์ฆ‰, ํ”„๋กœ๊ทธ๋ž˜๋จธ)์€ ๊ทธ ๋ฐฐ์šฐ์˜ ์—ญํ• ์„ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

Functional Interface์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๋ฐ”๋กœ ๋žŒ๋‹ค ํ‘œํ˜„์‹(Lambda Expression)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด์—์š”. ๋žŒ๋‹ค ํ‘œํ˜„์‹? ๋ญ”๊ฐ€ ๊ทธ๋ฆฌ์Šค ๋ฌธ์ž ๊ฐ™์€ ์ด๋ฆ„์ด์ฃ ? ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์•„์š”!

1.1 ๋žŒ๋‹ค ํ‘œํ˜„์‹: ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐํ•จ์„ ๊ทน๋Œ€ํ™”ํ•˜๋‹ค โœ‚๏ธ

๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ์‹์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด์—์š”. ๋งˆ์น˜ ์ˆ˜ํ•™์—์„œ ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํžˆ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”?


// ๊ธฐ์กด์˜ ๋ฐฉ์‹
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, World!");
    }
};

// ๋žŒ๋‹ค ํ‘œํ˜„์‹ ์‚ฌ์šฉ
Runnable runnable = () -> System.out.println("Hello, World!");
  

์™€์šฐ! ๐Ÿ˜ฒ ์ฝ”๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ฐ„๊ฒฐํ•ด์กŒ๋‚˜์š”? ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋žŒ๋‹ค ํ‘œํ˜„์‹์˜ ๋งˆ๋ฒ•์ด์—์š”. ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ๋‹จ ํ•œ ์ค„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์ฃ . ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋ณต์žกํ•œ ์ž‘์—…์„ ๋‹จ ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์œผ๋กœ ์˜๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”!

1.2 Functional Interface์˜ ์ข…๋ฅ˜: ๋‹ค์–‘ํ•œ ๋ง›์„ ์ฆ๊ฒจ๋ณด์„ธ์š” ๐Ÿฆ

Java์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ Functional Interface๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์š”. ๋งˆ์น˜ ์•„์ด์Šคํฌ๋ฆผ ๊ฐ€๊ฒŒ์—์„œ ๋‹ค์–‘ํ•œ ๋ง›์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”. ๋ช‡ ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ Functional Interface๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • ๐Ÿ“ Runnable: ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ  ๋ฆฌํ„ด๊ฐ’๋„ ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • ๐ŸŠ Supplier<T>: ์ธ์ž๋Š” ์—†์ง€๋งŒ T ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • ๐Ÿ‹ Consumer<T>: T ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ  ๋ฆฌํ„ด๊ฐ’์€ ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • ๐Ÿ‡ Function<T, R>: T ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ R ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • ๐Ÿ‰ Predicate<T>: T ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ boolean์„ ๋ฆฌํ„ดํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ Functional Interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋”์šฑ ์œ ์—ฐํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์กฐํ•ฉํ•ด ์ƒˆ๋กœ์šด ๊ฐ€์น˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ !

1.3 ๋‚˜๋งŒ์˜ Functional Interface ๋งŒ๋“ค๊ธฐ: ์š”๋ฆฌ์‚ฌ๊ฐ€ ๋˜์–ด๋ณด์„ธ์š” ๐Ÿ‘จโ€๐Ÿณ

Java์—์„œ ์ œ๊ณตํ•˜๋Š” Functional Interface๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋‹ค๊ณ ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์šฐ๋ฆฌ๋Š” ์ง์ ‘ Functional Interface๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์š”๋ฆฌ์‚ฌ๊ฐ€ ์ƒˆ๋กœ์šด ๋ ˆ์‹œํ”ผ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ .


@FunctionalInterface
public interface MyFunction {
    void myMethod();
}
  

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํžˆ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”! @FunctionalInterface ์–ด๋…ธํ…Œ์ด์…˜์€ ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Functional Interface์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ์—ญํ• ์„ ํ•ด์š”. ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Functional Interface์˜ ๊ทœ์น™์„ ์ž˜ ์ง€ํ‚ค๊ณ  ์žˆ๋Š”์ง€ ์ฒดํฌํ•ด์ค˜์š”. ๋งˆ์น˜ ์š”๋ฆฌ ๋Œ€ํšŒ์˜ ์‹ฌ์‚ฌ์œ„์›์ด ์š”๋ฆฌ์˜ ๊ทœ์น™์„ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”!

๐ŸŒŸ Tip: Functional Interface๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ๋•Œ๋Š” ํ•ญ์ƒ ํ•œ ๊ฐœ์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋งŒ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋„ฃ์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฑฐ์˜ˆ์š”!

1.4 Functional Interface์˜ ํ™œ์šฉ: ์‹ค์ „์—์„œ ์จ๋ณด๊ธฐ ๐Ÿ‹๏ธโ€โ™‚๏ธ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด Functional Interface๋ฅผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”? ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class FunctionalInterfaceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Jack", "Joe");

        // Predicate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 'J'๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„ ํ•„ํ„ฐ๋ง
        Predicate<String> startsWithJ = name -> name.startsWith("J");
        
        names.stream()
             .filter(startsWithJ)
             .forEach(System.out::println);
    }
}
  

์ด ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” Predicate Functional Interface๋ฅผ ์‚ฌ์šฉํ•ด 'J'๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„์„ ํ•„ํ„ฐ๋งํ–ˆ์–ด์š”. Predicate๋Š” ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” Functional Interface์˜ˆ์š”. ์—ฌ๊ธฐ์„œ๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹ name -> name.startsWith("J")๋ฅผ ์‚ฌ์šฉํ•ด ์กฐ๊ฑด์„ ์ •์˜ํ–ˆ์ฃ .

์ด๋ ‡๊ฒŒ Functional Interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ๊ฐ„๊ฒฐํ•ด์ ธ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์›ํ•˜๋Š” ์žฌ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์šฐ๋ฆฌ๋„ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ !

1.5 Functional Interface์˜ ์žฅ์ : ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? ๐Ÿค”

Functional Interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์–ด์š”. ํ•จ๊ป˜ ์‚ดํŽด๋ณผ๊นŒ์š”?

  1. ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ: ๋žŒ๋‹ค ํ‘œํ˜„์‹๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ๊ฐ„๊ฒฐํ•ด์ ธ์š”. ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์ฃ .
  2. ์œ ์—ฐ์„ฑ: ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์ด ๋†’์•„์ ธ์š”.
  3. ์žฌ์‚ฌ์šฉ์„ฑ: ๊ฐ™์€ Functional Interface๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ: ์ž‘์€ ๋‹จ์œ„์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์–ด ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์›Œ์ ธ์š”.
  5. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ง€์›: ์ŠคํŠธ๋ฆผ API์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋Ÿฌํ•œ ์žฅ์ ๋“ค ๋•๋ถ„์— Functional Interface๋Š” ํ˜„๋Œ€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด ๋˜์—ˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์ด ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Functional Interface๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑฐ์ฃ !

๐Ÿ’– ์žฌ๋Šฅ๋„ท Tip: Functional Interface๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ๋„ ํ•œ์ธต ์—…๊ทธ๋ ˆ์ด๋“œ๋  ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ๋ฐฐ์šฐ๊ณ  ๋ฐœ์ „์‹œํ‚ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ . ๊ณ„์†ํ•ด์„œ ์—ฐ์Šตํ•˜๊ณ  ํ™œ์šฉํ•ด๋ณด์„ธ์š”!

2. Method Reference: ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ! ๐ŸŽจ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์—ฌํ–‰์€ Method Reference๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ชฉ์ ์ง€๋กœ ํ–ฅํ•ฉ๋‹ˆ๋‹ค. Method Reference๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. "๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๊ณ ์š”? ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋ง์ด์ฃ ?" ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”. ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”! ๐Ÿ˜Š

2.1 Method Reference๋ž€? ๐Ÿง

Method Reference๋Š” ์ด๋ฏธ ์ด๋ฆ„์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋žŒ๋‹ค ํ‘œํ˜„์‹์œผ๋กœ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. ์‰ฝ๊ฒŒ ๋งํ•ด, ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๋งŒ๋“ค์–ด ๋†“์€ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์ฃ . ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ด๋ฏธ ๋“ฑ๋ก๋œ ์žฌ๋Šฅ์„ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”!

๐ŸŽญ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: Method Reference๋ฅผ ์š”๋ฆฌ ๋ ˆ์‹œํ”ผ๋ถ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ๋งค๋ฒˆ ์š”๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ค๋ช…ํ•˜๋Š” ๋Œ€์‹ , ์ด๋ฏธ ์ž‘์„ฑ๋œ ๋ ˆ์‹œํ”ผ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ํ›จ์”ฌ ๊ฐ„ํŽธํ•˜๊ฒ ์ฃ ? Method Reference๋„ ์ด์™€ ๊ฐ™์•„์š”. ์ด๋ฏธ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑฐ์˜ˆ์š”!

2.2 Method Reference์˜ ์ข…๋ฅ˜: ๋‹ค์–‘ํ•œ ์ฐธ์กฐ ๋ฐฉ๋ฒ• ๐Ÿฝ๏ธ

Method Reference์—๋Š” ๋„ค ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์–ด์š”. ๊ฐ๊ฐ์˜ ์ข…๋ฅ˜๋ฅผ ์š”๋ฆฌ์— ๋น„์œ ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณผ๊ฒŒ์š”!

  1. ์ •์  ๋ฉ”์„œ๋“œ ์ฐธ์กฐ (Static Method Reference): ClassName::staticMethodName
    ์ด๊ฒƒ์€ ๋งˆ์น˜ ์œ ๋ช… ์š”๋ฆฌ์‚ฌ์˜ ๋ ˆ์‹œํ”ผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ํด๋ž˜์Šค์— ์ •์˜๋œ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์ฃ .
  2. ํŠน์ • ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์ฐธ์กฐ (Instance Method Reference of a Particular Object): objectName::instanceMethodName
    ์ด๊ฑด ๋‚ด๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ํŠน๋ณ„ํ•œ ์š”๋ฆฌ ๋น„๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”.
  3. ํŠน์ • ํƒ€์ž…์˜ ์ž„์˜ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์ฐธ์กฐ (Instance Method Reference of an Arbitrary Object of a Particular Type): ClassName::instanceMethodName
    ์ด๊ฒƒ์€ ์š”๋ฆฌ ๋Œ€ํšŒ์—์„œ ์‹ฌ์‚ฌ์œ„์›๋“ค์ด ๊ฐ์ž์˜ ๋ฐฉ์‹์œผ๋กœ ์š”๋ฆฌ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ํŠน์ • ํƒ€์ž…์˜ ์ž„์˜์˜ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”.
  4. ์ƒ์„ฑ์ž ์ฐธ์กฐ (Constructor Reference): ClassName::new
    ์ด๊ฑด ์ƒˆ๋กœ์šด ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”.

์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ Method Reference๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ๋ณต์žกํ•œ ์š”๋ฆฌ ๊ณผ์ •์„ ๊ฐ„๋‹จํ•œ ๋ ˆ์‹œํ”ผ๋กœ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ !

2.3 Method Reference ์‹ค์ „ ์˜ˆ์ œ: ์ง์ ‘ ์š”๋ฆฌํ•ด๋ณด๊ธฐ ๐Ÿ‘จโ€๐Ÿณ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด Method Reference๋ฅผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณผ๊นŒ์š”? ๊ฐ๊ฐ์˜ Method Reference ์ข…๋ฅ˜๋ณ„๋กœ ์˜ˆ์ œ๋ฅผ ์ค€๋น„ํ–ˆ์–ด์š”!

2.3.1 ์ •์  ๋ฉ”์„œ๋“œ ์ฐธ์กฐ ์˜ˆ์ œ


import java.util.Arrays;
import java.util.List;

public class StaticMethodReferenceExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // ๋žŒ๋‹ค ํ‘œํ˜„์‹ ์‚ฌ์šฉ
        numbers.forEach(number -> System.out.println(number));

        // Method Reference ์‚ฌ์šฉ
        numbers.forEach(System.out::println);
    }
}
  

์ด ์˜ˆ์ œ์—์„œ System.out::println์€ System.out ํด๋ž˜์Šค์˜ ์ •์  ๋ฉ”์„œ๋“œ println์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ์ฝ๊ธฐ ์‰ฌ์›Œ์ง€์ฃ !

2.3.2 ํŠน์ • ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์ฐธ์กฐ ์˜ˆ์ œ


import java.util.Arrays;
import java.util.List;

public class InstanceMethodReferenceExample {
    public static void main(String[] args) {
        List<String> messages = Arrays.asList("Hello", "World", "Method", "Reference");
        
        InstanceMethodReferenceExample example = new InstanceMethodReferenceExample();

        // ๋žŒ๋‹ค ํ‘œํ˜„์‹ ์‚ฌ์šฉ
        messages.forEach(message -> example.printMessage(message));

        // Method Reference ์‚ฌ์šฉ
        messages.forEach(example::printMessage);
    }

    public void printMessage(String message) {
        System.out.println("Message: " + message);
    }
}
  

์—ฌ๊ธฐ์„œ example::printMessage๋Š” example ๊ฐ์ฒด์˜ printMessage ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด๋ฏธ ๋งŒ๋“ค์–ด ๋†“์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

2.3.3 ํŠน์ • ํƒ€์ž…์˜ ์ž„์˜ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์ฐธ์กฐ ์˜ˆ์ œ


import java.util.Arrays;
import java.util.List;

public class ArbitraryObjectMethodReferenceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // ๋žŒ๋‹ค ํ‘œํ˜„์‹ ์‚ฌ์šฉ
        names.sort((s1, s2) -> s1.compareToIgnoreCase(s2));

        // Method Reference ์‚ฌ์šฉ
        names.sort(String::compareToIgnoreCase);

        System.out.println(names);
    }
}
  

์ด ์˜ˆ์ œ์—์„œ String::compareToIgnoreCase๋Š” String ํด๋ž˜์Šค์˜ compareToIgnoreCase ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด์š”. ์ด ๋ฐฉ์‹์€ ํŠน์ • ํƒ€์ž…(์—ฌ๊ธฐ์„œ๋Š” String)์˜ ์ž„์˜์˜ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์œ ์šฉํ•ด์š”.

2.3.4 ์ƒ์„ฑ์ž ์ฐธ์กฐ ์˜ˆ์ œ


import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

public class ConstructorReferenceExample {
    public static void main(String[] args) {
        // ๋žŒ๋‹ค ํ‘œํ˜„์‹ ์‚ฌ์šฉ
        Supplier<List<String>> listSupplier = () -> new ArrayList<>();

        // ์ƒ์„ฑ์ž ์ฐธ์กฐ ์‚ฌ์šฉ
        Supplier<List<String>> listSupplierRef = ArrayList::new;

        List<String> list = listSupplierRef.get();
        list.add("Method Reference is awesome!");
        System.out.println(list);
    }
}
  

์—ฌ๊ธฐ์„œ ArrayList::new๋Š” ArrayList์˜ ์ƒ์„ฑ์ž๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

๐Ÿ’ก Tip: Method Reference๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๋ฌธ๋งฅ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ด์š”. ๋•Œ๋กœ๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹์ด ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ๊ณ , ๋•Œ๋กœ๋Š” Method Reference๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”!

2.4 Method Reference์˜ ์žฅ์ : ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? ๐Ÿค”

Method Reference๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์–ด์š”. ํ•จ๊ป˜ ์‚ดํŽด๋ณผ๊นŒ์š”?

  1. ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ: ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ๊ฐ„๊ฒฐํ•ด์ ธ์š”.
  2. ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ: ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  3. ์žฌ์‚ฌ์šฉ์„ฑ: ๊ธฐ์กด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ์‰ฝ๊ฒŒ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ: ๋ฉ”์„œ๋“œ์˜ ๊ตฌํ˜„์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์„ ์ผ์ผ์ด ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์š”.
  5. ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ตœ์ ํ™”: ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Method Reference๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋Ÿฌํ•œ ์žฅ์ ๋“ค ๋•๋ถ„์— Method Reference๋Š” ํ˜„๋Œ€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋งค์šฐ ์œ ์šฉํ•œ ๋„๊ตฌ๊ฐ€ ๋˜์—ˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Method Reference๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์„ ํšจ์œจ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์ฃ !

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Tip: Method Reference๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋”์šฑ ์ „๋ฌธ์ ์ด๊ณ  ์„ธ๋ จ๋˜์–ด ๋ณด์ผ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€์˜ ์žฌ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ . ๊ณ„์†ํ•ด์„œ ์—ฐ์Šตํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ํ™œ์šฉํ•ด๋ณด์„ธ์š”!

3. Functional Interface์™€ Method Reference์˜ ์กฐํ™”: ์™„๋ฒฝํ•œ ๋“€์˜ค ๐ŸŽญ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” Functional Interface์™€ Method Reference์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณด์•˜์–ด์š”. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋ฐ”๋กœ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ•๋ ฅํ•œ ๋“€์˜ค๊ฐ€ ํƒ„์ƒํ•˜๋Š” ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Ž

3.1 Functional Interface์™€ Method Reference์˜ ๋งŒ๋‚จ ๐Ÿ’‘

Functional Interface์™€ Method Reference๋Š” ์„œ๋กœ ์™„๋ฒฝํ•œ ํŒŒํŠธ๋„ˆ์˜ˆ์š”. Functional Interface๊ฐ€ ๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด, Method Reference๋Š” ๊ทธ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•œ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์˜๋ขฐ์ž์™€ ์žฌ๋Šฅ ์ œ๊ณต์ž๊ฐ€ ๋งŒ๋‚˜ ์™„๋ฒฝํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ !

๐ŸŽญ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: Functional Interface์™€ Method Reference์˜ ๊ด€๊ณ„๋ฅผ ์—ฐ๊ทน์— ๋น„์œ ํ•ด๋ณผ๊นŒ์š”? Functional Interface๋Š” ๋ฐฐ์—ญ(์—ญํ• )์„ ์ •์˜ํ•˜๋Š” ๋Œ€๋ณธ์ด๊ณ , Method Reference๋Š” ๊ทธ ๋ฐฐ์—ญ์„ ์—ฐ๊ธฐํ•  ๋ฐฐ์šฐ๋ฅผ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ณผ์ •์ด์—์š”. ๋‘˜์ด ๋งŒ๋‚˜๋ฉด ๋ฉ‹์ง„ ๊ณต์—ฐ์ด ํƒ„์ƒํ•˜๋Š” ๊ฑฐ์ฃ !

3.2 ์‹ค์ „ ์˜ˆ์ œ: ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ๐Ÿ‹๏ธโ€โ™‚๏ธ

์ž, ์ด์ œ Functional Interface์™€ Method Reference๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”? ์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋‘ ๊ฐœ๋…์ด ์–ผ๋งˆ๋‚˜ ์ž˜ ์–ด์šธ๋ฆฌ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.


import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class FunctionalInterfaceMethodReferenceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Jack", "Joe", "Jill");

        // Predicate Functional Interface ์‚ฌ์šฉ
        Predicate<String> startsWithJ = FunctionalInterfaceMethodReferenceExample::startsWithJ;

        // Method Reference๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ๋ง
        names.stream()
             .filter(startsWithJ)
             .forEach(System.out::println);
    }

    // 'J'๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public static boolean startsWithJ(String name) {
        return name.startsWith("J");
    }
}
  

์ด ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” Predicate Functional Interface์™€ Method Reference๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ์–ด์š”. Predicate<String> startsWithJ = FunctionalInterfaceMethodReferenceExample::startsWithJ์—์„œ Functional Interface์™€ Method Reference๊ฐ€ ๋งŒ๋‚˜๊ณ  ์žˆ์ฃ . ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ์ฝ๊ธฐ ์‰ฌ์›Œ์ ธ์š”!

3.3 ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ์˜ ํ™œ์šฉ ๐ŸŒˆ

Functional Interface์™€ Method Reference์˜ ์กฐํ•ฉ์€ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์–ด์š”. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋” ์‚ดํŽด๋ณผ๊นŒ์š”?

3.3.1 ์ปฌ๋ ‰์…˜ ์ •๋ ฌํ•˜๊ธฐ


import java.util.Arrays;
import java.util.List;
import java.util.Comparator;

public class SortingExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Charlie", "Alice", "Bob", "David");

        // Comparator Functional Interface์™€ Method Reference ์‚ฌ์šฉ
        names.sort(Comparator.comparing(String::toLowerCase));

        System.out.println(names);
    }
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” Comparator.comparing()์ด๋ผ๋Š” Functional Interface์™€ String::toLowerCase๋ผ๋Š” Method Reference๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

3.3.2 ์ŠคํŠธ๋ฆผ ๋งคํ•‘ํ•˜๊ธฐ


import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamMappingExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Jack", "Joe", "Jill");

        // Function Functional Interface์™€ Method Reference ์‚ฌ์šฉ
        List<Integer> nameLengths = names.stream()
                                            .map(String::length)
                                            .collect(Collectors.toList());

        System.out.println(nameLengths);
    }
}
  

์—ฌ๊ธฐ์„œ๋Š” Stream.map()์ด๋ผ๋Š” Functional Interface์™€ String::length๋ผ๋Š” Method Reference๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ๊ฐ ์ด๋ฆ„์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ž‘์—…๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”!

3.4 ์ฃผ์˜ํ•  ์ : ์™„๋ฒฝํ•œ ๋“€์˜ค๋ฅผ ์œ„ํ•œ ํŒ ๐Ÿ’ก

Functional Interface์™€ Method Reference๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋„ ์žˆ์–ด์š”. ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆด๊ฒŒ์š”:

  1. ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ผ์น˜: Method Reference๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ Functional Interface์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ์™€ ์ผ์น˜ํ•ด์•ผ ํ•ด์š”.
  2. ์ปจํ…์ŠคํŠธ ๊ณ ๋ ค: ๋•Œ๋กœ๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹์ด ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์„ธ์š”.
  3. ๊ฐ€๋…์„ฑ ์šฐ์„ : Method Reference๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€์ง€๋งŒ, ๋•Œ๋กœ๋Š” ์˜คํžˆ๋ ค ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์–ด์š”. ํ•ญ์ƒ ๊ฐ€๋…์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ๊ณ ๋ คํ•˜์„ธ์š”.
  4. ํ…Œ์ŠคํŠธ ์ž‘์„ฑ: Functional Interface์™€ Method Reference๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋„ ๊ผญ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋„ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Tip: Functional Interface์™€ Method Reference๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์™„๋ฒฝํ•œ ํŒ€์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ฐ์ž์˜ ๊ฐ•์ ์„ ์‚ด๋ฆฌ๋ฉด์„œ๋„ ์กฐํ™”๋กญ๊ฒŒ ํ˜‘๋ ฅํ•  ๋•Œ ์ตœ๊ณ ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์ฃ . ๊ณ„์† ์—ฐ์Šตํ•˜๊ณ  ๊ฒฝํ—˜์„ ์Œ“์•„๊ฐ€๋ฉด์„œ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ์™„๋ฒฝํ•œ ๋“€์˜ค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”!

4. ๋งˆ๋ฌด๋ฆฌ: Java์˜ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ–ฅํ•ด ๐Ÿš€

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ Functional Interface์™€ Method Reference ์—ฌํ–‰์ด ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด์š”. ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์—ฌ์ •์ด์—ˆ์ฃ ? ๐Ÿ˜Š

4.1 ๋ฐฐ์šด ๋‚ด์šฉ ์ •๋ฆฌ ๐Ÿ“

์šฐ๋ฆฌ๊ฐ€ ์ด ์—ฌํ–‰์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”?

  • Functional Interface: ๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๋žŒ๋‹ค ํ‘œํ˜„์‹๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
  • Method Reference: ์ด๋ฏธ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐœ๋…์˜ ์กฐํ™”: Functional Interface์™€ Method Reference๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.2 ์•ž์œผ๋กœ์˜ ๋ฐœ์ „ ๋ฐฉํ–ฅ ๐Ÿ”ฎ

Functional Interface์™€ Method Reference๋Š” Java์˜ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์—ด์—ˆ์–ด์š”. ์ด์ œ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋”์šฑ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์„ฑ์„ ๋„๊ฒŒ ๋˜์—ˆ์ฃ . ์ด๋Š” ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œ์ผฐ์–ด์š”.

์•ž์œผ๋กœ Java๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๋”์šฑ ๋ฐœ์ „์‹œ์ผœ ๋‚˜๊ฐˆ ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ๋Š” ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„๊ตฌ๋“ค์„ ๋งŒ๋‚˜๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์ด ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ๊ณผ ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ !

4.3 ๋งˆ์ง€๋ง‰ ์กฐ์–ธ ๐Ÿ’–

Functional Interface์™€ Method Reference๋Š” ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์˜ˆ์š”. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ๊ทธ๋ ‡๋“ฏ, ์ด๊ฒƒ๋“ค๋„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”. ํ•ญ์ƒ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์ƒ๊ฐํ•˜์„ธ์š”. ๋•Œ๋กœ๋Š” ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์ด ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ง„์ •ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค๋ ฅ์ด๋ž๋‹ˆ๋‹ค!

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Final Tip: ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋Š์ž„์—†์ด ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ์—ฌ์ •์ด์—์š”. Functional Interface์™€ Method Reference๋„ ๊ทธ ์—ฌ์ •์˜ ํ•œ ๋ถ€๋ถ„์ผ ๋ฟ์ด์ฃ . ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ , ๋„์ „ํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณผ์ •์„ ์ฆ๊ธฐ์„ธ์š”! ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋ฐœ์ „์‹œํ‚ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋”ฉ ์—ฌ์ •์ด ์ฆ๊ฒ๊ณ  ํ’์„ฑํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž„๊ฒŒ์š”! ๐ŸŽ‰