본문 바로가기
C#

C# 9, 10) record의 정의, 사용법, class와 다른 점

by Fastlane 2022. 1. 6.
728x90
반응형

출처 : https://thecodeblogger.com/2021/11/26/c-record-how-is-it-different-from-classes/

Record란?

 

Record는 사용자정의 type을 생성할 수 있는 또다른 방법이다. 

 

class, struct와 같이 record도 정의할 수 있다. 다른 점은 'class' or 'struct' keyword 대신 'record' keyword를 사용한다. 

record type은 값 형식 또는 참조 형식으로 정의될 수 있다. 

 

  • record class로 정의하면 참조 형식, class는 빼도 된다. 
  • record struct로 정의하면 값 형식
  • abstract를 붙이면 인스턴스화 할 수 없고, sealed를 붙이면 상속할 수 없다.

Class와 다른 점은?

class와 마찬가지로, record 또한 참조 형식이다. 하지만, 객체가 같은지 비교를 한는 기준이 다르다. 

 

class type의 두 변수가 같을 경우 

  • 동일한 class type
  • 두 변수가 같은 object를 가리킬 때

record type의 두 변수가 같을 경우 

  • 동일한 record type
  • records의 값이 같을 때 
namespace ConsoleApp1
{
    public abstract record Person(string FirstName, string LastName);

    public record Employee(string EmployeeId, string FirstName, string LastName)
    : Person(FirstName, LastName);

    public abstract class PersonClass
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class EmployeeClass : PersonClass
    {
        public string EmployeeId { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {
            var firstRecord = new Employee("EMP_ID_1", "John", "Doe");
            var secondRecord = new Employee("EMP_ID_1", "John", "Doe");
            var compareResult = firstRecord == secondRecord ? "ARE EQUAL" : "ARE NOT EQUAL";
            Console.WriteLine("----------------------------------------------------");
            Console.WriteLine();
            Console.WriteLine($"RECORD-1 : {firstRecord.ToString()}");
            Console.WriteLine($"RECORD-2 : {secondRecord.ToString()}");
            Console.WriteLine($"RECORDS: {compareResult}");
            Console.WriteLine();

            // -------------------------------------------------------------
            // Classes - Equality Comaprison
            // -------------------------------------------------------------
            var firstObj = new EmployeeClass()
            {
                EmployeeId = "EMP_ID_1",
                FirstName = "John",
                LastName = "Doe"
            };
            var secondObj = new EmployeeClass()
            {
                EmployeeId = "EMP_ID_1",
                FirstName = "John",
                LastName = "Doe"
            };

            Console.WriteLine("----------------------------------------------------");
            Console.WriteLine();
            var classComparison = firstObj == secondObj ? "ARE EQUAL" : "ARE NOT EQUAL";
            Console.WriteLine($"Object-1 : {firstObj.ToString()}");
            Console.WriteLine($"Object-2 : {secondObj.ToString()}");
            Console.WriteLine($"Classes: {classComparison }");
            Console.WriteLine();
            Console.WriteLine("----------------------------------------------------");
        }
    }

}
----------------------------------------------------

RECORD-1 : Employee { FirstName = John, LastName = Doe, EmployeeId = EMP_ID_1 }
RECORD-2 : Employee { FirstName = John, LastName = Doe, EmployeeId = EMP_ID_1 }
RECORDS: ARE EQUAL

----------------------------------------------------

Object-1 : ConsoleApp1.EmployeeClass
Object-2 : ConsoleApp1.EmployeeClass
Classes: ARE NOT EQUAL

----------------------------------------------------

class와 toString()함소를 호출했을때의 결과와, equal 비교결과가 다르다. 

 

그 이유는 compiler가 record type을 위해서 아래 함수들을 override하여 생성하기 때문이다. 

728x90
반응형

댓글