๐Ÿง ๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ

์˜ค๋Š˜์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠน๊ฐ•์„ ๋“ค์—ˆ๊ณ , ๋‚˜๋จธ์ง€ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ–ˆ๋‹ค.


๐Ÿง ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ธ์…˜ ์ง„ํ–‰
  • ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ด๊ฑฐํ˜•
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ๊ฐ’ํ˜•๊ณผ ์ฐธ์กฐํ˜•
  • ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ, ๋žŒ๋‹ค ๋ฐ LINQ
  • ๊ณ ๊ธ‰ ์ž๋ฃŒํ˜• ๋ฐ ๊ธฐ๋Šฅ

๐Ÿง ๊ธฐ์–ตํ•  ๊ฒƒ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฌธ์ œํ•ด๊ฒฐ?

์ž…๋ ฅ๋œ ์ž๋ฃŒ๋ฅผ ํ† ๋Œ€๋กœ ํ•˜์—ฌ ์›ํ•˜๋Š” ์ถœ๋ ฅ์„ ์œ ๋„ํ•˜์—ฌ ๋‚ด๋Š” ๊ทœ์น™์˜ ์ง‘ํ•ฉ.

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์— ์–ด๋–ค๊ฒŒ ์ตœ์„ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ์ง€๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๋Šฅ๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค.


๋‹ค์ค‘ ์ƒ์† ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ 

1. ๋‹ค์ด์•„๋ชฌ๋“œ ๋ฌธ์ œ(Diamond Problem)

๋‹ค์ค‘ ์ƒ์†์„ ํ—ˆ์šฉ -> ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๋™์ผํ•œ ๋ฉค๋ฒ„๋ฅผ ์ƒ์†.
์ฆ‰, ์–ด๋–ค ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ๋ชจํ˜ธํ•ด์ง„๋‹ค!

2. ์„ค๊ณ„์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€

๋‹ค์ค‘ ์ƒ์†์„ ํ—ˆ์šฉํ•˜๋ฉด, ํด๋ž˜์Šค๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค. ํด๋ž˜์Šค๊ฐ€ ๋‹ค์ค‘ ์ƒ์†์„ ๋ฐ›์„ ๊ฒฝ์šฐ, ์–ด๋–ค ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์–ด๋–ค ๋ฉค๋ฒ„๋ฅผ ์ƒ์†๋ฐ›์„์ง€ ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค.

3. ์ด๋ฆ„ ์ถฉ๋Œ๊ณผ ์ถฉ๋Œ ํ•ด๊ฒฐ์˜ ์–ด๋ ค์›€

์—ฌ๋Ÿฌ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ฉค๋ฒ„๋“ค์˜ ์ด๋ฆ„์ด ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋‹ค.
-> ๋ฉค๋ฒ„ ์žฌ์ •์˜, ๋ช…์‹œ์  ๋ถ€๋ชจํด๋ž˜์Šค ์ง€์ •

4. ์„ค๊ณ„์˜ ์ผ๊ด€์„ฑ๊ณผ ๋‹จ์ˆœ์„ฑ ์œ ์ง€

C#์€ ๋‹จ์ผ ์ƒ์†์„ ํ†ตํ•ด ์„ค๊ณ„์˜ ์ผ๊ด€์„ฑ๊ณผ ๋‹จ์ˆœ์„ฑ ์œ ์ง€.


์ธํ„ฐํŽ˜์ด์Šค ?

ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉค๋ฒ„๋“ค์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ.

1. ๋‹ค์ค‘ ์ƒ์† ์ง€์›

2. ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ ๊ตฌํ˜„

interface ImayInterface // interface ๋Š” ๋ณ€์ˆ˜๋ช… ์•ž์— I ๊ผญ !
{
	void Methid1();
    int Method2(string str);
}

class MyClass : IMyInterface
{
    public void Method1()
    {
        // ๊ตฌํ˜„
    }

    public int Method2(string str)
    {
        // ๊ตฌํ˜„
        return 0;
    }
}

์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ!

  1. ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ

๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„, ๋™์ผ ๊ธฐ๋Šฅ ๊ณต์œ  ๊ฐ€๋Šฅ!

  1. ๋‹ค์ค‘ ์ƒ์† ์ œ๊ณต

ํด๋ž˜์Šค๋Š” ๋‹จ์ผ ์ƒ์† ์ง€์›, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์ค‘ ์ƒ์† ์ง€์›!

  1. ์œ ์—ฐํ•œ ์„ค๊ณ„

ํด๋ž˜์Šค - ์ธํ„ฐํŽ˜์ด์Šค ๋А์Šจํ•œ ๊ฒฐํ•ฉ!

