1.Record Type(레코드 타입)
1-1. 타입 설명
레코드 타입은 간단하게 말하면 모든 멤버가 불변의 값을 갖는 클래스라고 생각하면 편하다. (reference Type이기 때문에 구조체보다는 클래스에 가까운 것 같다. Immutable value(불변 값) 형식이다.
public record Monster
{
public string Name { get; }
public int Hp { get; }
public Person(string name, int hp)
=> (Name, Hp) = (name, hp);
}
class Program
{
static void Main(string[] args)
{
Monster p = new Monster("Slime_1", 10);
}
}
위의 예제를 보면 모든 필드가 { get; }, =>로 선언되어있다.
set 필드가 존재하지 않고, 람다식 형태인 두 멤버는 값을 변경할 수 없다.
그러니까 클래스 자체가 읽기 전용인 것이다.
이 클래스가 무슨 효용을 가지냐,, 음 일단 메모리상에 올려두고 두고두고 참조하면서 쓸 DB형식에 꽤나 유용할 것 같다.
기존에도 필드를 get; 으로 선언해서 위와 같은 클래스를 표현은 가능했지만 아예 명시적으로 record 형식으로 선언한다면야
더더욱 좋을 것이다.
애초에 record라는게 한번 쓰이면 읽을 수 없는 형태이기 때문에 이름을 이렇게 지은듯 하다.
1-2 Init setter
public record Monster
{
public string Name { get; init; }
public int Hp { get; init; }
}
class Program
{
static void Main(string[] args)
{
Monster m = new Monster
{
Name = "Slime_1",
Hp = 10
};
}
}
생성자를 사용하는 대신 각 필드에 setter을 Init으로 선언하고
객체를 생성할 때 마치 구조체를 새로 만드는 듯한 표현으로 선언하였다.
가독성 면에서 장점이 있다고 생각한다. 그렇지만 일반적인 필드와 같은 경우에는 사용하기 좀 그럴듯(굳이 프로퍼티로 생성하지 않아도 되는 필드에는 좋지 않을 것 같다.)
1-3 with 표현식
record 타입은 말했다 싶이 모든 멤버가 불변값 형식인데 아무리 불변값이어도 변경하고 싶을 때가 있다.
하지만 c#에서 변경은 허용하지 않고(이게 맞다고 본다. 애초에 불변인 값이 목적인데 변경을 허용하는 것은 구조적으로 문제가 있다고 본다.) ,기존의 값에서 특정 값을 변경하고 새로운 값을 만드는데 편리한 키워드로 with 표현식이 생겼다.
// 예제(3)
Monster slime_1 = new Monster
{
Name = "slime_1",
Hp = 30
};
Monster slime_2 = slime_1 with { Hp = 40 };
기존의 값에서 Hp만 변경했다.
1-4 상속과 객체 비교
// 예제(4)
Monster m1 = new Monster
{
Name = "Tom",
Hp = 10
};
Monster m2 = new Monster
{
Name = "slime_1",
Hp = 10
};
bool same = m1.Equals(m2); // true
bool b = ReferenceEquals(m1, m2); //false
Equals는 값을 판단하고 Refer..Equals는 참조값이 같은지 검사한다.
+ 또한 상속도 지원한다. 기존의 클래스와 동일.
'프로그래밍 언어 > c#' 카테고리의 다른 글
C# 9.0 최상위 프로그램, is not, switch문 기능 추가 (0) | 2023.05.16 |
---|---|
C# 8.0 Switch expression (0) | 2023.05.14 |
c# 8.0 정리 (0) | 2023.05.14 |
C# Var에 관해서 (0) | 2023.05.01 |
C#7.0 ref local, return, struct, Throw expression (0) | 2023.04.29 |