Immutable type or object

2022. 9. 13. 00:00CSharp/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 을 하기 위해 꼭 필요한 기본 개념이니 알아두고 넘어가도록 하자

 

관련영상

https://youtu.be/4iwDE-wGfS4

 

반응형