[C# 8.0] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (1) - ๋””ํดํŠธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„, ํŒจํ„ด ๋งค์นญ

2023. 2. 10. 11:35ยท๐Ÿ“ Language/โœ C#

C# 8.0์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

 

  • ๋””ํดํŠธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„(Default Inteface Members)
  • ํŒจํ„ด ๋งค์นญ
  • Nullable Reference Type
  • ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ
  • ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ
  • using ์„ ์–ธ
  • ๋„ ๋ณ‘ํ•ฉ ํ• ๋‹น์ž
  • ๊ตฌ์กฐ์ฒด ์ฝ๊ธฐ ์ „์šฉ ๋ฉค๋ฒ„
  • ์ •์  ๋กœ์ปฌ ํ•จ์ˆ˜
  • ๋ฌธ์ž์—ด ๋ณด๊ฐ„ ํ† ํฐ๊ณผ @ ํ† ํฐ ์ˆœ์„œ
  • Unmanaged constructed type

 

https://www.csharpstudy.com/Latest/CS8-def-itf-mem.aspx

 

C# 8 ๋””ํดํŠธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ - C# ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฐ์šฐ๊ธฐ (Learn C# Programming)

C# 8 : ๋””ํดํŠธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ ๊ตฌํ˜„ (Default Inteface Members) ์ง€๊ธˆ๊นŒ์ง€ (C# 8.0 ์ด์ „) C#์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ•œ๋ฒˆ ๋ฐฐํฌํ•œ ํ›„, ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๊ธฐ์กด์— ๊ตฌํ˜„๋œ ๋ชจ๋“  ํƒ€์ž…๋“ค์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ํƒ€

www.csharpstudy.com

 

1. ๋””ํดํŠธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„(Default Inteface Members)

์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ•œ๋ฒˆ ๋ฐฐํฌํ•œ ํ›„ ์ˆ˜์ •ํ•˜๋ฉด, ๊ธฐ์กด์— ๊ตฌํ˜„๋œ ๋ชจ๋“  ํƒ€์ž…๋“ค์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ๋‹ค. ๋”๊ตฌ๋‚˜ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ˆ˜์ •์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜์˜€๋‹ค. C# 8.0์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„์˜ Body ๊ตฌํ˜„ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„๋Š” ๋””ํดํŠธ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ๊ตฌํ˜„๋œ ํƒ€์ž…๋“ค์ด ์ƒˆ ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ตฌํ˜„๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ด ๋””ํดํŠธ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

  • ์ƒˆ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๋””ํดํŠธ ๋ฉค๋ฒ„ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉค๋ฒ„ ๊ตฌํ˜„์„ ์•ก์„ธ์Šค ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์บ์ŠคํŒ…๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
// ILogger v1.0
public interface ILogger
{
    void Log(string message);
}

// ILogger v2.0
public interface ILogger
{
    void Log(string message);

    // ์ถ”๊ฐ€๋œ ๋ฉค๋ฒ„
    void Log(Exception ex) => Log(ex.Message);
    void Log(string logType, string msg)
    {
        if (logType == "Error" || logType == "Warning" || logType == "Info")
        {
            Log($"{logType}: {msg}");
        }
        else
        {
            throw new ApplicationException("Invalid LogType");
        }
    }
}

class MyLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
        Debug.WriteLine(message);
    }

    // ๋””ํดํŠธ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ ์ •์˜ํ•จ
    public void Log(Exception ex)
    {
        Debug.WriteLine(ex.ToString());
    }
}

 

2. ํŒจํ„ด ๋งค์นญ

1) switch expression

๊ธฐ์กด switch ๋ฌธ(switch statement)์€ case ๋ณ„๋กœ ๊ฐ’์„ ์ฒดํฌํ•˜์—ฌ ๋ถ„๊ธฐํ•˜์ง€๋งŒ, switch ์‹(switch expression)์€ ๊ธฐ์กด์˜ case ๋ธ”๋ก๋“ค์„ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‹์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

  • switch ์‹์€ switch ๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ switch ์‹ ์•ž์— ๋ณ€์ˆ˜ ๋ช…์„ ์ ๊ณ  ๊ฐ case ๋ธ”๋ก์€ case, break, default ๋“ฑ์„ ์“ฐ์ง€ ์•Š๊ณ  (ํŒจํ„ด/๊ฐ’) => (์ˆ˜์‹)๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
static double GetArea(Shape shape)
{
    // switch expression
    double area = shape switch 
    {
        null        => 0, // null ์ฒดํฌ
        Line _      => 0,
        Rectangle r => r.Width * r.Height,
        Circle c    => Math.PI * c.Radius * c.Radius,
        _           => throw new ArgumentException() // default์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ
    };
    return area;
}

 

