์Šคํ„ฐ๋””) ๋‘๋ฒˆ์งธ ์Šคํ„ฐ๋”” ํ”ผ๋“œ๋ฐฑ ๋ฐ ์งˆ๋ฌธ ์ •๋ฆฌ๋‚ด์šฉ

2022. 4. 8. 09:21ยท๐Ÿ’ป Programming Language/C#

sealed ํ‚ค์›Œ๋“œ๋ฅผ ๋ฉ”์†Œ๋“œ์— ์‚ฌ์šฉ!

  • ๋ถ€๋ชจํด๋ž˜์Šค์—์„œ ์˜ค์ž‘๋™์„ ํ•˜๊ฒŒ๋” ํ•˜๋Š” ์ž์›์„ ์ž์‹ํด๋ž˜์Šค์—์„œ ๊ฑด๋“œ๋ฆฌ๋ฉด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ
    • ๋ฉ”์†Œ๋“œ์— sealed ํ•œ์ •์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.
class Parent
{
    public int num;
    public int count;

    public Parent(int num)
    {
        this.num = num;
        this.count = 0;
        Console.WriteLine("Parent ์ƒ์„ฑ์ž");
    }

    public virtual void addCount() { }
    public void showInfo()
    {
        Console.WriteLine("Num : {0}, Count : {1}", this.num, this.count);
    }
}

class Counter : Parent
{
    public Counter(int num) : base(num)
    {
        Console.WriteLine("Counter ์ƒ์„ฑ์ž");
    }

    public sealed override void addCount()
    {
        base.count++;
    }
}

class Calculator : Counter
{
    public Calculator(int num) : base(num)
    {
        Console.WriteLine("Calculator ์ƒ์„ฑ์ž");
    }

    public void add()
    {
        Console.WriteLine("๋”ํ•˜๊ธฐ 1");
        this.num++;
        base.addCount();
    }
    public void sub()
    {
        Console.WriteLine("๋นผ๊ธฐ 1");
        this.num--;
        base.addCount();
    }
}

class Program
{
    static void Main(string[] args)
    {
        Parent ncc = new Calculator(10);
        ncc.showInfo();

        Calculator c = (Calculator)ncc;
        c.add();
        c.add();

        c.sub();
        c.sub();
        c.sub();

        c.showInfo();
    }
}
Output

Parent ์ƒ์„ฑ์ž
Counter ์ƒ์„ฑ์ž
Calculator ์ƒ์„ฑ์ž
Num : 10, Count : 0
๋”ํ•˜๊ธฐ 1
๋”ํ•˜๊ธฐ 1
๋นผ๊ธฐ 1
๋นผ๊ธฐ 1
๋นผ๊ธฐ 1
Num : 9, Count : 5
  • ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ virtual๋กœ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์—์„œ sealedํ•œ์ •์ž์™€ override๋กœ ์„ ์–ธํ•˜๊ฒŒ๋˜๋ฉด ๊ทธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์—์„œ๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์—†๋‹ค.
    • ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•  ์ˆ˜ ์—†๋‹ค.
    • sealed ๋ฉ”์„œ๋“œ๋Š” ๊ผญ override์•ž์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • sealed๋ฅผ ์“ฐ๋ฉด ์ƒ์†์„ ์ค„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ ๋ถˆ๊ฐ€๋Šฅ

ํ˜•๋ณ€ํ™˜

  • as, () => ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ? + is

C# ๊ธฐ๋ณธ ์ž๋ฃŒํ˜• ๋ถ„๋ฅ˜
๊ตฌ๋ถ„ ์„ค๋ช…
์ •์ˆ˜ ํ‘œํ˜„ byte, shortm int, long
์‹ค์ˆ˜ ํ‘œํ˜„ float, double
๋ฌธ์ž ํ‘œํ˜„ char
์ฐธ, ๊ฑฐ์ง“ ํ‘œํ˜„ boolean

class Human
{
    public void showInfo()
    {
        Console.WriteLine("Human");
    }
}

class Programmer : Human
{
    public void programming()
    {
        Console.WriteLine("๊ฐœ๋ฐœ์ž");
    }
}

