C#/C# 교과서

[C# 교과서] 61. 함수와 함수형 프로그래밍 소개하기

서니션 2023. 2. 11. 18:33
728x90
반응형

함수형 프로그래밍

함수형 프로그래밍은 상태 값을 가지지 않는 함수들을 연속으로 호출해서 사용하는 개발 스타일

메서드 체이닝을 사용하는 LINQ의 확장 메서드들이 함수형 프로그래밍의 전형적인 예


문과 식

C#의 문법은 문(statement)과 식(expression)으로 표현

'문은 여러 줄로 표현하고, 식은 한 줄로 표현할 수 있다'

 

함수형 프로그래밍에서는 문 대신 식을 사용하면 좋음

문은 파생 작업(부작용)이 발생할 가능성이 높기에 식을 사용하여 결괏값을 바로 가져오는 형태를 권장함

// 문
static string GetResultWithStatement(int score)
{
	string r;
    if (score >= 60)
    {
    	r = "합격";
    }
    else
    {
    	r = "불합격";
    }
    return r; // 변하는 값 반환
}

// 식
static string GetResultWithExpression(int score) =>
	score >= 60 ? "합격" : "불합격";

고차 함수

함수 자체를 매개변수 또는 반환값으로 가지는 함수가 고차 함수(higher-order function)

고차 함수는 함수 자체를 데이터로 봄

//[?] 고차 함수(Higher-Order Function): 함수 자체를 매개 변수 또는 반환값으로 가지는 함수
using System;

class HigherOrderFunction
{
    //[1] 매개 변수가 Action<T>
    static void FunctionParameterWithAction(Action<string> action, string message)
    {
        action(message);
    }

    //[2] 매개 변수가 Func<T>
    static void FunctionParameterWithFunc(Func<int, int> func, int number)
    {
        int result = func(number);
        Console.WriteLine($"{number} * {number} = {result}");
    }

    //[3] 반환값이 Action<T>
    static Action<string> FunctionReturnValueWithAction() =>
        msg => Console.WriteLine($"{msg}");

    //[4] 반환값이 Func<T>
    static Func<int, int> FunctionReturnValueWithFunc() => x => x * x;

    static void Main()
    {
        //[A] Action<T> 매개 변수 전달: 문자열을 받아 출력하는 함수 정의
        Action<string> action = message => Console.WriteLine(message);
        FunctionParameterWithAction(action, "고차 함수: 매개 변수");

        //[B] Func<T> 매개 변수 전달: 정수 값을 받아 두 번 곱한 후 다시 정수 값 반환
        Func<int, int> func = x => x * x;
        FunctionParameterWithFunc(func, 3);

        //[C] Action<T> 반환값 
        FunctionReturnValueWithAction()("고차 함수: 반환값");

        //[D] Func<T> 반환값
        int number = 3;
        int result = FunctionReturnValueWithFunc()(number);
        Console.WriteLine($"{number} * {number} = {result}"); // 9 
    }
}

LINQ의 Aggregate 메서드를 사용하여 최댓값, 최솟값 구하기

using System;
using System.Linq;

class AggregateDemo
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5 };

        //[1] Aggregate 확장 메서드로 최댓값 구하기
        int max = numbers.Aggregate((f, s) => f > s ? f : s);
        Console.WriteLine(max);

        //[2] Aggregate 확장 메서드로 최솟값 구하기
        int min = numbers.Aggregate((c, n) => c < n ? c : n);
        Console.WriteLine(min);
    }
}

 

728x90
반응형