์ธํ„ฐํŽ˜์ด์Šค vs ์ถ”์ƒ ํด๋ž˜์Šค

์ธํ„ฐํŽ˜์ด์Šค

  1. ์ถ”์ƒ์ ์ธ ๋™์ž‘๋งŒ ์ •์˜, ๊ตฌํ˜„์„ ๊ฐ–์ง€ ์•Š์Œ.

  2. ๋‹ค์ค‘ ์ƒ์† ๊ฐ€๋Šฅ, ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ํด๋ž˜์Šค๊ฐ„ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถ”๊ณ , ์œ ์—ฐํ•œ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅ.

  4. ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ

  5. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ชจ๋“  ๋™์ž‘์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฌด๋ฅผ ๊ฐ€์ง€ ๋•Œ๋ฌธ์— ์ž‘์—…๋Ÿ‰ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ.

์ถ”์ƒ ํด๋ž˜์Šค

  1. ์ผ๋ถ€ ๋™์ž‘์˜ ๊ตฌํ˜„์„ ๊ฐ€์ง€๋ฉฐ, ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ๋‹จ์ผ ์ƒ์†๋งŒ ๊ฐ€๋Šฅ, ๋‹ค๋ฅธ ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์ƒ์† ๊ณ„์ธต ๊ตฌ์กฐ ํ˜•์„ฑ ๊ฐ€๋Šฅ.

  3. ๊ณตํ†ต๋œ ๋™์ž‘์„ ์ถ”์ƒํ™”, ์ฝ”๋“œ ์ค‘๋ณต ๋ฐฉ์ง€, ํ™•์žฅ์„ฑ ์ œ๊ณต

  4. ๋‹ค์ค‘ ์ƒ์† ๋ถˆ๊ฐ€๋Šฅ, ์ƒ์†์„ ํ†ตํ•ด ๊ฒฐํ•ฉ๋œ ํด๋ž˜์Šค ํ˜•์„ฑ -> ์œ ์—ฐ์„ฑ ์ œํ•œ

์ƒ์†์„ ์›ํ•˜๋ฉด ์ถ”์ƒ, ํ˜ธํ™˜์„ฑ์„ ์›ํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค!


์—ด๊ฑฐํ˜• (enum)

์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.

1. ๊ฐ€๋…์„ฑ

์—ฐ๊ด€๋œ ์ƒ์ˆ˜๋“ค์„ ๋ช…๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ, ์‹ค์ˆ˜๋กœ ์ž˜๋ชป ๋œ ๊ฐ’ ์ „๋‹ฌ ๋ฐฉ์ง€.

2. ์ž๊ธฐ ๋ฌธ์„œํ™”(Self - documenting)

์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์ˆ˜๋ฅผ ๋ช…๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ์Šค์œ„์น˜ ๋ฌธ๊ณผ ํ˜ธํ™˜์„ฑ

๋‹ค์–‘ํ•œ ์ƒ์ˆ˜ ๊ฐ’์— ๋Œ€ํ•œ ๋ถ„๊ธฐ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์›” ์—ด๊ฑฐํ˜•
public enum Month
{
    January = 1,
    February,
    March,
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December
}

// ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
static void ProcessMonth(int month)
{
    if (month >= (int)Month.January && month <= (int)Month.December)
    {
        Month selectedMonth = (Month)month;
        Console.WriteLine("์„ ํƒํ•œ ์›”์€ {0}์ž…๋‹ˆ๋‹ค.", selectedMonth);
        // ์›”์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€
    }
    else
    {
        Console.WriteLine("์˜ฌ๋ฐ”๋ฅธ ์›”์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");
    }
}

// ์‹คํ–‰ ์˜ˆ์ œ
static void Main()
{
    int userInput = 7; // ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์˜ˆ์‹œ
    ProcessMonth(userInput);
}

์˜ˆ์™ธ ์ฒ˜๋ฆฌ

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ƒํ™ฉ

try
{
    // ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ
}
catch (ExceptionType1 ex)
{
    // ExceptionType1์— ํ•ด๋‹นํ•˜๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
}
catch (ExceptionType2 ex)
{
    // ExceptionType2์— ํ•ด๋‹นํ•˜๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
}
finally
{
    // ์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
}

Finally ๋ธ”๋ก

์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ


๊ฐ’ํ˜• vs ์ฐธ์กฐํ˜•

๊ฐ’ํ˜• (Value Type)

