2022. 9. 12. 00:00ㆍCSharp/Functional Programming
함수형 프로그래밍에서 First (일급) 이란 어떤 의미 일까?
First-class functions
: 다른 함수의 입력 또는 출력으로 사용하거나 변수 또는 컬렉션에 저장 할 수 있는 모든것들
그렇다면 c# 에서 함수와 class 는 First 라고 할 수 있다.
여기서 잠깐 함수가 어떻게 First 야? 라고 할 수도 있다.
다음을 확인하자
Func<int, bool> isEven = n => n % 2 == 0;
var list = Enumerable.Range(1, 10);
var even = list.Where(isEven);
foreach (var item in even)
Console.WriteLine(item);
isEven 은 function 이고 이 function 을 입력 값으로 사용하고 있다. 물론 출력으로도 가능 하다.
그러므로 c# 에서 function 은 First-class Citizen 이라고 할 수 있다.
그렇다 그리 어려운 개념은 아니다.
Avoiding changing state
: 한 번 생성된 객체는 절대 변경되지 않으며 변수를 재할당 해서는 안된다.
자 여기에서 c# (java 등등) 류 언어의 가장 큰 단점이 있다. 기본적으로 c#은 모든것이 변경 가능하다.
var original = new List<int>() { 1, 7, 4, 3 };
PrintItems(original);
original.Sort();
PrintItems(original);
위와 같은 경우 sort 이후에 original 의 값이 변경된다.
즉 원본에 변경을 가한다는 것이다.
이것은 Thread 를 통해서 뭔가 작업을 하게 된다면 문제가 발생한다.
var numbers = Enumerable.Range(-10000, 20001).ToList();
Action task1 = () => { Console.WriteLine(numbers.Sum()); };
Action task2 = () => { numbers.Sort(); Console.WriteLine(numbers.Sum()); };
Parallel.Invoke(task2,task1, task1, task2, task1, task2, task2, task1);
실행하게 되면 다음과 유사한 오류가 발생 할 것이다.
항상 0 이어야 하는데 5번째 값이 6592가 되었고 AggregateException 을 보내주었다.
dotnet version 별로 무시하고 잘못된 값이 나오는 것도 있을것이고
최신 버전에 가까울 수록 저렇게 collection 이 변경되었다는 경고와 함께 Exception 을 throw 할 것이다.
그렇다면 이러한 것을 예방 할 수 는 없을까?
제일 위의 sort 문제는 아래와 같이 변경해 보자
int[] original =new List<int>() { 1, 7, 4, 3 };
PrintItems(original);
var sorted = original.OrderBy(x => x);
PrintItems(original);
이제 원본에 값이 변경 되지 않는것을 확인 할 수 있다.
Thread 문제는 다음과 같이 변경해 보자
var numbers = Enumerable.Range(-10000, 20001).ToList();
Action task1 = () => { Console.WriteLine(numbers.Sum()); };
Action task2 = () => { Console.WriteLine(numbers.OrderBy(x => x).Sum()); };
Parallel.Invoke(task2, task1, task1, task2, task1, task2, task2, task1);
즉 c# 에서는 Linq extension 을 이용하여 Functional Programming 을 돕고 있다.
언어의 한계성을 기능으로 커버한 대표적인 경우이다.
관련 영상
'CSharp > Functional Programming' 카테고리의 다른 글
순수 함수 (Pure Function) (0) | 2022.09.19 |
---|---|
Expression, Method chaining with Extension methods (0) | 2022.09.16 |
Functors (Map, Filter, Reduce) (0) | 2022.09.15 |
Higher Order Function (0) | 2022.09.14 |
Immutable type or object (0) | 2022.09.13 |