함수형 프로그래밍
함수형 프로그래밍은 상태 값을 가지지 않는 함수들을 연속으로 호출해서 사용하는 개발 스타일
메서드 체이닝을 사용하는 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);
}
}
'C# > C# 교과서' 카테고리의 다른 글
[C# 교과서] A. 디버거 사용하기 (0) | 2023.02.11 |
---|---|
[C# 교과서] 62. 모던 C# (0) | 2023.02.11 |
[C# 교과서] 60. 네트워크 프로그래밍 맛보기 (0) | 2023.02.11 |
[C# 교과서] 59. XML과 JSON 맛보기 (0) | 2023.02.11 |
[C# 교과서] 58. 스트림과 파일 입출력 맛보기 (0) | 2023.02.10 |