class Program
{
    static void Main(string[] args)
    {

        Human human = new Programmer();
        // as ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ˜•๋ณ€ํ™˜

        var aa = human as Programmer;

        if (aa is null) return;

        int? a = human as int;
        var result = human is int; // false
        // as ์—ฐ์‚ฐ์ž๋Š” ์ฐธ์กฐ ํ˜•์‹ ๋˜๋Š” null ํ—ˆ์šฉ ํ˜•์‹๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 'int'์€(๋Š”) null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ’ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

        string? str = human as string;
        // ์ฐธ์กฐ ๋ณ€ํ™˜, boxing ๋ณ€ํ™˜, unboxing ๋ณ€ํ™˜, ๋ž˜ํ•‘ ๋ณ€ํ™˜ ๋˜๋Š” null ํ˜•์‹ ๋ณ€ํ™˜์„ ํ†ตํ•ด 'AsisEx.Human' ํ˜•์‹์„ 'string'(์œผ)๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
        // =>`as`์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ€ํ™˜์€ ์ƒ์†, ์ฐธ์กฐ ๋ณ€ํ™˜ ๋ฐ boxing ๋ณ€ํ™˜์—์„œ ํ—ˆ์šฉ

        int x = (int)human;
        // => 'Human' ํ˜•์‹์„ 'int' ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.    
        // double y = (double)human; // => 'Human' ํ˜•์‹์„ 'double' ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
        // string str2 = (string)human; // => 'Human' ํ˜•์‹์„ 'string' ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

        Console.WriteLine(human is int);
        Console.WriteLine(human is double);
        Console.WriteLine(human is string);
    }
}
Output

False
False
False
  • ์ฐธ์กฐํ˜•์€ ๊ธฐ๋ณธ์ž๋ฃŒํ˜•์œผ๋กœ ๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.(as ๋ฐ ๊ฐ•์ œํ˜•๋ณ€ํ™˜ ๋‘˜๋‹ค ์•ˆ๋จ(()์‚ฌ์šฉ)) => C# ์ž์ฒด์—์„œ ๋ง‰๊ณ  ์žˆ์Œ
  • is๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์€ ํ˜•๋ณ€ํ™˜์ด ์•„๋‹Œ bool ํƒ€์ž…์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ํ†ตํ•ด ์ฒดํฌ๋ฅผ ํ•˜๋Š”๊ฒƒ์ด๊ธฐ์— ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • string์˜ ๊ฒฝ์šฐ ์ฐธ์กฐํ˜•์ด์ง€๋งŒ ๊ธฐ๋ณธ์ž๋ฃŒํ˜•์ฒ˜๋Ÿผ C#์—์„œ ๋ง‰๊ณ ์žˆ๋Š”๋“ฏํ•จ.

์ดˆ๊ธฐํ™”๋œ ๊ฐ์ฒด์™€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ์ž„์˜์˜ ๋ฉ”์†Œ๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒผ์„ ๋•Œ ๋™์ž‘ํ™•์ธ

class MyField
{
    public int field1;
    public int field2;
}

class AssignRefType
{
    static void Main(string[] args)
    {
        MyField? mf1 = null;
        MyField mf2 = new MyField() { field1 = 1, field2 = 2 };

        Test(mf1);
        Test(mf2);

        //Console.WriteLine("mf1 => field1 : {0} field2 : {1} ", mf1.field1, mf1.field2); => error
        //Console.WriteLine("mf2 => field1 : {0} field2 : {1} ", mf2.field1, mf2.field2);

        TestRef(ref mf1);
        TestRef(ref mf2);

        Console.WriteLine("mf1 => field1 : {0} field2 : {1} ", mf1.field1, mf1.field2);
        Console.WriteLine("mf2 => field1 : {0} field2 : {1} ", mf2.field1, mf2.field2);
    }

    private static void Test(MyField param)
    {
        if (param is null) param = new MyField();

        param.field1 = 3;
        param.field2 = 4;
    }

    private static void TestRef(ref MyField param)
    {
        if (param is null) param = new MyField();

        param.field1 = 3;
        param.field2 = 4;
    }
}
Output

mf1 => field1 : 3 field2 : 4
mf2 => field1 : 3 field2 : 4
  • mf1์˜ ๊ฒฝ์šฐ stack๋ฉ”๋ชจ๋ฆฌ์—์„œ null์„ ๊ฐ€์ง€๊ณ  heap์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜์–ด์žˆ์ง€ ์•Š๋‹ค. C#์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Call by Value์ด๊ธฐ ๋•Œ๋ฌธ์— null์„ ๋ฉ”์†Œ๋“œ๋กœ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋˜๊ณ  ์ง€์—ญ์ธ์Šคํ„ด์Šค๋กœ ํ™œ์šฉ๋˜๋˜ param์ด ๋‚ด๋ถ€์—์„œ๋งŒ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ›„์— ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ญ์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ mf1์€ ๊ทธ๋Œ€๋กœ null์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

