[유니티 / C#] record(레코드)란?

⭐ 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

 

 

 

📣 정리해보기

 

값 기반 불변 데이터 객체를 쉽게 만들고 싶을 때 사용할 수 있는 타입입니다.

동등성을 판단하기에도 편리하고 부분 복사를 할 때도 굉장히 간편합니다