2) ์†์„ฑ ํŒจํ„ด(Property Pattern)

์†์„ฑ ํŒจํ„ด(Property Pattern)์€ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ„ด ๋งค์นญ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒƒ์ด๋‹ค. ์†์„ฑ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ switch ๋ฌธ์„ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ switch ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

public decimal CalcFee(Customer cust)
{
    // Property Pattern
    decimal fee = cust switch
    {
        { IsSenior: true } => 10,
        { IsVeteran: true } => 12,
        { Level: "VIP" } => 5,
        { Level: "A", IsMinor: false} => 10,
        _ => 20
    };
    return fee;
}

 

3) ํŠœํ”Œ ํŒจํ„ด(Tuple Pattern)

ํŠœํ”Œ ํŒจํ„ด(Tuple Pattern)์€ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜๋“ค์— ๊ธฐ๋ฐ˜ํ•œ ํŒจํ„ด ๋งค์นญ์„ ๋งํ•œ๋‹ค.

static int GetCreditLimit(int creditScore, int debtLevel)
{
    // Tuple Pattern
    var credit = (creditScore, debtLevel) switch
    {
        (850, 0) => 200,
        var (c, d) when c > 700 => 100,
        var (c, d) when c > 600 && d < 50 => 80,
        var (c, d) when c > 600 && d >= 50 => 60,
        _ => 40
    };
    return credit;
}

static void Main(string[] args)
{
    int creditPct = GetCreditLimit(650, 30);
    Console.WriteLine(creditPct);
}

 

4) ์œ„์น˜ ํŒจํ„ด(Positional pattern)

๋งŒ์•ฝ ์–ด๋–ค ํƒ€์ž…์ด Deconstructor๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, Deconstructor๋กœ๋ถ€ํ„ฐ ๋ฆฌํ„ด๋˜๋Š” ์†์„ฑ๋“ค์„ ๊ทธ ์œ„์น˜์— ๋”ฐ๋ผ ํŒจํ„ด ๋งค์นญ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„์น˜ ํŒจํ„ด(Positional pattern)์ด๋ผ ํ•œ๋‹ค.

class Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) => (X, Y) = (x, y);
    public void Deconstruct(out int x, out int y) =>
        (x, y) = (X, Y);
}

static string ์‚ฌ๋ถ„๋ฉด(Point point)
{
    // Positional pattern
    string quad = point switch
    {
        (0, 0) => "์›์ ",
        var (x, y) when x > 0 && y > 0 => "1์‚ฌ๋ถ„๋ฉด",
        var (x, y) when x < 0 && y > 0 => "2์‚ฌ๋ถ„๋ฉด",
        var (x, y) when x < 0 && y < 0 => "3์‚ฌ๋ถ„๋ฉด",
        var (x, y) when x > 0 && y < 0 => "4์‚ฌ๋ถ„๋ฉด",
        var (_, _) => "X/Y์ถ•",
        _ => null
    };
    return quad;
}

static void Main(string[] args)
{
    var p = new Point(-5, -2);
    string q = ์‚ฌ๋ถ„๋ฉด(p);
    Console.WriteLine(q); // 3์‚ฌ๋ถ„๋ฉด
}

 

5) ์žฌ๊ท€ ํŒจํ„ด(Recursive pattern)

ํŒจํ„ด์€ ๋‹ค๋ฅธ ์„œ๋ธŒ ํŒจํ„ด(sub pattern)๋“ค์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ณ  ํ•œ ์„œ๋ธŒ ํŒจํ„ด์€ ๋‚ด๋ถ€์— ๋˜ ๋‹ค๋ฅธ ์„œ๋ธŒ ํŒจํ„ด๋“ค์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๊ฒƒ์„ ์žฌ๊ท€ ํŒจํ„ด(Recursive pattern)์ด๋ผ ํ•œ๋‹ค.

IEnumerable<string> GetStudents(List<Person> people)
{
    foreach (var p in people)
    {
        // Recursive pattern
        if (p is Student { Graduated: false, Name: string name })
        {
            yield return name;
        }
    }
}
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Language/โœ C#' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C# 8.0] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (3) - using ์„ ์–ธ, ๋„ ๋ณ‘ํ•ฉ ํ• ๋‹น์ž, ๊ตฌ์กฐ์ฒด ์ฝ๊ธฐ ์ „์šฉ ๋ฉค๋ฒ„
  • [C# 8.0] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (2) - Nullable Reference Type, ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ
  • [C# 7.0] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (4) - ์ข…๋ฃŒ์ž(Deconstructor), ref local, ref return
  • [C# 7.0] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (3) - out ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ฐ๋Ÿด ํ‘œํ˜„
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[C# 8.0] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (1) - ๋””ํดํŠธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„, ํŒจํ„ด ๋งค์นญ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”