๋‹คํ˜•์„ฑ ํ™•์ธ ์˜ˆ์ œ ์ถ”๊ฐ€

class A{
    public virtual void Print1()
    {
        Console.WriteLine("A : Print1");
    }

    public void Print2()
    {
        Console.WriteLine("A : Print2");
    }
}

class A1 : A
{
    public override void Print1()
    {
        Console.WriteLine("A1 : Print1");
    }

    public void Print2()
    {
        Console.WriteLine("A1 : Print2");
    }
}

class A2 : A
{
    public override void Print1()
    {
        Console.WriteLine("A2 : Print1");
    }

    public void Print2()
    {
        Console.WriteLine("A2 : Print2");
    }
}

class A3 : A
{
    public override void Print1()
    {
        Console.WriteLine("A3 : Print1");
    }

    public void Print2()
    {
        Console.WriteLine("A3 : Print2");
    }
}

class App
{
    static void Main(string[] args)
    {
        A[] arr = new A[]
        {
            new A1(),
            new A2(),
            new A3()
        };

        foreach (var a in arr)
        {
            a.Print1();
            a.Print2();
        }

    }
}
Output

A1 : Print1
A : Print2
A2 : Print1
A : Print2
A3 : Print1
A : Print2
  • A์˜ ์ž๋ฃŒํ˜•์œผ๋กœ A1, A2, A3 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์„๋•Œ A์—์„œ๋Š” ์ž์‹ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์œผ๋‚˜, override ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์žฌ์ •์˜ ๋œ ๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ ์ž์‹๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅ์ด ๋œ๋‹ค.
  • ์ฆ‰ override์— ์˜ํ•ด ์žฌ์ •์˜๋œ ๋ฉ”์†Œ๋“œ๋Š” ๋ถ€๋ชจํด๋ž˜์Šคํ˜•์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ž์‹ํด๋ž˜์Šคํ˜•์˜ ์ธ์Šคํ„ด์Šค๋กœ ์„ ์–ธํ–ˆ์„๋•Œ ์žฌ์ •์˜๋œ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

struct์˜ ํฌ๊ธฐ๊ฐ€ ์ผ์ •ํฌ๊ธฐ๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด value type์ด ์•„๋‹Œ ref type => Stack Overflow


๋ฉ”๋ชจ๋ฆฌ์ ˆ์•ฝ์€ ํด๋ž˜์Šค, ์†๋„๋Š” ๊ตฌ์กฐ์ฒด

  • ์ธ์Šคํ„ด์Šคํ•œ๋‹ค๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(์†๋„)
    • ๊ตฌ์กฐ์ฒด๋Š” ์Šคํƒ์— ๋ฐ”๋กœ ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ฐ”์ง€์ปฌ๋ ‰์…˜์ด ๋ฐœ์ƒ ํ•˜์ง€ ์•Š์Œ
    • ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋งˆ๋‹ค ํž™์— ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ํ๊ธฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ€๋ฐ”์ง€์ปฌ๋ ‰์…˜์ด ํ•„์š”.

  • ๋งŽ์€ ์–‘์˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋Š” NO(๋ฉ”๋ชจ๋ฆฌ)
    • ์ฐธ์กฐํ˜•์‹์ธ ํด๋ž˜์Šค๋Š” ๊ฐ’๋“ค์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๋งŒ ์Šคํƒ์— ์ €์žฅํ•˜์ง€๋งŒ ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’๋“ค์„ ๋ชจ๋‘ ์Šคํƒ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ํฌ๊ธฐ๋งŒํผ ์Šคํƒ์˜ ์œ„์น˜ ์—ญ์‹œ ์ปค์ง€๊ฒŒ ๋จ. ํ•˜์ง€๋งŒ ์Šคํƒ์€ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ๋งŽ์€ ์–‘์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฉด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค. => ํž™๋ฉ”๋ชจ๋ฆฌ ์นจ๋ฒ”

  • ๊ตฌ์กฐ์ฒด๋Š” ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?
    • ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ฑฐ๋‚˜, ์ˆ˜๋ช…์ด ์งง๊ณ , ์ž์ฃผ ํ• ๋‹น๋˜๋Š” ๊ฐ์ฒด๋Š” ๊ตฌ์กฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š”๊ฒŒ ์ข‹์Œ.

'๐Ÿ’ป Programming Language > C#' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

