๐Ÿ“Œ ์ž๋ฐ” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Functional Programming) ์ •๋ฆฌ

My Pale Blue Dotยท2025๋…„ 3์›” 20์ผ
0

JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
31/35
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025๋…„ 3์›” 20์ผ

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ


โœ… ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Functional Programming)์ด๋ž€?

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Functional Programming)์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure Function)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค.
๊ธฐ์กด ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Imperative Programming)๊ณผ ๋‹ค๋ฅด๊ฒŒ, ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ์—†์ด ์„ ์–ธ์ ์œผ๋กœ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ๋”ฐ๋ฅธ๋‹ค.

๐ŸŽฏ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฃผ์š” ํŠน์ง•

  1. ์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure Function)

    • ๋™์ผํ•œ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ๋ถˆ๋ณ€์„ฑ(Immutability)

    • ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ƒ์„ฑํ•œ๋‹ค.
  3. ๊ณ ์ฐจ ํ•จ์ˆ˜(Higher-Order Function)

    • ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ์ผ๊ธ‰ ๊ฐ์ฒด(First-Class Citizen)

    • ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
    • ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Declarative Programming)

    • ๋ช…๋ นํ˜•(Imperative) ๋ฐฉ์‹์ด ์•„๋‹Œ, "์–ด๋–ป๊ฒŒ(How)" ๊ฐ€ ์•„๋‹Œ "๋ฌด์—‡(What)" ์„ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

โœ… ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•„์ˆ˜ ์š”์†Œ

1๏ธโƒฃ ์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure Function)

  • ๋™์ผํ•œ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ๋‚ด์—์„œ ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.
// ์ˆœ์ˆ˜ ํ•จ์ˆ˜ ์˜ˆ์ œ: ์ž…๋ ฅ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•จ
public class PureFunctionExample {
    public static int add(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        System.out.println(add(2, 3)); // 5
    }
}

2๏ธโƒฃ ๋ถˆ๋ณ€์„ฑ(Immutability)

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

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

        // ์›๋ณธ ๋ฆฌ์ŠคํŠธ ๋ณ€๊ฒฝ ์—†์ด ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
        List<Integer> doubledNumbers = numbers.stream()
                                             .map(n -> n * 2)
                                             .collect(Collectors.toList());

        System.out.println("์›๋ณธ ๋ฆฌ์ŠคํŠธ: " + numbers);
        System.out.println("๋ณ€๊ฒฝ๋œ ๋ฆฌ์ŠคํŠธ: " + doubledNumbers);
    }
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

์›๋ณธ ๋ฆฌ์ŠคํŠธ: [1, 2, 3, 4, 5]
๋ณ€๊ฒฝ๋œ ๋ฆฌ์ŠคํŠธ: [2, 4, 6, 8, 10]

3๏ธโƒฃ ๊ณ ์ฐจ ํ•จ์ˆ˜(Higher-Order Function)

  • ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ฑฐ๋‚˜, ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜.
import java.util.function.Function;

public class HigherOrderFunctionExample {
    public static void main(String[] args) {
        Function<Integer, Integer> square = (n) -> n * n;
        System.out.println(square.apply(5)); // 25
    }
}

4๏ธโƒฃ ์ผ๊ธ‰ ๊ฐ์ฒด(First-Class Citizen)

  • ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
import java.util.function.Function;

public class FirstClassFunctionExample {
    public static void main(String[] args) {
        Function<Integer, Integer> doubleValue = (n) -> n * 2;
        System.out.println(applyFunction(doubleValue, 10)); // 20
    }

    public static int applyFunction(Function<Integer, Integer> func, int value) {
        return func.apply(value);
    }
}

5๏ธโƒฃ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Declarative Programming)

  • ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ฒ˜๋Ÿผ for ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , stream์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„.
import java.util.Arrays;
import java.util.List;

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

        // ๋ช…๋ นํ˜• ์Šคํƒ€์ผ
        for (int i = 0; i < numbers.size(); i++) {
            System.out.print(numbers.get(i) + " ");
        }

        System.out.println();

        // ์„ ์–ธํ˜• ์Šคํƒ€์ผ
        numbers.forEach(n -> System.out.print(n + " "));
    }
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

1 2 3 4 5
1 2 3 4 5

โœ… ์ž๋ฐ”์—์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ

์ž๋ฐ”๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹(Lambda Expression) ๋ฐ ์ŠคํŠธ๋ฆผ API(Stream API) ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•œ๋‹ค.

๐ŸŽฏ ๋žŒ๋‹ค ํ‘œํ˜„์‹(Lambda Expression)

๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

// ๋‘ ์ˆซ์ž๋ฅผ ๋”ํ•˜๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹
(int a, int b) -> a + b

โœ… ์ฐธ๊ณ  ์ž๋ฃŒ

๐Ÿ“Œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋… ์ •๋ฆฌ

๐Ÿ“Œ ๋žŒ๋‹ค & ์ŠคํŠธ๋ฆผ API ๊ด€๋ จ ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€