λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
개인 곡뢀/Java, Python

[Java] λžŒλ‹€μ‹, λ©”μ„œλ“œμ°Έμ‘°

by syLim___ 2025. 1. 9.
728x90

✨ μžλ°” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° ✨

πŸ“‹ [Java] Functional Interface (ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€)
πŸ“‹ [Java] λžŒλ‹€μ‹, λ©”μ„œλ“œμ°Έμ‘°
πŸ“‹ [Java] 슀트림

 

βœ… λžŒλ‹€μ‹μ΄λž€?

- ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ μΆ”μƒλ©”μ„œλ“œλ₯Ό 읡λͺ…μ˜ κ΅¬ν˜„ 객체둜 λ§Œλ“€ 수 μžˆλ„λ‘ ν•˜λŠ” ν‘œν˜„μ‹μ΄λ‹€.

- Java8λΆ€ν„° λ„μž…λ˜μ—ˆλ‹€.

- λžŒλ‹€μ‹μ„ μ‚¬μš©ν•˜λ©΄, κ°„κ²°ν•˜κ³  직관적인 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

 

πŸ₯ λžŒλ‹€μ‹μ˜ κΈ°λ³Έ ν˜•νƒœ

(νŒŒλΌλ―Έν„° 이름 1, νŒŒλΌλ―Έν„° 이름 2, ...) -> { κ΅¬ν˜„λΆ€ }

κ΄„ν˜Έ λ‚΄λΆ€: νŒŒλΌλ―Έν„°κ°€ μžˆλ‹€λ©΄ νŒŒλΌλ―Έν„° 이름을 λ‚˜μ—΄ν•˜κ³ , νŒŒλΌλ―Έν„°κ°€ μ—†λ‹€λ©΄ 아무 것도 적지 μ•ŠλŠ”λ‹€.
μ€‘κ΄„ν˜Έ λ‚΄λΆ€ : λ©”μ„œλ“œ κ΅¬ν˜„λΆ€λ₯Ό μž‘μ„±ν•œλ‹€.

 

 

- κ΄„ν˜Έ μ•ˆμ— νŒŒλΌλ―Έν„° νƒ€μž…μ„ μ λŠ”λ‹€κ³  ν•΄μ„œ 컴파일 였λ₯˜κ°€ λ°œμƒν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

    κ·ΈλŸ¬λ‚˜ νŒŒλΌλ―Έν„° νƒ€μž… μ •λ³΄λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λ˜μ–΄ 있기 λ•Œλ¬Έμ— λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ μ•Œ 수 μžˆλ‹€.

    λ”°λΌμ„œ νŒŒλΌλ―Έν„° νƒ€μž…μ€ ν†΅μƒμ μœΌλ‘œ μƒλž΅ν•˜κ³ , νŒŒλΌλ―Έν„° μ΄λ¦„λ§Œ μž‘μ„±ν•œλ‹€.

 

- νŒŒλΌλ―Έν„°κ°€ ν•˜λ‚˜μΈ 경우, κ΄„ν˜ΈλŠ” μƒλž΅ κ°€λŠ₯ν•˜λ‹€.

 

- κ΅¬ν˜„λΆ€κ°€ ν•œ λ¬Έμž₯인 경우, μ€‘κ΄„ν˜Έμ™€ return ν‚€μ›Œλ“œλŠ” μƒλž΅ κ°€λŠ₯ν•˜λ‹€.

- 이 경우 λ°˜λ“œμ‹œ μ€‘κ΄„ν˜Έμ™€ return ν‚€μ›Œλ“œλ₯Ό ν•¨κ»˜ μƒλž΅ν•΄μ•Ό ν•œλ‹€.

       (μ€‘κ΄„ν˜Έλ§Œ μƒλž΅ν•˜κ³  return ν‚€μ›Œλ“œλŠ” ν‘œκΈ°ν•˜λ©΄ 컴파일 였λ₯˜ λ°œμƒν•œλ‹€.

        λ°˜λŒ€λ‘œ μ€‘κ΄„ν˜ΈλŠ” ν‘œκΈ°ν•˜κ³  returnν‚€μ›Œλ“œλ§Œ μƒλž΅ν•˜λ©΄ 컴파일 였λ₯˜ λ°œμƒν•œλ‹€.)

 

πŸ₯ λžŒλ‹€ν‘œν˜„μ‹ κ΅¬ν˜„ μ˜ˆμ‹œ

더보기

λžŒλ‹€ ν‘œν˜„μ‹μ„ μ΄μš©ν•΄μ„œ

잘 μ•Œκ³  μžˆλŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μΈ Runnableκ³Ό Comparator의 μΆ”μƒλ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄λ³΄μ•˜λ‹€.

 

πŸ“Œ Runnable μΈν„°νŽ˜μ΄μŠ€

@FunctionalInterface
public interface Runnable {
    void run();
}

 

 

run() λ©”μ„œλ“œλŠ” νŒŒλΌλ―Έν„°κ°€ μ—†κ³ , 리턴 νƒ€μž…μ΄ μ—†λ‹€.

λ”°λΌμ„œ κ΄„ν˜Έ μ•ˆμ—λŠ” 아무 것도 적지 말고, μ€‘κ΄„ν˜Έ 블둝 μ•ˆμ— λ‚΄λΆ€ κ΅¬ν˜„λ§Œ μž‘μ„±ν•΄μ£Όλ©΄ λœλ‹€.

 

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("Hi");
            }
        });
        thread.start();
    }
}

 

 

πŸ“Œ Comparator μΈν„°νŽ˜μ΄μŠ€

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
	...
}

 

 

