⭐ record 타입
레코드 타입은 데이터 중심 객체를 간결하게 정의하고,
불변성과 값 기반 동등성을 기본으로 지원하는 특별한 참조 타입입니다.
정의하는 방식에 따라 값 형식으로 선언될 수도 있습니다. (record struct로 정의한 경우)
클래스와 마찬가지로 abstract 키워드와 sealed 키워드를 사용할 수 있습니다.
주요 메서드로 ToString(), Equals(), GetHashCode(), Deconstruct() 등이 내장되어 있습니다.
💡 record 타입의 특징!
● 불변성: positional record나 init-only 프로퍼티를 사용해 불변 객체로 선언할 수 있습니다.
● 값 기반 비교: 속성의 값을 기준으로 비교합니다.
● with 표현식으로 복사, 변형: 원본 객체를 유지한 채 일부 속성만 바꾼 새 인스턴스를 간단히 생성합니다.
● 간결한 선언: 생성자, 프로퍼티를 한 줄로 구현할 수 있습니다.
● 상속 및 패턴 매칭: 다른 record로 부터 상속 가능, switch / is 패턴 매칭 시 구조 분해가 간단합니다.
● 여러 편의 기능: ToString(), Clone() 메서드 등의 편의 메서드가 있습니다.
💡 record와 class는 객체의 값 비교 기준이 다르다!
● class
○ 동일한 타입, 두 변수가 같은 객체를 가리킬 때 True
● record
○ 동일한 타입, 두 변수의 속성 값이 같을 때 True
//record 선언
public record Record_Person(string Name);
//클래스 선언
public class Class_Person
{
public string Name { get; set; }
}
//클래스 비교
var c_A = new Class_Person { Name = "Alice" };
var c_B = new Class_Person { Name = "Alice" };
Debug.Log($"== : {c_A == c_B}");
Debug.Log($"Equals : {c_A.Equals(c_B)}");
출력 결과:
== : False
Equals : False
//레코드 비교
var r_A = new Record_Person("Alice");
var r_B = new Record_Person("Alice");
Debug.Log($"== : {r_A == r_B}");
Debug.Log($"Equals : {r_A.Equals(r_B)}");
출력 결과:
== : True
Equals : True
● 코드를 보면 class / record 모두 동일한 값으로 두 개의 객체를 생성했지만 결과가 다릅니다
○ 클래스는 두 변수가 같은 객체를 참조하고 있는지를 기준으로 판단하기 때문에 False
○ 레코드는 두 변수의 객체가 같은 값을 가지고 있는지를 기준으로 판단하기 때문에 True
record 사용하기
record는 주생성자와 프로퍼티 방식으로 선언할 수 있습니다.
간단하게 선언할 때는 주생성자 방식
세세하게 제어하고 싶을 때는 프로퍼티 방식
이렇게 선언해주시면 되겠습니다.
record는 기본적으로 불변성을 가지고 있지만 프로퍼티 방식으로 선언할 때 {get; set;}을 사용하게 되면
값을 직접 변경할 수 있게 됩니다.
따라서 { get; init; }형식의 프로퍼티 설정을 권장하고 있습니다.
● 주생성자 방식
○ 간결하게 선언 가능
○ 속성별 세부 설정이 번거로움
○ 기본값 설정이 번거로움
● 프로퍼티 방식
○ 명시적으로 선언 가능
○ 속성별 세주 설정이 간단함
○ 기본값 설정이 쉬움
#주생성자 방식
public record Person(string FirstName, string LastName);
#프로퍼티 방식
public record Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
💡 with식
record는 with 식을 이용하여 편하게 값을 복사할 수 있습니다.
var person = new Record_Person("Alice", 22);
var person_Copy = person with { Name = "Penny" };
Debug.Log(person_Copy.Name);
Debug.Log(person_Copy.Age);
출력 결과:
Penny
22
📣 정리해보기
값 기반 불변 데이터 객체를 쉽게 만들고 싶을 때 사용할 수 있는 타입입니다.
동등성을 판단하기에도 편리하고 부분 복사를 할 때도 굉장히 간편합니다
'개발, IT > C#' 카테고리의 다른 글
| [유니티 / C#] Dictionary (딕셔너리) (0) | 2025.09.25 |
|---|---|
| [유니티 / C#] Stack(스택) & Queue(큐) (0) | 2025.09.25 |
| [유니티 / C#] String과 StringBuilder (0) | 2025.09.24 |
| [유니티 / C# ] 리스트(List)와 연결 리스트(Linked List) (0) | 2025.09.24 |
| [유니티 / C#] 인덱서 (Indexer) (0) | 2025.09.23 |