๋ณ€์ˆ˜์— ๊ฐ’์„ ์ง์ ‘ ์ €์žฅ.

  • ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ , ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜, ์ „๋‹ฌํ•  ๋•Œ๋Š” ๊ฐ’ ๋ณต์‚ฌ.

  • int, float, double, bool ๋“ฑ์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋“ค์ด ๊ฐ’ํ˜•์— ํ•ด๋‹น.

  • ๋ณ€์ˆ˜ ๊ฐ„์˜ ๊ฐ’ ๋ณต์‚ฌ.

  • ๋ณ€์ˆ˜๊ฐ€ ๋…๋ฆฝ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง.

struct MyStruct
{
    public int Value;
}

MyStruct struct1 = new MyStruct();
struct1.Value = 10;

MyStruct struct2 = struct1; // struct2๋Š” struct1์˜ ๊ฐ’ ๋ณต์‚ฌ

struct2.Value = 20;

Console.WriteLine(struct1.Value); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 10

์ฐธ์กฐํ˜• (Reference Type)

๋ณ€์ˆ˜๊ฐ€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ)๋ฅผ ์ €์žฅ.

  • ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

  • ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹น, ์ „๋‹ฌ ์‹œ ์ฐธ์กฐ๊ฐ€ ๋ณต์‚ฌ

  • ํด๋ž˜์Šค, ๋ฐฐ์—ด, ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ์ด ์ฐธ์กฐํ˜•์— ํ•ด๋‹น.

  • ๋ณ€์ˆ˜ ๊ฐ„์˜ ์ฐธ์กฐ ๋ณต์‚ฌ.

  • ๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐ.

class MyClass
{
    public int Value;
}

MyClass obj1 = new MyClass();
obj1.Value = 10;

MyClass obj2 = obj1; // obj2๋Š” obj1๊ณผ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ

obj2.Value = 20;

Console.WriteLine(obj1.Value); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 20

๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ

๊ฐ’ํ˜•๊ณผ ์ฐธ์กฐํ˜• ์‚ฌ์ด์˜ ๋ณ€ํ™˜์„ ์˜๋ฏธ.

๋ฐ•์‹ฑ(Boxing)

  1. ๊ฐ’ํ˜•์„ ์ฐธ์กฐํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •.

  2. ๊ฐ’ํ˜• ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์˜ ํž™ ์˜์—ญ์— ํ• ๋‹น๋œ ๊ฐ์ฒด๋กœ ๋ž˜ํ•‘.

  3. ๋ฐ•์‹ฑ์„ ํ†ตํ•ด ๊ฐ’ํ˜•์ด ์ฐธ์กฐํ˜•์˜ ํŠน์ง•์„ ๊ฐ€์ง€๋ฉฐ, ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋กœ ๋‹ค๋ค„์งˆ ์ˆ˜ ์žˆ๋‹ค.

  4. ๋ฐ•์‹ฑ๋œ ๊ฐ’ํ˜•์€ ์ฐธ์กฐ๋กœ ์ „๋‹ฌ, ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ!

์–ธ๋ฐ•์‹ฑ(UnBoxing)

  1. ๋ฐ•์‹ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๊ฐ’ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •.

  2. ๋ฐ•์‹ฑ๋œ ๊ฐ์ฒด์—์„œ ๊ฐ’์„ ์ถ”์ถœ, ๊ฐ’ํ˜• ๋ณ€์ˆ˜์— ํ• ๋‹น.

  3. ๋ช…์‹œ์  ํƒ€์ž… ์บ์ŠคํŒ…, ๋Ÿฐํƒ€์ž„์—์„œ ๊ฒ€์‚ฌ.

  4. ์ž˜๋ชป๋œ ํ˜•์‹์œผ๋กœ ์–ธ๋ฐ•์‹ฑ -> ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ.

using System;

class Program
{
    static void Main()
    {
        // ๊ฐ’ํ˜•
        int x = 10;
        int y = x;
        y = 20;
        Console.WriteLine("x: " + x); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 10
        Console.WriteLine("y: " + y); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 20

        // ์ฐธ์กฐํ˜•
        int[] arr1 = new int[] { 1, 2, 3 };
        int[] arr2 = arr1;
        arr2[0] = 4;
        Console.WriteLine("arr1[0]: " + arr1[0]); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 4
        Console.WriteLine("arr2[0]: " + arr2[0]); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 4

        // ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ
        int num1 = 10;
        object obj = num1; // ๋ฐ•์‹ฑ
        int num2 = (int)obj; // ์–ธ๋ฐ•์‹ฑ
        Console.WriteLine("num1: " + num1); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 10
        Console.WriteLine("num2: " + num2); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 10
    }
}

๋ธ๋ฆฌ๊ฒŒ์ดํŠธ (Delegate)

๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํƒ€์ž…. (ํ•จ์ˆ˜ ํฌ์ธํ„ฐ)

  • evnet๋Š” ํ• ๋‹น์—ฐ์‚ฐ์ž (=) ์‚ฌ์šฉ๋ถˆ๊ฐ€๋Šฅ!

  • ์ ‘๊ทผ์ด ๋ถˆํŽธํ•  ๋•Œ, ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

  • ๋ณด์•ˆ์„ฑ, ์บก์Аํ™”๋ฅผ ์œ„ํ•ด ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ด๋ฒคํŠธ ํ˜ธ์ถœ X

// ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ์„ ์–ธ
public delegate void EnemyAttackHandler(float damage);

// ์  ํด๋ž˜์Šค
public class Enemy
{
    // ๊ณต๊ฒฉ ์ด๋ฒคํŠธ
    public event EnemyAttackHandler OnAttack;

    // ์ ์˜ ๊ณต๊ฒฉ ๋ฉ”์„œ๋“œ
    public void Attack(float damage)
    {
        // ์ด๋ฒคํŠธ ํ˜ธ์ถœ
        OnAttack?.Invoke(damage);
				// null ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž
				// null ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
    }
}

// ํ”Œ๋ ˆ์ด์–ด ํด๋ž˜์Šค
public class Player
{
    // ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ฐ›์€ ๋ฐ๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
    public void HandleDamage(float damage)
    {
        // ํ”Œ๋ ˆ์ด์–ด์˜ ์ฒด๋ ฅ ๊ฐ์†Œ ๋“ฑ์˜ ์ฒ˜๋ฆฌ ๋กœ์ง
        Console.WriteLine("ํ”Œ๋ ˆ์ด์–ด๊ฐ€ {0}์˜ ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…์—ˆ์Šต๋‹ˆ๋‹ค.", damage);
    }
}

// ๊ฒŒ์ž„ ์‹คํ–‰
static void Main()
{
    // ์  ๊ฐ์ฒด ์ƒ์„ฑ
    Enemy enemy = new Enemy();

    // ํ”Œ๋ ˆ์ด์–ด ๊ฐ์ฒด ์ƒ์„ฑ
    Player player = new Player();

    // ํ”Œ๋ ˆ์ด์–ด์˜ ๋ฐ๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ ์˜ ๊ณต๊ฒฉ ์ด๋ฒคํŠธ์— ์ถ”๊ฐ€
    enemy.OnAttack += player.HandleDamage;

    // ์ ์˜ ๊ณต๊ฒฉ
    enemy.Attack(10.0f);
}

๋žŒ๋‹ค (Lambda)

์ต๋ช…์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•.

  • ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„ ์—†์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜์— ํ• ๋‹น, ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ.

  • ๊ฐ„๋‹จํ•œ ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉ!

Calculate calc = (x, y) => 
{	
		return x + y;
};

Calculate calc = (x, y) => x + y;

Func, Action

Func, Action์€ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ œ๋„ค๋ฆญ ํ˜•์‹.

Func

  • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ.

  • ๋งˆ์ง€๋ง‰ ์ œ๋„ค๋ฆญ ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž… ๋‚˜ํƒ€๋ƒ„.

  • Function < int, string > => int ์ž…๋ ฅ, string ๋ฐ˜ํ™˜

// Func๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ์ •์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ๋ฉ”์„œ๋“œ
int Add(int x, int y)
{
    return x + y;
}

// Func๋ฅผ ์ด์šฉํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
Func<int, int, int> addFunc = Add;
int result = addFunc(3, 5);
Console.WriteLine("๊ฒฐ๊ณผ: " + result);

Action

  • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ.

  • Action < int, string > => int์™€ string์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๊ณ , ์•„๋ฌด ๊ฐ’ ๋ฐ˜ํ™˜ X

// Action์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ
void PrintMessage(string message)
{
    Console.WriteLine(message);
}

// Action์„ ์ด์šฉํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
Action<string> printAction = PrintMessage;
printAction("Hello, World!");

LINQ (Language Integrated Query)

.NET ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณต๋˜๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด ํ™•์žฅ.

  • ๋ฐ์ดํ„ฐ ์†Œ์Šค (์ปฌ๋ ‰์…˜, DB, XML ๋“ฑ)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ.