4๋ฒˆ์งธ ์Šคํ„ฐ๋”” ์ดํ›„ ์ •๋ฆฌ  (0) 2022.04.09
3๋ฒˆ์งธ ์Šคํ„ฐ๋”” ์ดํ›„ ์ •๋ฆฌ  (0) 2022.04.09
์Šคํ„ฐ๋””) ์ฒซ๋ฒˆ์งธ ์Šคํ„ฐ๋”” ํ”ผ๋“œ๋ฐฑ ๋ฐ ์งˆ๋ฌธ ์ •๋ฆฌ๋‚ด์šฉ  (0) 2022.04.08
43. ์Šค๋ ˆ๋“œ์™€ ํƒœ์Šคํฌ  (0) 2022.04.08
42. LINQ ์„ธ๋ถ€ ๋ฌธ๋ฒ•  (0) 2022.04.08
'๐Ÿ’ป Programming Language/C#' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • 4๋ฒˆ์งธ ์Šคํ„ฐ๋”” ์ดํ›„ ์ •๋ฆฌ
  • 3๋ฒˆ์งธ ์Šคํ„ฐ๋”” ์ดํ›„ ์ •๋ฆฌ
  • ์Šคํ„ฐ๋””) ์ฒซ๋ฒˆ์งธ ์Šคํ„ฐ๋”” ํ”ผ๋“œ๋ฐฑ ๋ฐ ์งˆ๋ฌธ ์ •๋ฆฌ๋‚ด์šฉ
  • 43. ์Šค๋ ˆ๋“œ์™€ ํƒœ์Šคํฌ
S.Honey
S.Honey
  • S.Honey
    Algo ์“ฐ์ž
    S.Honey
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (123)
      • ํšŒ๊ณ  (0)
        • ์ทจ์—… ํ›„ ํšŒ๊ณ  (0)
      • ๐Ÿƒ Frontend Road-Map (2)
        • ๐Ÿšฉ Summary (1)
        • ๐Ÿ“š Road-Map Contents (1)
        • ๐ŸŸง HTML (0)
        • ๐ŸŸฆ CSS (0)
        • ๐ŸŸจ Javascript (0)
        • โฌœ React (0)
        • ๐ŸŸช Redux (0)
      • Backend (0)
        • QueryDSL (0)
      • ๐Ÿ’ป Programming Language (54)
        • C# (51)
        • Flutter-Dart (3)
        • Java (0)
      • ๐Ÿ“š Computer Science (4)
        • Algorithms (4)
        • Database (0)
        • Network (0)
        • Operating System(OS) (0)
      • ๐Ÿ’ฏ CodingTest (60)
        • BaekJoon (22)
        • Programmers (34)
        • CodeTree (4)
      • โœ’๏ธ Design Pattern (1)
      • ๐Ÿฑ Etc (2)
        • Jenkins Plugin ์ œ์ž‘๊ธฐ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๋งํฌ

    • ๊ณต์ง€์‚ฌํ•ญ

      • ๐Ÿ“– ๊ณต๋ถ€ ์ฐธ๊ณ  ๊ต์žฌ ๋ฐ ์ž๋ฃŒ
    • ์ธ๊ธฐ ๊ธ€

    • ํƒœ๊ทธ

      ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
      JavaScript
      c#
      ๊ตฌํ˜„
      Algorithm
      BAEKJOON
      ์นด์นด์˜ค
      ์ฝ”๋“œํŠธ๋ฆฌ
      DP
      ์Šคํ„ฐ๋””
      Flutter
      programmers
      ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      ํŒŒ์ด์ฌ
      ๋ฌธ์ž์—ด ํŒŒ์‹ฑ
      ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
      ์‚ผ์„ฑsw์—ญํ…Œ
      ์“ฐ์…จ์ž–์•„
      sort
      DART
      ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰
      Java
      ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
      BFS
      ์ด์ง„ํƒ์ƒ‰
      ์•Œ๊ณ ๋ฆฌ์ฆ˜
      ์ž๋ฃŒ๊ตฌ์กฐ
      ๋ฐฑ์ค€
      JS
      ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    • ์ตœ๊ทผ ๋Œ“๊ธ€

    • ์ตœ๊ทผ ๊ธ€

    • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.1
    S.Honey
    ์Šคํ„ฐ๋””) ๋‘๋ฒˆ์งธ ์Šคํ„ฐ๋”” ํ”ผ๋“œ๋ฐฑ ๋ฐ ์งˆ๋ฌธ ์ •๋ฆฌ๋‚ด์šฉ
    ์ƒ๋‹จ์œผ๋กœ

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