2022. 9. 13. 00:00ㆍCSharp/Functional Programming
FP의 핵심 원칙 중 하나는 불변 데이터, 즉 생성된 후에 수정할 수 없는(상태를 변경할 수 없는) 객체이다.
변수가 변경될 때마다 새 변수를 만들어야 한다.
C#에서는 변경할 수 없는 사용자 정의 형식을 만드는 것이 가능하지만 함수형 언어만큼 쉽지는 않다.
### 일반적으로 많이 사용하는 문자열 형식인 string은 immutable 객체이다. ###
public class Person
{
public string FirstName { get; }
public string LastName { get; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public static Person SetFirstName(Person person, string value) => new Person(value, person.LastName);
public static Person SetLastName(Person person, string value) => new Person(person.FirstName, value);
}
위 class 를 보면 Person 객체의 FirstName 속성과 LastName 속성이 get 으로 되어 있다.
생성자 이외의 곳에서 수정 변경 할 수 없다는 뜻이다.
그렇기 때문에 수정을 하기 위해서는 새로운 class 를 생성해야 하고 그 class 에 변경된 값을 전달해줘야 한다.
var person = new Person("genius", "yun");
//person.FirstName = "king"; //error
var person2 = Person.SetFirstName(person, "king");
// 이제 Person2 의 FirstName 은 king 이다.
즉 원본은 변경되지 않고 FirstName 이 king 인 새로운 Person 객체를 생성하게 되는 것이다.
c# 에서 record 라는 keyword 가 나오기 전까지는 저러한 방식을 유지 했어야 했다.
하지만 record 가 나오고 나서 부터는 저러한 방식을 대체 하게 된다.
record Person(string FirstName, string LastName); // create record class
...
var person = new Person("genius", "yun");
//person.FirstName = "king"; //error
var person2 = person with { FirstName = "king" };
// FirstName = king , LastName = yun
이제 부터 c# 에서 immutable 객체를 사용 하려면 record 를 이용할 것이다.
record 에 대한 자세한 내용은 다음을 참고하자
https://yogingang.tistory.com/28
Record
C# 9부터 record 키워드를 사용하여 데이터를 캡슐화하는 기본 제공 기능을 제공하는 참조 형식을 정의합니다. 위치 매개 변수 또는 표준 속성 구문을 사용하여 변경할 수 없는 속성이 있는 레코
yogingang.tistory.com
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 |
Functional Programming 의 두가지 기본 개념 (0) | 2022.09.12 |