var result = from ๋ณ€์ˆ˜ in ๋ฐ์ดํ„ฐ์†Œ์Šค
             [where ์กฐ๊ฑด์‹]
             [orderby ์ •๋ ฌ์‹ [, ์ •๋ ฌ์‹...]]
             [select ์‹];
  • var ํ‚ค์›Œ๋“œ๋Š” ๊ฒฐ๊ณผ ๊ฐ’์˜ ์ž๋ฃŒํ˜•์„ ์ž๋™์œผ๋กœ ์ถ”๋ก .
  • from ์ ˆ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ง€์ •.
  • where ์ ˆ์€ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ์กฐ๊ฑด์‹์„ ์ง€์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋ง.
  • orderby ์ ˆ์€ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ •๋ ฌ ๋ฐฉ์‹์„ ์ง€์ •.
  • select ์ ˆ์€ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •.

Nullable

C#์—์„œ null ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’ํ˜•์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ํ˜•์‹.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ’ํ˜•์€ null ํ—ˆ์šฉ X

  • ๊ฐ’ํ˜• ๋ณ€์ˆ˜์— Null ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต.

  • ํ˜•์‹์€ ? ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ.

// Nullable ํ˜•์‹ ๋ณ€์ˆ˜ ์„ ์–ธ
int? nullableInt = null;
double? nullableDouble = 3.14;
bool? nullableBool = true;

// ๊ฐ’ ํ• ๋‹น ๋ฐ ์ ‘๊ทผ
nullableInt = 10;
int intValue = nullableInt.Value;

// null ๊ฐ’ ๊ฒ€์‚ฌ
if (nullableDouble.HasValue)
{
    Console.WriteLine("nullableDouble ๊ฐ’: " + nullableDouble.Value);
}
else
{
    Console.WriteLine("nullableDouble์€ null์ž…๋‹ˆ๋‹ค.");
}

// null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
// nullableInt ?? 0๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋ฉฐ, nullableInt๊ฐ€ null์ด๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
int nonNullableInt = nullableInt ?? 0;
Console.WriteLine("nonNullableInt ๊ฐ’: " + nonNullableInt);

๋ฌธ์ž์—ด ๋นŒ๋” (string Builder)

1. ๋ฌธ์ž์—ด ์กฐ์ž‘
Append(), Insert(), Replace(), Remove() ๋“ฑ
๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์ถ”๊ฐ€, ์‚ฝ์ž…, ์น˜ํ™˜, ์‚ญ์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰.

2. ๊ฐ€๋ณ€์„ฑ
StringBuilder๋Š” ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ์กฐ์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ ์ค„์–ด๋“ค์–ด๋„ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ๋ฐœ์ƒ X

3. ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
๋ฌธ์ž์—ด ์กฐ์ž‘ ์‹œ StringBuilder๋Š” ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์กฐ์ž‘ํ•˜๋ฏ€๋กœ, ๋ฐ˜๋ณต์ ์ธ ๋ฌธ์ž์—ด ์กฐ์ž‘ ์ž‘์—…์ด ๋ฐœ์ƒํ•ด๋„ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํ•ด์ œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ฒŒ ๊ฐ์†Œ.

StringBuilder sb = new StringBuilder();

// ๋ฌธ์ž์—ด ์ถ”๊ฐ€
sb.Append("Hello");
sb.Append(" ");
sb.Append("World");

// ๋ฌธ์ž์—ด ์‚ฝ์ž…
sb.Insert(5, ", ");

// ๋ฌธ์ž์—ด ์น˜ํ™˜
sb.Replace("World", "C#");

// ๋ฌธ์ž์—ด ์‚ญ์ œ
sb.Remove(5, 2);

// ์™„์„ฑ๋œ ๋ฌธ์ž์—ด ์ถœ๋ ฅ
string result = sb.ToString();
Console.WriteLine(result);

๐Ÿง ์ˆ˜๊ฐ•ํ›„๊ธฐ

๋‹ค์–‘ํ•œ C#์˜ ๋ฌธ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ฐœ์ธ ๊ณผ์ œ๋ฅผ ์ œ์ž‘ํ•˜๊ธฐ ์ „

๋ฏธ๋ฆฌ ๋“ค์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด, ๋” ํšจ์œจ์ ์ด๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ œ์ž‘ํ–ˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ,

๊ต‰์žฅํžˆ ์•„์‰ฝ๋‹ค!

๋‹ค์Œ ๊ณผ์ œ์—๋Š” ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ ํšจ์œจ์„ฑ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๋‹ค.

๐Ÿง ๋‚ด์ผ ํ•  ์ผ!

5๊ฐ• ๊ฐ•์˜ ์ˆ˜๊ฐ•์„ ์œ„ํ•ด Text RPG ์ˆ™์ œ๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ!

5๊ฐ• ๊ฐ•์˜ ๋“ฃ๊ธฐ!

0๊ฐœ์˜ ๋Œ“๊ธ€