κ°„λ‹¨ν•˜κ²Œ StudentλΌλŠ” 클래슀λ₯Ό μž‘μ„±ν•˜κ³  Collections.sort() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν• κ±΄λ°,

Collections.sort() λ©”μ„œλ“œλŠ” 두 번째 인자둜 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μΈ Comparator νƒ€μž…μ„ λ°›λŠ”λ‹€.

public static <T> void sort(List<T> list, Comparator<? super T> c)

 

 

 

νŒŒλΌλ―Έν„°κ°€ 두 κ°œμ΄λ―€λ‘œ νŒŒλΌλ―Έν„°λ₯Ό 두 개 적어주고,

κ΅¬ν˜„λΆ€μ—λŠ” name ν•„λ“œλ₯Ό κΈ°μ€€μœΌλ‘œ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ν•˜λŠ” λ‘œμ§μ„ κ΅¬ν˜„ν•΄μ£Όμ—ˆλ‹€.

public class Main {
    public static void main(String[] args) {
        List<Student> poketmons = new ArrayList<>(List.of(
            new Student(1, "μž‰μ–΄ν‚Ή"),
            new Student(2, "μ•”μŠ€νƒ€"),
            new Student(3, "μžν¬μ½”μΌ")
        ));
        Collections.sort(poketmons, (p1, p2) -> p2.name.compareTo(p1.name)); // < -
        poketmons.forEach(student -> System.out.println(student.name));
    }
}

class Student {
    int id;
    String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

 

 

πŸ“Œ Consumer μΈν„°νŽ˜μ΄μŠ€

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

 

 

accept() λ©”μ„œλ“œλŠ” νŒŒλΌλ―Έν„°κ°€ ν•œ κ°œμ΄λ―€λ‘œ κ΄„ν˜Έκ°€ μƒλž΅ κ°€λŠ₯ν•˜λ‹€.

public class Main {
    public static void main(String[] args) {
        Consumer<String> messagePrinter = message -> System.out.println("λ©”μ‹œμ§€: " + message);
        messagePrinter.accept("μ•ˆλ…•ν•˜μ„Έμš”"); // λ©”μ‹œμ§€: μ•ˆλ…•ν•˜μ„Έμš”
    }
}

 

 

 

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

- λžŒλ‹€μ‹μ„ λ”μš± κ°„κ²°ν•˜κ²Œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ 문법이닀.

- λžŒλ‹€μ‹μ˜ κ΅¬ν˜„λΆ€μ—μ„œ νŠΉμ • λ©”μ„œλ“œ 호좜둜만 이루어진 경우, λžŒλ‹€μ‹μ€ λ§€κ°œλ³€μˆ˜λ₯Ό ν˜ΈμΆœν•œ λ©”μ„œλ“œλ‘œ μ „λ‹¬ν•˜κΈ°λ§Œ ν•œλ‹€.

- μ΄λ ‡κ²Œ λ§€κ°œλ³€μˆ˜ μ „λ‹¬λ§Œ μ΄λ£¨μ–΄μ§€λŠ” κ²½μš°μ—λŠ” λ§€κ°œλ³€μˆ˜ 이름 자체λ₯Ό μƒλž΅ν•œλ‹€λ©΄ λ”μš± κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆμ„ 것이닀.

- 이런 경우 λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό μ΄μš©ν•œλ‹€.

 

πŸ₯ λ©”μ„œλ“œ 참쑰의 κΈ°λ³Έ ν˜•νƒœ

정적 λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•˜λŠ” 경우 - `ν΄λž˜μŠ€μ΄λ¦„::λ©”μ„œλ“œμ΄λ¦„`

νŠΉμ • μΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•˜λŠ” 경우 - `μΈμŠ€ν„΄μŠ€::λ©”μ„œλ“œμ΄λ¦„`

μƒμ„±μžλ₯Ό μ°Έμ‘°ν•˜λŠ” 경우 - `ν΄λž˜μŠ€μ΄λ¦„::new`

 

 

 

정적 λ©”μ„œλ“œ μ°Έμ‘° μ˜ˆμ‹œ

public class Main {
    public static void main(String[] args) {
    
    	// λžŒλ‹€μ‹
        Function<String, Integer> lambdaEx = str -> Integer.parseInt(str);
        int parsedInt1 = lambdaEx.apply("1");
        
        // λ©”μ„œλ“œ μ°Έμ‘°
        Function<String, Integer> methodReferenceEx = Integer::parseInt;
        int parsedInt2 = methodReferenceEx.apply("1");
    }
}

 

 

νŠΉμ • μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘° μ˜ˆμ‹œ

public class Main {
    public static void main(String[] args) {
        Printer printer = new Printer();

        // λžŒλ‹€μ‹
        Consumer<String> lambdaConsumer = str -> printer.print(str);
        lambdaConsumer.accept("Hello");

        // λ©”μ„œλ“œ μ°Έμ‘°
        Consumer<String> methodReferenceConsumer = printer::print;
        methodReferenceConsumer.accept("Hello");
    }
}

class Printer {
    public void print(String message) {
        System.out.println("λ©”μ‹œμ§€: " + message);
    }
}

 

 

μƒμ„±μž μ°Έμ‘° μ˜ˆμ‹œ

public class Main {
    public static void main(String[] args) {
        // λžŒλ‹€μ‹
        Supplier<String> lambdaSupplier = () -> new String("Hello");
        System.out.println(lambdaSupplier.get());
        
        // λ©”μ„œλ“œ μ°Έμ‘°
        Supplier<String> methodReferenceSupplier = String::new;
        System.out.println(methodReferenceSupplier.get());
    }
}

 

728x90