이번 포스팅은 C#을 공부하면서 새롭게 알게 된 "record" 타입에 대해 정리하였습니다.
record는 C# 9.0부터 사용할 수 있어 .net 버전에 따라 사용할 수 없는 버전도 있으니 적용하실 때 확인해 보시면 될 것 같습니다. C# record의 정의와 사용 방법에 대해 간단하게 작성하였습니다.
| record(레코드)란?
- record는 불변(immutable) 데이터 구조를 정의하기 위한 C#의 새로운 타입입니다. 클래스(class)와 구조체(struct)와 유사하게 보이지만, 일반적인 객체와 중요한 차이점이 있습니다.
- 첫 번째로, Record는 불변성을 강제합니다. 이것은 Record 인스턴스가 한 번 생성되면 내부 데이터를 수정할 수 없다는 것을 의미합니다. 이러한 불변성은 코드를 예측 가능하고 오류를 줄이는 데 도움이 됩니다.
- 두 번째로, Record는 값(value) 의미 체계를 가집니다. 즉, Record는 내용이 동일한 두 인스턴스가 실제로 같은 값을 나타내는 것으로 간주됩니다. 이것은 객체 비교를 보다 쉽게 만들어줍니다.
| record(레코드) 예제
예시) record를 이용한 Person 클래스 정의
public record Person(string FirstName, string LastName);
var person1 = new Person("민수", "김");
var person2 = new Person("철수", "이");
Console.WriteLine(person1 == person2); // false
- 이 예제에서는 Person 클래스를 record로 정의하고, 두 개의 Person 인스턴스를 생성합니다. Record는 값으로 취급되므로 person1과 person2는 내용이 동일하지 않으며 비교 결과는 false가 됩니다.
예시) 주소 정보를 표현하는 Address 클래스를 정의
public record Address(string Street, string City, string State, string ZipCode);
var address1 = new Address("123 Main St", "Anytown", "CA", "12345");
var address2 = new Address("456 Elm St", "Sometown", "CA", "67890");
Console.WriteLine(address1);
// 출력: Address { Street = 123 Main St, City = Anytown, State = CA, ZipCode = 12345 }
Console.WriteLine(address2);
// 출력: Address { Street = 456 Elm St, City = Sometown, State = CA, ZipCode = 67890 }
// Record의 불변성을 확인합니다.
// address1을 수정하려고 하면 컴파일 오류가 발생합니다.
// address1.State = "NY"; // 컴파일 오류 발생!
// Record 비교
bool areEqual = address1 == address2; // 두 주소 객체의 내용 비교
Console.WriteLine($"주소 동등 여부: {areEqual}"); // 출력: 주소 동등 여부: False
// 패턴 매칭을 사용하여 주소 정보 추출
if (address1 is Address { City: "Anytown" } specificAddress)
{
Console.WriteLine($"특정 도시의 주소: {specificAddress.Street}, {specificAddress.ZipCode}");
}
- 이 예제에서는 Address 클래스를 record로 정의하고, 두 개의 주소 인스턴스를 생성하여 비교합니다. record의 불변성을 확인하기 위해 주소 정보를 수정하려고 시도하면 컴파일 오류가 발생합니다.
| record(레코드) 장점
- 그러면 이렇게 record를 사용하는 방법을 확인 했습니다. class와 사용방법이 거의 비슷해 보이는데 record를 왜 사용하는 걸까요? 그건 record만의 장점이 있기 때문입니다. record의 3가지 장점에 대해 설명하겠습니다.
1. 코드가 간결해짐
- record를 사용하면 데이터 클래스를 정의하는데 많은 코드를 줄일 수 있습니다. C# 컴파일러가 자동으로 equals(), GetHashCode() 및 ToString() 메서드를 생성해 줍니다.
2. 불변성 보장
- record를 사용하면 데이터가 변경되지 않는다는 것을 보장할 수 있으므로 다중 스레드 환경에서 더 안전한 코드를 작성할 수 있습니다.
3. 패턴 매칭
- 앞서 Address 클래스를 정의하는 예제에 사용하였던 패턴 매칭을 사용할 때 유용하게 사용할 수 있습니다. 이는 복잡한 데이터 구조에서 원하는 요소를 추출하거나 조건에 따라 다른 동작을 수행하는 데 사용됩니다.
| 마치며
- C# record는 데이터를 다루는 데 효율적으로 사용할 수 있게 해 줍니다. 불변성을 보장하고 패턴 매칭과 같은 기능을 지원하여 코드의 가독성과 유지 보수성을 향상할 수 있습니다. C#으로 class나 struct 같은 데이터 구조를 만들 때 record도 고려해 보는 것이 좋을 것 같습니다.
다음 포스팅으로 찾아오겠습니다!
감사합니다 :)
'C#' 카테고리의 다른 글
[C#] Bitmap.LockBits 메서드 (0) | 2023.09.25 |
---|---|
[C#] unsafe / fixed 키워드 (0) | 2023.09.25 |
[C#] delegate(대리자) 마스터하기 (1) (0) | 2023.07.17 |
[C#] BackgroundWorker 클래스 정리 (0) | 2023.04.24 |
[C#] 파일 존재 유무 확인 하는 3가지 방법 (0) | 2023.04.17 |