๋ถ๋ณ ๊ฐ์ฒด(Immutable Object)
๋ถ๋ณ ๊ฐ์ฒด๋ ๋ด๋ถ ์ํ(๋ฐ์ดํฐ)๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค. ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ ํน์ฑ ๋๋ฌธ์ ๋ถ๋ณ ๊ฐ์ฒด์์๋ ๋ฐ์ดํฐ ๋ณต์ฌ์ ๋น๊ต๊ฐ ๋ง์ด ์ด๋ค์ง๋ค.
๋ ์ฝ๋(record)๋ ์ด๋ฐ ๋ถ๋ณ ๊ฐ์ฒด์์ ๋น๋ฒํ๊ฒ ์ผ์ด๋๋ ๋ณต์ฌ์ ๋น๊ต ์ฐ์ฐ์ ํธํ๊ฒ ์ํํ ์ ์๋๋ก C# 9.0์์ ๋์ ๋ ํ์์ด๋ค.
record Transaction
{
...
}
"๋ถ๋ณ ๊ฐ์ฒด๋ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด๋ก๋ ๋ง๋ค ์ ์์ง ์์?"
ํด๋์ค๋ ์ฐธ์กฐ ํ์์ด๋ฏ๋ก ๋ชจ๋ ํ๋๋ฅผ readonly๋ก ์ ์ธํ๋ฉด ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค ์ ์๋ค.
๊ตฌ์กฐ์ฒด๋ ๊ฐ ํ์์ด๋ฏ๋ก readonly struct๋ก ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ธํ๋ฉด ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๋ชจ๋ ํ๋๋ฅผ readonly๋ก ์ ์ธํ๋๋ก ๊ฐ์ ํ๊ธฐ ๋๋ฌธ.
์ฐธ์กฐ ํ์๊ณผ ๊ฐ ํ์์ ์ฅ์ ๊ณผ ๋จ์ ์ ๋ฌด์์ด ์์๊น?
๊ฐ ํ์ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ ๋นํ ๋ ๊น์ ๋ณต์ฌ๋ฅผ ์ํํ๋ค.
๊น์ ๋ณต์ฌ๋, ๋ชจ๋ ํ๋๊ฐ ์ ๊ฐ์ฒด๊ฐ ๊ฐ์ง ํ๋์ 1:1๋ก ๋ณต์ฌํ๋ ๊ฒ์ ๋งํ๋ค.
๋ฐฐ์ด์ ์์์ ์ ๋ ฅํ๊ฑฐ๋ ํจ์ ์ธ์๋ก ์ฌ์ฉํ ๋๋ ๋ ๊น์ ๋ณต์ฌ๊ฐ ์ผ์ด๋๋ ๊ฒ์ด๋ค.
์ด๋ฐ ๊น์ ๋ณต์ฌ ๋ฐฉ๋ฒ์ ๋ชจ๋ ํ๋๋ฅผ 1:1๋ก ๋น๊ตํด์ผ ํ๋ ๋ถ๋ณ ๊ฐ์ฒด์ ํ์ํ ๋น๊ต ๋ฐฉ๋ฒ์ด๋ค.
๋ค๋ง, ํ๋๊ฐ ๋ง์์๋ก ๋ณต์ฌ ๋น์ฉ์ด ์ปค์ง๊ณ ํนํ ์ฌ๋ฌ ๊ณณ์์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๋ ์ปค์ง๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ์กด์ฌํ๋ค.
์ฐธ์กฐ ํ์์ ์์ ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์๋ ๊ฒ์ด ์ฅ์ ์ด๋ค. ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง ๋ณต์ฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ.
ํ์ง๋ง, ๊น์ ๋ณต์ฌ๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๊น์ ๋ณต์ฌ๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
๋ณดํต์ object๋ก๋ถํฐ ์์๋ฐ์ Equals( ) ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฌ์ฉํ๋ ํธ์ด๋ค.
"๊ทธ๋ฌ๋ฉด, ์ฐธ์กฐ ํ์๊ณผ ๊ฐ ํ์์ ์ฅ์ ๋ง ๊ฐ์ ธ์จ ๋ถ๋ณ ๊ฐ์ฒด๋ ๋ชป ๋ง๋ค์ด?"
๊ทธ๊ฒ์ด ๋ฐ๋ก ์ด๋ฒ ๊ธ์์ ์๊ฐํ๋, C# 9.0์์ ์ง์ํ๋ ๋ ์ฝ๋(Record) ํ์์ด๋ค.
์ฐธ์กฐ ํ์์ ๋น์ฉ ํจ์จ์ ๊ฐ์ง๋ฉด์๋, ๊ฐ ํ์์ฒ๋ผ ๊น์ ๋ณต์ฌ ๋น๊ต๋ฅผ ์ ๊ณตํ๋ค.
๋ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ํ ๋ฒ ์์๋ณด์.
๋ ์ฝ๋ ์ ์ธํ๊ธฐ
๋ ์ฝ๋๋ record ํค์๋์ ์ด๊ธฐํ ์ ์ฉ ์๋ ๊ตฌํ ํ๋กํผํฐ๋ฅผ ํจ๊ป ์ด์ฉํด์ ์ ์ธํ๋ค.
๋ฌผ๋ก ์ฐ๊ธฐ ๊ฐ๋ฅํ ํ๋กํผํฐ์ ํ๋ ๋ํ ์์ ๋กญ๊ฒ ์ ์ธํด ๋ฃ์ ์ ์๊ธด ํ๋ค.
record Transaction
{
public string From { get; init; }
public string To { get; init; }
public int Amount { get; init; }
}
์ด๋ ๊ฒ ์ ์ธํ ๋ ์ฝ๋๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค๋ฉด ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด ์ง๋ค.
Transaction T1 = new Transaction {From="Alice", To="Bob", Amount=100};
Transaction T2 = new Transaction {From="Bob", To="Charlie", Amount=300};
with๋ฅผ ์ด์ฉํ ๋ ์ฝ๋ ๋ณต์ฌ
C# ์ปดํ์ผ๋ฌ๋ ๋ ์ฝ๋ ํ์์ ์ํ ๋ณต์ฌ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ค.
ํ์ง๋ง, ์ด ๋ณต์ฌ ์์ฑ์๋ protected๋ก ์ ์ธ๋๊ธฐ ๋๋ฌธ์ ๋ช ์์ ์ผ๋ก ํธ์ถํ ์ ์๊ณ , ๋ค์๊ณผ ๊ฐ์ด with ์์ ์ด์ฉํด์ผ ํ๋ค.
Transaction T1 = new Transaction {From="Alice", To="Bob", Amount=100};
Transaction T2 = with T1 {To="Charlie"};
T1์ ๋ชจ๋ ๊ฐ์ T2์ ๋ณต์ฌํ ๋ค์, T2์ 'To' ํ๋กํผํฐ๋ง "Charlie"๋ก ์์ ํ ๊ฒ์ด๋ค.
์ด๋ฐ ์์ผ๋ก ์ ์ฉํ๊ฒ ๋ ์ฝ๋๋ฅผ ๋ณต์ฌํ๊ณ ์์ ํ ์ ์๋ค.
๋ ์ฝ๋ ๊ฐ์ฒด ๋น๊ตํ๊ธฐ
์ปดํ์ผ๋ฌ๋ ๋ ์ฝ๋์ ์ํ๋ฅผ ๋น๊ตํ๋ Equals( ) ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ๊ตฌํํ๋ค.
๋ ์ฝ๋๋ ์ฐธ์กฐ ํ์์ด์ง๋ง ๊ฐ ํ์์ฒ๋ผ Equals( ) ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์์๋ ๋น๊ต๊ฐ ๊ฐ๋ฅํ๋ค.
Transaction T1 = new Transaction {From="Alice", To="Bob", Amount=100};
Transaction T2 = new Transaction {From="Alice", To="Bob", Amount=100};
Console.WriteLine(T1.Equals(T2)); // True
- ์ด ๊ธ์ <์ด๊ฒ์ด C#์ด๋ค> ์ฑ ์ ๋ฐํ์ผ๋ก ๊ณต๋ถํ ๊ธ์ ๋๋ค.