record 변수란?
record는 C# 9.0에서 도입된 새로운 데이터 구조입니다. 주로 불변(immutable) 데이터 구조를 정의하는 데 사용되며, 값 기반 비교와 복사 기능이 내장되어 있습니다.
record는 클래스와 비슷하지만, 데이터 저장 및 관리를 더 간편하게 해줍니다.
클래스(Class)와의 차이점
불변성(Immutable)
record는 기본적으로 불변 객체로 사용되므로 생성된 이후에는 객체의 상태를 변경할 수 없습니다.
반면에 클래스는 가변 객체로, 생성 후에도 상태를 변경할 수 있습니다.
값 기반 비교
record는 객체의 참조가 아닌 값을 기반으로 비교하므로 두 개의 record 객체가 동일한 값을 가지면 같은 것으로 간주됩니다.
클래스는 참조 기반 비교를 사용합니다. 즉, 두 객체가 동일한 메모리 주소를 가리켜야 같은 것으로 간주됩니다.
편리한 복사 기능
record는 with 식을 사용하여 간편하게 복사본을 만들 수 있습니다.
클래스의 경우 이를 직접 구현해야 합니다.
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public override bool Equals(object obj)
{
if (obj is Person other)
{
return FirstName == other.FirstName && LastName == other.LastName;
}
return false;
}
public override int GetHashCode()
{
return HashCode.Combine(FirstName, LastName);
}
}
위 예시 코드와 같이 클래스를 사용하면 생성자, Equals, GetHashCode 등을 직접 구현해야 합니다.
public record Person(string FirstName, string LastName);
하지만, record를 사용하면 생성자, Equals, GetHashCode 등이 자동으로 생성됩니다.
var person1 = new Person("John", "Doe");
var person2 = new Person("John", "Doe");
// 값 비교
Console.WriteLine(person1 == person2); // True, 값이 같으면 동일 객체로 간주
// with 식을 사용한 복사
var person3 = person1 with { LastName = "Smith" };
Console.WriteLine(person3.FirstName); // John
Console.WriteLine(person3.LastName); // Smith
위 예시 코드와 같이 with 식을 사용하여 쉽게 데이터를 복사할 수 있습니다.