C#

C# - λ©”μ„œλ“œμ™€ ꡬ쑰체 μ™„μ „ 정볡: μž¬μ‚¬μš©μ„±λΆ€ν„° ꡬ쑰 섀계 + ꡬ쑰체 λ©”λͺ¨λ¦¬

Dev_Jen 2025. 7. 7. 12:51
λ°˜μ‘ν˜•

🧩 λ©”μ„œλ“œλž€ 무엇인가?

βœ… λ©”μ„œλ“œμ˜ μ •μ˜

λ©”μ„œλ“œ(Method)λŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ νŠΉμ •ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ„λ‘ μ •μ˜λœ μ½”λ“œ 블둝이닀.
λ³΅μž‘ν•œ μ½”λ“œλ₯Ό κΈ°λŠ₯λ³„λ‘œ λΆ„λ¦¬ν•˜μ—¬ λͺ¨λ“ˆν™”ν•¨μœΌλ‘œμ¨ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±, 가독성, μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆλ‹€.

C#μ—μ„œ λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€λ‚˜ ꡬ쑰체 내에 μ •μ˜λ˜λ©°, μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœν•  수 μžˆλ‹€. λ©”μ„œλ“œλŠ” 일반적으둜 λ‹€μŒκ³Ό 같은 역할을 μˆ˜ν–‰ν•œλ‹€.


✨ λ©”μ„œλ“œμ˜ μ£Όμš” νŠΉμ§•

  • μ½”λ“œ μž¬μ‚¬μš©μ„±
    반볡적으둜 μ‚¬μš©λ˜λŠ” μ½”λ“œλ₯Ό λ©”μ„œλ“œλ‘œ μ •μ˜ν•΄ ν•œ 번만 μž‘μ„±ν•˜λ©΄ μ—¬λŸ¬ κ³³μ—μ„œ ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.
  • λͺ¨λ“ˆν™”(Modularity)
    ν”„λ‘œκ·Έλž¨μ„ 논리적인 λ‹¨μœ„λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. 각 λ©”μ„œλ“œλŠ” ν•˜λ‚˜μ˜ μž‘μ—…μ—λ§Œ μ§‘μ€‘ν•˜λ„λ‘ μ„€κ³„ν•˜λŠ” 것이 μ’‹λ‹€.
  • 가독성 ν–₯상
    λ©”μ„œλ“œ μ΄λ¦„λ§Œ 보고 μ–΄λ–€ λ™μž‘μ„ μˆ˜ν–‰ν•˜λŠ”μ§€ 예츑 κ°€λŠ₯ν•˜λ―€λ‘œ μ½”λ“œ μ „μ²΄μ˜ 흐름을 μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ§„λ‹€.
  • μœ μ§€λ³΄μˆ˜ μš©μ΄μ„±
    버그 μˆ˜μ •μ΄λ‚˜ κΈ°λŠ₯ λ³€κ²½ μ‹œ, λ©”μ„œλ“œ λ‹¨μœ„λ‘œ μˆ˜μ •μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ λ‹€λ₯Έ μ½”λ“œμ— λ―ΈμΉ˜λŠ” 영ν–₯을 μ΅œμ†Œν™”ν•  수 μžˆλ‹€.
  • 쀑볡 제거
    λ™μΌν•˜κ±°λ‚˜ μœ μ‚¬ν•œ μ½”λ“œκ°€ μ—¬λŸ¬ 번 λ°˜λ³΅λ˜λŠ” 경우, ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ‘œ μΆ”μΆœν•΄ 쀑볡을 μ œκ±°ν•  수 μžˆλ‹€.

🧠 μ™œ λ©”μ„œλ“œκ°€ ν•„μš”ν•œκ°€?

초보 κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ½”λ“œμ—μ„œ κ°€μž₯ ν”νžˆ λ‚˜νƒ€λ‚˜λŠ” λ¬Έμ œλŠ” 같은 λ‘œμ§μ„ λ°˜λ³΅ν•΄μ„œ μž‘μ„±ν•˜λŠ” 것이닀.
μ΄λ•Œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•„λž˜μ™€ 같은 이점을 λˆ„λ¦΄ 수 μžˆλ‹€.

 

κΈ°μ‘΄ μ½”λ“œ 문제 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  경우
λ°˜λ³΅λ˜λŠ” μ½”λ“œλ‘œ 가독성 μ €ν•˜ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ‘œ λŒ€μ²΄ κ°€λŠ₯
μˆ˜μ •ν•  λ•Œ λͺ¨λ“  뢀뢄을 μˆ˜μ •ν•΄μ•Ό 함 λ©”μ„œλ“œ ν•˜λ‚˜λ§Œ μˆ˜μ •ν•˜λ©΄ 됨
κΈ°λŠ₯ ꡬ뢄이 어렀움 각 κΈ°λŠ₯λ³„λ‘œ λ‚˜λˆ μ„œ ꡬ성 κ°€λŠ₯
 

πŸ“Œ μ˜ˆμ‹œ: λ©”μ„œλ“œ 없이 μž‘μ„±ν•œ μ½”λ“œ

Console.WriteLine("μ•ˆλ…•ν•˜μ„Έμš”!");
Console.WriteLine("μ•ˆλ…•ν•˜μ„Έμš”!");
Console.WriteLine("μ•ˆλ…•ν•˜μ„Έμš”!");

πŸ“Œ μ˜ˆμ‹œ: λ©”μ„œλ“œ μ‚¬μš© ν›„

void PrintGreeting() {
    Console.WriteLine("μ•ˆλ…•ν•˜μ„Έμš”!");
}

// 호좜
PrintGreeting();
PrintGreeting();
PrintGreeting();

→ μ½”λ“œμ˜ κΈΈμ΄λŠ” 쀄고, 가독성은 ν–₯μƒλœλ‹€.

 

🧩 λ©”μ„œλ“œ μ„ μ–Έκ³Ό 호좜

βœ… λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λŠ” 방법

C#μ—μ„œ λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό 같은 ꡬ쑰둜 μ„ μ–Έν•œλ‹€.

[μ ‘κ·Ό μ œν•œμž] [λ°˜ν™˜ νƒ€μž…] [λ©”μ„œλ“œ 이름]([λ§€κ°œλ³€μˆ˜ λͺ©λ‘])
{
    // μ‹€ν–‰ν•  μ½”λ“œ
}

예λ₯Ό λ“€μ–΄,

public int Add(int a, int b)
{
    return a + b;
}

μœ„μ˜ μ˜ˆμ‹œλŠ” AddλΌλŠ” μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•œ 것이닀.
이 λ©”μ„œλ“œλŠ” 두 개의 μ •μˆ˜ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ•„ ν•©μ‚°ν•œ κ²°κ³Όλ₯Ό μ •μˆ˜ν˜•μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.


✨ 각 ꡬ성 μš”μ†Œ μ„€λͺ…

  • μ ‘κ·Ό μ œν•œμž (Access Modifier)
    μ™ΈλΆ€μ—μ„œ 이 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•œλ‹€.
    • public: 클래슀 μ™ΈλΆ€μ—μ„œλ„ μ ‘κ·Ό κ°€λŠ₯
    • private: μ„ μ–Έλœ 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ (κΈ°λ³Έκ°’)
    • protected, internal 등도 쑴재
  • λ°˜ν™˜ νƒ€μž… (Return Type)
    λ©”μ„œλ“œκ°€ μ‹€ν–‰ ν›„ λ°˜ν™˜ν•˜λŠ” λ°μ΄ν„°μ˜ μžλ£Œν˜•μ„ λ‚˜νƒ€λ‚Έλ‹€.
    • 예: int, string, bool, void λ“±
    • λ°˜ν™˜κ°’μ΄ 없을 경우 voidλ₯Ό μ‚¬μš©
  • λ©”μ„œλ“œ 이름 (Method Name)
    λ©”μ„œλ“œλ₯Ό μ‹λ³„ν•˜λŠ” 이름이닀. 호좜 μ‹œ 이 이름을 μ‚¬μš©ν•œλ‹€.
    • 예: PrintMessage, CalculateSum λ“±
  • λ§€κ°œλ³€μˆ˜ λͺ©λ‘ (Parameter List)
    λ©”μ„œλ“œ 싀행에 ν•„μš”ν•œ μ™ΈλΆ€ 데이터λ₯Ό μ „λ‹¬λ°›λŠ” λ³€μˆ˜ λͺ©λ‘μ΄λ‹€.
    • μžλ£Œν˜•κ³Ό λ³€μˆ˜λͺ…을 ν•¨κ»˜ μ •μ˜ν•œλ‹€
    • 0개 이상 μ •μ˜ κ°€λŠ₯ν•˜λ©°, μ‰Όν‘œ(,)둜 ꡬ뢄

πŸ“Œ 예제: λ‹€μ–‘ν•œ λ©”μ„œλ“œ μ„ μ–Έ

// λ°˜ν™˜κ°’μ΄ μ—†λŠ” λ©”μ„œλ“œ
public void SayHello()
{
    Console.WriteLine("μ•ˆλ…•ν•˜μ„Έμš”!");
}

// λ§€κ°œλ³€μˆ˜λ₯Ό λ°›λŠ” λ©”μ„œλ“œ
public void GreetUser(string name)
{
    Console.WriteLine($"{name}λ‹˜, λ°˜κ°‘μŠ΅λ‹ˆλ‹€!");
}

// λ°˜ν™˜κ°’μ΄ μžˆλŠ” λ©”μ„œλ“œ
public int Multiply(int a, int b)
{
    return a * b;
}

πŸ§ͺ λ©”μ„œλ“œ 호좜 방법

λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ €λ©΄ λ©”μ„œλ“œ 이름 뒀에 κ΄„ν˜Έλ₯Ό μ—΄κ³ , ν•„μš”ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό λ„£λŠ”λ‹€.

λ©”μ„œλ“œμ΄λ¦„(전달할 μΈμžκ°’);

예제

SayHello();                      // λ§€κ°œλ³€μˆ˜ μ—†μŒ
GreetUser("μž¬μ€");              // λ¬Έμžμ—΄ λ§€κ°œλ³€μˆ˜ 전달
int result = Multiply(3, 4);     // λ°˜ν™˜κ°’ μ‚¬μš©

πŸ’‘ μ£Όμ˜μ‚¬ν•­

  • 호좜 μ‹œ μ „λ‹¬ν•˜λŠ” 인자의 개수, μˆœμ„œ, μžλ£Œν˜•μ€ λ©”μ„œλ“œ μ„ μ–Έκ³Ό λ°˜λ“œμ‹œ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.
  • λ©”μ„œλ“œλŠ” 호좜 μ „μ—λŠ” μ‹€ν–‰λ˜μ§€ μ•ŠμœΌλ©°, λ°˜λ“œμ‹œ ν˜ΈμΆœν•΄μ•Ό μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€.
  • void λ©”μ„œλ“œλŠ” 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ³„λ„λ‘œ λ³€μˆ˜μ— μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

πŸ“˜ μ‹€μ „ 예제

void PrintStars(int count)
{
    for (int i = 0; i < count; i++)
    {
        Console.Write("*");
    }
    Console.WriteLine();
}

// 호좜
PrintStars(10);
PrintStars(5);

 

 

🧩 λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’

βœ… λ§€κ°œλ³€μˆ˜(Parameter)λž€?

λ§€κ°œλ³€μˆ˜λŠ” λ©”μ„œλ“œκ°€ μ™ΈλΆ€λ‘œλΆ€ν„° 데이터λ₯Ό 받아듀일 수 μžˆλ„λ‘ μ •μ˜λœ λ³€μˆ˜μ΄λ‹€.
λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ, μ „λ‹¬λœ 값을 λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.


✨ λ§€κ°œλ³€μˆ˜μ˜ νŠΉμ§•

  • λ©”μ„œλ“œ 선언뢀에 μžλ£Œν˜• + λ³€μˆ˜λͺ… ν˜•νƒœλ‘œ μ •μ˜ν•œλ‹€.
  • λ©”μ„œλ“œ 호좜 μ‹œ κ΄„ν˜Έ μ•ˆμ— 인자λ₯Ό μ „λ‹¬ν•˜λ©΄, ν•΄λ‹Ή μΈμžκ°€ λ§€κ°œλ³€μˆ˜λ‘œ λ³΅μ‚¬λœλ‹€.
  • μ—¬λŸ¬ 개의 λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 있으며, 콀마(,)둜 κ΅¬λΆ„ν•œλ‹€.
  • λ§€κ°œλ³€μˆ˜λŠ” λ©”μ„œλ“œ λ‚΄μ—μ„œ μ§€μ—­ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λœλ‹€.

πŸ“Œ 예제: λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ

void PrintMessage(string name)
{
    Console.WriteLine($"{name}λ‹˜, λ°˜κ°‘μŠ΅λ‹ˆλ‹€!");
}

// 호좜
PrintMessage("μž¬μ€");  // 좜λ ₯: μž¬μ€λ‹˜, λ°˜κ°‘μŠ΅λ‹ˆλ‹€!

βœ… λ°˜ν™˜κ°’(Return Value)μ΄λž€?

λ°˜ν™˜κ°’μ€ λ©”μ„œλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•œ ν›„ κ²°κ³Όλ₯Ό ν˜ΈμΆœν•œ 곳으둜 λŒλ €μ£ΌλŠ” 값이닀.
λ°˜ν™˜κ°’μ΄ μžˆλŠ” λ©”μ„œλ“œλŠ” return ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 λ°˜ν™˜ν•œλ‹€.


✨ λ°˜ν™˜κ°’μ˜ νŠΉμ§•

  • λ°˜ν™˜κ°’μ˜ μžλ£Œν˜•μ€ λ©”μ„œλ“œ μ„ μ–ΈλΆ€μ˜ λ°˜ν™˜ νƒ€μž…κ³Ό λ°˜λ“œμ‹œ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.
  • λ©”μ„œλ“œκ°€ return을 λ§Œλ‚˜λ©΄ μ¦‰μ‹œ μ’…λ£Œλ˜λ©°, 값을 ν˜ΈμΆœν•œ 곳에 λŒλ €μ€€λ‹€.
  • voidλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” λ°˜ν™˜κ°’μ΄ μ—†μœΌλ©°, return;만 μ‚¬μš©ν•΄ λ©”μ„œλ“œλ₯Ό μ’…λ£Œν•  수 μžˆλ‹€.

πŸ“Œ 예제: λ°˜ν™˜κ°’μ΄ μžˆλŠ” λ©”μ„œλ“œ

int Add(int a, int b)
{
    return a + b;
}

// 호좜
int sum = Add(10, 20);
Console.WriteLine("합계: " + sum);  // 좜λ ₯: 합계: 30

βœ… void λ©”μ„œλ“œ

voidλŠ” λ©”μ„œλ“œκ°€ λ°˜ν™˜κ°’μ΄ μ—†λ‹€λŠ” 의미둜 μ‚¬μš©λœλ‹€.
λ‹¨μˆœν•œ 좜λ ₯μ΄λ‚˜ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ 주둜 μ‚¬μš©ν•œλ‹€.

void ShowNotice()
{
    Console.WriteLine("μ—…λ°μ΄νŠΈκ°€ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
}

// 호좜
ShowNotice();

πŸ§ͺ λ‹€μ–‘ν•œ ν™œμš© 예제

// λ‹¨μˆœ 좜λ ₯
void PrintLine()
{
    Console.WriteLine("====================");
}

// 반볡 좜λ ₯
void PrintLineCount(int count)
{
    for (int i = 0; i < count; i++)
    {
        Console.Write("=");
    }
    Console.WriteLine();
}

// 합계 계산
int GetTotal(int x, int y)
{
    return x + y;
}

// 호좜
PrintLine();
PrintLineCount(10);

int result = GetTotal(100, 250);
Console.WriteLine("총합: " + result);

🧠 정리

κ°œλ… μ„€λͺ…
λ§€κ°œλ³€μˆ˜ λ©”μ„œλ“œ μ™ΈλΆ€μ—μ„œ μ „λ‹¬λ˜λŠ” μž…λ ₯ κ°’
λ°˜ν™˜κ°’ λ©”μ„œλ“œ μ‹€ν–‰ 결과둜 λŒλ €μ£ΌλŠ” κ°’
void λ°˜ν™˜κ°’μ΄ μ—†λŠ” λ©”μ„œλ“œμ— μ‚¬μš©ν•˜λŠ” ν‚€μ›Œλ“œ

 

🧩 λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”© (Method Overloading)

βœ… λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ΄λž€?

λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ΄λž€ ν•˜λ‚˜μ˜ λ©”μ„œλ“œ μ΄λ¦„μœΌλ‘œ μ—¬λŸ¬ 개의 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” κΈ°λŠ₯이닀.
λ§€κ°œλ³€μˆ˜μ˜ 개수, μžλ£Œν˜•, μˆœμ„œκ°€ λ‹€λ₯΄λ©΄ λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ€‘λ³΅ν•΄μ„œ μ„ μ–Έν•  수 μžˆλ‹€.


✨ μ˜€λ²„λ‘œλ”©μ˜ 쑰건

λ‹€μŒ 쀑 ν•˜λ‚˜λΌλ„ λ‹€λ₯΄λ©΄ μ˜€λ²„λ‘œλ”©μ΄ κ°€λŠ₯ν•˜λ‹€.

  • λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κ°€ λ‹€λ₯Ό 경우
  • λ§€κ°œλ³€μˆ˜μ˜ μžλ£Œν˜•μ΄ λ‹€λ₯Ό 경우
  • λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œκ°€ λ‹€λ₯Ό 경우

⚠️ 단, λ°˜ν™˜ν˜•λ§Œ λ‹€λ₯΄κ²Œ ν•˜λŠ” 것은 μ˜€λ²„λ‘œλ”©μ΄ μ•„λ‹ˆλ‹€.


πŸ“Œ 예제: μ˜€λ²„λ‘œλ”©λœ λ©”μ„œλ“œλ“€

void PrintInfo(string name)
{
    Console.WriteLine($"이름: {name}");
}

void PrintInfo(string name, int age)
{
    Console.WriteLine($"이름: {name}, λ‚˜μ΄: {age}");
}

void PrintInfo(int age, string name)
{
    Console.WriteLine($"λ‚˜μ΄: {age}, 이름: {name}");
}

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” λͺ¨λ‘ PrintInfoλΌλŠ” μ΄λ¦„μ˜ λ©”μ„œλ“œμ§€λ§Œ,
λ§€κ°œλ³€μˆ˜μ˜ 개수, μˆœμ„œ, μžλ£Œν˜•μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μ˜€λ²„λ‘œλ”©μ΄ κ°€λŠ₯ν•˜λ‹€.


πŸ§ͺ 예제: μ˜€λ²„λ‘œλ”©μ„ ν™œμš©ν•œ λ§μ…ˆ λ©”μ„œλ“œ

int Add(int a, int b)
{
    return a + b;
}

int Add(int a, int b, int c)
{
    return a + b + c;
}

double Add(double a, double b)
{
    return a + b;
}

// 호좜 μ˜ˆμ‹œ
int sum1 = Add(1, 2);           // 2개 μ •μˆ˜
int sum2 = Add(1, 2, 3);        // 3개 μ •μˆ˜
double sum3 = Add(1.5, 2.5);    // 2개 μ‹€μˆ˜

Console.WriteLine(sum1);  // 좜λ ₯: 3
Console.WriteLine(sum2);  // 좜λ ₯: 6
Console.WriteLine(sum3);  // 좜λ ₯: 4.0

πŸ” λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ˜ μž₯점

  • 가독성 ν–₯상: 같은 의미의 μž‘μ—…μ„ ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ 톡일할 수 μžˆλ‹€.
  • μ½”λ“œ 일관성 μœ μ§€: ν•¨μˆ˜ 이름을 계속 λ°”κΏ€ ν•„μš” 없이 λ§€κ°œλ³€μˆ˜λ§Œ λ‹€λ₯΄κ²Œ μž‘μ„±ν•˜λ©΄ λœλ‹€.
  • μœ μ—°μ„± 증가: λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 인자 처리 κ°€λŠ₯

🧠 정리

ꡬ뢄 μ˜€λ²„λ‘œλ”© κ°€λŠ₯ μ—¬λΆ€
λ§€κ°œλ³€μˆ˜ 개수 닀름 κ°€λŠ₯
λ§€κ°œλ³€μˆ˜ μžλ£Œν˜• 닀름 κ°€λŠ₯
λ§€κ°œλ³€μˆ˜ μˆœμ„œ 닀름 κ°€λŠ₯
λ°˜ν™˜ν˜•λ§Œ 닀름 λΆˆκ°€λŠ₯
 

 

πŸ” μž¬κ·€ 호좜 (Recursive Call)

βœ… μž¬κ·€ ν˜ΈμΆœμ΄λž€?

**μž¬κ·€ 호좜(Recursion)**은 λ©”μ„œλ“œκ°€ 자기 μžμ‹ μ„ λ‹€μ‹œ ν˜ΈμΆœν•˜λŠ” 방식이닀.
문제λ₯Ό 더 μž‘μ€ λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ 같은 λ°©λ²•μœΌλ‘œ 반볡 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•œλ‹€.


✨ μž¬κ·€ 호좜의 κΈ°λ³Έ ꡬ쑰

void ν•¨μˆ˜μ΄λ¦„(λ§€κ°œλ³€μˆ˜)
{
    if (μ’…λ£Œ 쑰건)
    {
        // μž¬κ·€ μ’…λ£Œ μ‹œ μ‹€ν–‰ν•  μ½”λ“œ
    }
    else
    {
        // 자기 μžμ‹  호좜 (μž¬κ·€)
        ν•¨μˆ˜μ΄λ¦„(λ§€κ°œλ³€μˆ˜ λ³€ν™”);
    }
}
  • λ°˜λ“œμ‹œ **μ’…λ£Œ 쑰건(νƒˆμΆœ 쑰건)**이 μžˆμ–΄μ•Ό ν•œλ‹€.
  • μ’…λ£Œ 쑰건이 μ—†μœΌλ©΄ λ¬΄ν•œ λ£¨ν”„λ‘œ 인해 Stack Overflow 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

πŸ“Œ 예제: μΉ΄μš΄νŠΈλ‹€μš΄

void CountDown(int n)
{
    if (n <= 0)
    {
        Console.WriteLine("카운트 μ’…λ£Œ");
    }
    else
    {
        Console.WriteLine(n);
        CountDown(n - 1);  // μž¬κ·€ 호좜
    }
}

// 호좜
CountDown(5);

좜λ ₯ κ²°κ³Ό

 
5  
4  
3  
2  
1  
카운트 μ’…λ£Œ

πŸ” μž¬κ·€ 호좜의 λ™μž‘ 원리

  • μž¬κ·€ 호좜이 λ°œμƒν•˜λ©΄ ν˜ΈμΆœν•œ λ©”μ„œλ“œλŠ” λŒ€κΈ° μƒνƒœκ°€ 되고,
    μƒˆλ‘œμš΄ λ©”μ„œλ“œκ°€ μŠ€νƒμ— μŒ“μΈλ‹€.
  • 각 λ©”μ„œλ“œ 호좜이 μ’…λ£Œ 쑰건을 λ§Œλ‚˜λ©΄ ν•˜λ‚˜μ”© μŠ€νƒμ—μ„œ 제거되며 λ³΅κ·€ν•œλ‹€.

πŸ“Œ 예제: νŒ©ν† λ¦¬μ–Ό (Factorial)

int Factorial(int n)
{
    if (n <= 1)
        return 1;
    else
        return n * Factorial(n - 1);
}

// 호좜
int result = Factorial(5);
Console.WriteLine(result);  // 좜λ ₯: 120
  • 5! = 5 × 4 × 3 × 2 × 1을 μž¬κ·€μ μœΌλ‘œ κ³„μ‚°ν•˜λŠ” ꡬ쑰
  • μž¬κ·€ 호좜이 반볡되며 점점 μž‘μ€ 문제둜 λ‚˜μ•„κ°€κ³ ,
    λ§ˆμ§€λ§‰μ— ν•˜λ‚˜μ”© κ³„μ‚°λ˜μ–΄ λŒμ•„μ˜¨λ‹€.

⚠️ μ£Όμ˜ν•  점

  • μ’…λ£Œ 쑰건을 λ°˜λ“œμ‹œ μ •ν™•ν•˜κ²Œ μ„€μ •ν•΄μ•Ό ν•œλ‹€.
  • λ„ˆλ¬΄ κΉŠμ€ μž¬κ·€ ν˜ΈμΆœμ€ **μŠ€νƒ λ©”λͺ¨λ¦¬ 초과(Stack Overflow)**λ₯Ό μœ λ°œν•  수 μžˆλ‹€.
  • λ³΅μž‘ν•œ μž¬κ·€λŠ” 반볡문으둜 λŒ€μ²΄ν•˜λŠ” 것이 더 효율적인 κ²½μš°λ„ μžˆλ‹€.

🧠 정리

ν•­λͺ© λ‚΄μš©
μ •μ˜ λ©”μ„œλ“œκ°€ 자기 μžμ‹ μ„ λ‹€μ‹œ ν˜ΈμΆœν•˜λŠ” 방식
μž₯점 문제λ₯Ό λ‹¨μˆœν•˜κ³  μ§κ΄€μ μœΌλ‘œ ν‘œν˜„ κ°€λŠ₯
단점 κ³Όλ„ν•œ μž¬κ·€λŠ” μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš° μœ„ν—˜ 있음
ν•„μˆ˜ μš”μ†Œ μ’…λ£Œ 쑰건 쑴재 ν•„μš”

 

πŸ› οΈ λ©”μ„œλ“œ ν™œμš© 사둀

βœ… λ©”μ„œλ“œλŠ” μ™œ μ‚¬μš©ν•˜λŠ”κ°€?

λ©”μ„œλ“œλŠ” λ‹¨μˆœνžˆ μ½”λ“œλ₯Ό 쀄이기 μœ„ν•œ 도ꡬ가 μ•„λ‹ˆλΌ,
μ½”λ“œμ˜ ν’ˆμ§ˆμ„ 높이고 μœ μ§€λ³΄μˆ˜λ₯Ό μš©μ΄ν•˜κ²Œ λ§Œλ“€κΈ° μœ„ν•œ 핡심 ꡬ쑰이닀.


πŸ“Œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유

● μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±

  • λ™μΌν•œ μž‘μ—…μ„ μ—¬λŸ¬ 번 κ΅¬ν˜„ν•  ν•„μš” 없이, λ©”μ„œλ“œλ‘œ μ •μ˜ν•œ λ’€ ν•„μš”ν•  λ•Œλ§ˆλ‹€ ν˜ΈμΆœν•˜μ—¬ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.
  • λ°˜λ³΅λ˜λŠ” μž‘μ—…μ„ λ©”μ„œλ“œλ‘œ μΆ”μΆœν•˜λ©΄ μ½”λ“œμ˜ 쀑볡을 μ œκ±°ν•  수 μžˆλ‹€.

● 가독성 ν–₯상

  • λ©”μ„œλ“œλŠ” μ½”λ“œλ₯Ό 의미 λ‹¨μœ„λ‘œ λΆ„λ¦¬ν•΄μ£Όλ―€λ‘œ 전체 ꡬ쑰λ₯Ό νŒŒμ•…ν•˜κΈ° μ‰¬μ›Œμ§„λ‹€.
  • λ©”μ„œλ“œ μ΄λ¦„λ§Œ 보고도 ν•΄λ‹Ή λΈ”λ‘μ˜ 역할을 λΉ λ₯΄κ²Œ 이해할 수 μžˆλ‹€.

● μœ μ§€λ³΄μˆ˜μ˜ νŽΈλ¦¬ν•¨

  • νŠΉμ • κΈ°λŠ₯을 μˆ˜μ •ν•  λ•Œ ν•΄λ‹Ή λ©”μ„œλ“œλ§Œ μˆ˜μ •ν•˜λ©΄ λ˜λ―€λ‘œ, 전체 μ½”λ“œμ— 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.
  • κΈ°λŠ₯이 λ…λ¦½μ μœΌλ‘œ λΆ„λ¦¬λ˜μ–΄ μžˆμ–΄ 디버깅 및 ν…ŒμŠ€νŠΈκ°€ μš©μ΄ν•˜λ‹€.

πŸ“Ž 예제: λ©”μ„œλ“œ 없이 κ΅¬ν˜„ν•œ μ½”λ“œ

double radius = 5.0;
double circleArea = Math.PI * radius * radius;

double width = 3.0;
double height = 4.0;
double rectangleArea = width * height;

Console.WriteLine("μ›μ˜ 넓이: " + circleArea);
Console.WriteLine("μ‚¬κ°ν˜•μ˜ 넓이: " + rectangleArea);
  • κ°„λ‹¨ν•œ μ˜ˆμ‹œμ§€λ§Œ, 계산 둜직이 메인 흐름과 λ’€μ„žμ—¬ μžˆμ–΄ ν™•μž₯μ„±κ³Ό μž¬μ‚¬μš©μ„±μ΄ λ–¨μ–΄μ§„λ‹€.

πŸ“Ž 예제: λ©”μ„œλ“œλ₯Ό ν™œμš©ν•œ μ½”λ“œ κ°œμ„ 

double CalculateCircleArea(double radius)
{
    return Math.PI * radius * radius;
}

double CalculateRectangleArea(double width, double height)
{
    return width * height;
}

// ν˜ΈμΆœλΆ€
double circleArea = CalculateCircleArea(5.0);
double rectangleArea = CalculateRectangleArea(3.0, 4.0);

Console.WriteLine("μ›μ˜ 넓이: " + circleArea);
Console.WriteLine("μ‚¬κ°ν˜•μ˜ 넓이: " + rectangleArea);
  • 계산 둜직이 λ©”μ„œλ“œλ‘œ λΆ„λ¦¬λ˜μ–΄ μ˜λ„κ°€ λͺ…ν™•ν•˜κ³  μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ‘Œλ‹€.
  • λ‹€λ₯Έ κ³³μ—μ„œλ„ 이 λ©”μ„œλ“œλ₯Ό μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

πŸ” μ‹€μ „μ—μ„œμ˜ ν™œμš© 사둀

κΈ°λŠ₯ μ˜ˆμ‹œ λ©”μ„œλ“œ ν™œμš© λ°©μ•ˆ
ν”Œλ ˆμ΄μ–΄ μŠ€νƒ― 계산 CalculatePlayerStats() λ©”μ„œλ“œλ‘œ 뢄리
UI μ—…λ°μ΄νŠΈ UpdateUI() λ©”μ„œλ“œλ‘œ 뢄리
μ•„μ΄ν…œ 효과 적용 ApplyItemEffect(Item item) λ©”μ„œλ“œ ν™œμš©
μž…λ ₯ 처리 HandleInput() λ©”μ„œλ“œλ‘œ 일관 처리
 

🧠 정리

ν•­λͺ© μ„€λͺ…
μž¬μ‚¬μš©μ„± λ°˜λ³΅λ˜λŠ” μ½”λ“œ 제거, 호좜만으둜 μž¬ν™œμš© κ°€λŠ₯
가독성 μ½”λ“œ 블둝을 λͺ…ν™•νžˆ λ‚˜λˆ  λͺ©μ  νŒŒμ•…μ΄ 쉬움
μœ μ§€λ³΄μˆ˜ 변경이 ν•„μš”ν•  λ•Œ ν•΄λ‹Ή λ©”μ„œλ“œλ§Œ μˆ˜μ •ν•˜λ©΄ 됨
ν™•μž₯μ„± κΈ°λŠ₯이 λͺ…ν™•νžˆ λΆ„λ¦¬λ˜μ–΄ μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€ 용이

 

🧱 ꡬ쑰체 (Struct)

βœ… κ΅¬μ‘°μ²΄λž€?

**ꡬ쑰체(Struct)**λŠ” μ—¬λŸ¬ 데이터λ₯Ό ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ„œ μƒˆλ‘œμš΄ μ‚¬μš©μž μ •μ˜ μžλ£Œν˜•μ„ λ§Œλ“œλŠ” 방식이닀.
C#μ—μ„œλŠ” ꡬ쑰체λ₯Ό 톡해 κ΄€λ ¨λœ 데이터λ₯Ό ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ 관리할 수 있으며, ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•˜μ§€λ§Œ κ°’ νƒ€μž…μ΄λΌλŠ” 차이가 μžˆλ‹€.


🧩 ꡬ쑰체의 νŠΉμ§•

ν•­λͺ© μ„€λͺ…
ν‚€μ›Œλ“œ struct
νƒ€μž… ꡬ뢄 κ°’ νƒ€μž… (Value Type)
μ €μž₯ μœ„μΉ˜ μŠ€νƒ(Stack)에 μ €μž₯
상속 μ—¬λΆ€ ν΄λž˜μŠ€μ™€ 달리 κ΅¬μ‘°μ²΄λŠ” 상속이 λΆˆκ°€λŠ₯
κΈ°λ³Έ μƒμ„±μž κΈ°λ³Έ μƒμ„±μžλ₯Ό 직접 μ •μ˜ν•  수 μ—†μŒ (μ»΄νŒŒμΌλŸ¬κ°€ μžλ™ 생성)
μš©λ„ 데이터 묢음, κ²½λŸ‰ 객체 λ“± μ„±λŠ₯이 μ€‘μš”ν•œ μƒν™©μ—μ„œ μ‚¬μš©
 

πŸ› οΈ ꡬ쑰체 μ„ μ–Έ μ˜ˆμ‹œ

struct Person
{
    public string Name;
    public int Age;

    public void PrintInfo()
    {
        Console.WriteLine($"이름: {Name}, λ‚˜μ΄: {Age}");
    }
}
  • Personμ΄λΌλŠ” κ΅¬μ‘°μ²΄λŠ” 이름과 λ‚˜μ΄λ₯Ό ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ 묢은 μ‚¬μš©μž μ •μ˜ μžλ£Œν˜•μ΄λ‹€.
  • PrintInfo() λ©”μ„œλ“œλ₯Ό 포함할 수 μžˆμ–΄ κ°„λ‹¨ν•œ λ™μž‘λ„ ꡬ쑰체 λ‚΄λΆ€μ—μ„œ 처리 κ°€λŠ₯ν•˜λ‹€.

πŸ§ͺ ꡬ쑰체 μ‚¬μš© μ˜ˆμ‹œ

Person person1;
person1.Name = "μž¬μ€";
person1.Age = 26;
person1.PrintInfo();

좜λ ₯

이름: μž¬μ€, λ‚˜μ΄: 26

🧠 ν΄λž˜μŠ€μ™€ ꡬ쑰체의 차이점

ν•­λͺ© 클래슀 ꡬ쑰체
νƒ€μž… μ°Έμ‘° νƒ€μž… (Reference Type) κ°’ νƒ€μž… (Value Type)
μ €μž₯ μœ„μΉ˜ νž™ (Heap) μŠ€νƒ (Stack)
상속 κ°€λŠ₯ μ—¬λΆ€ κ°€λŠ₯ λΆˆκ°€λŠ₯
κΈ°λ³Έ μƒμ„±μž μ •μ˜ κ°€λŠ₯ μ •μ˜ λΆˆκ°€ (μžλ™ 생성)
μ„±λŠ₯ μƒλŒ€μ μœΌλ‘œ 느림 μƒλŒ€μ μœΌλ‘œ 빠름
μš©λ„ λ³΅μž‘ν•œ κΈ°λŠ₯, 상속 ν™œμš© κ°„λ‹¨ν•œ 데이터 묢음, μ„±λŠ₯ μ€‘μ‹œ
 

πŸ“Ž ꡬ쑰체 ν™œμš© 사둀

  • μ’Œν‘œ 정보: Point, Vector2, Vector3
  • κ²Œμž„ λ‚΄ μŠ€νƒ― ꡬ쑰: PlayerStats, ItemData
  • 색상 정보: Color
  • μ‹œκ°„ 정보: DateTime (ꡬ쑰체 기반)

⚠️ ꡬ쑰체 μ‚¬μš© μ‹œ 주의점

  • κ΅¬μ‘°μ²΄λŠ” κ°’ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— 볡사 μ‹œ 전체 값이 λ³΅μ‚¬λœλ‹€.
  • 볡사 λΉ„μš©μ΄ 큰 경우 (예: 멀버가 λ„ˆλ¬΄ λ§Žκ±°λ‚˜ 무거운 객체일 λ•Œ)λŠ” ν΄λž˜μŠ€κ°€ 더 μ ν•©ν•˜λ‹€.
  • ꡬ쑰체 λ‚΄λΆ€μ—μ„œ λ³΅μž‘ν•œ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜κ±°λ‚˜ 상속이 ν•„μš”ν•  κ²½μš°λŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.

βœ… 정리

핡심 포인트 μ„€λͺ…
κ°’ νƒ€μž… ꡬ쑰 μŠ€νƒμ— μ €μž₯λ˜μ–΄ μ„±λŠ₯이 μ’‹μŒ
κ²½λŸ‰ 객체에 적합 μ’Œν‘œ, 색상, κ°„λ‹¨ν•œ 정보 ꡬ쑰
ν΄λž˜μŠ€λ³΄λ‹€ μ œν•œμ  상속 λΆˆκ°€, μƒμ„±μž μ œμ•½ λ“± 있음
데이터 λ¬ΆμŒμ— 용이 μ—¬λŸ¬ 데이터λ₯Ό ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ 관리 κ°€λŠ₯

 

 

❓

근데 κ°‘μžκΈ° 문득 κΆκΈˆν•΄μ‘Œλ‹€ κ΅¬μ‘°μ²΄λŠ” κ°’ νƒ€μž…μ΄λΌκ³  ν•˜λ‹ˆ 그럼 기본적으둜 μŠ€νƒμ— μ €μž₯이 λ˜κ² κ΅¬λ‚˜ μ‹Άμ—ˆλ‹€.

근데 GPTμ—κ²Œ λ¬Όμ–΄λ³΄λ‹ˆ..

βœ… 정리

μ‚¬μš© 방식 μ €μž₯ μœ„μΉ˜
μ§€μ—­ λ³€μˆ˜λ‘œ μ„ μ–Έν•œ ꡬ쑰체 μŠ€νƒ
클래슀의 ν•„λ“œλ‘œ ꡬ쑰체 포함 νž™
λ°•μ‹±λœ ꡬ쑰체 νž™
new ν‚€μ›Œλ“œλ‘œ ꡬ쑰체 μ΄ˆκΈ°ν™” μŠ€νƒ

❓

μ΄λ ‡κ²Œ μ–˜κΈ°ν•˜λŠ”κ²ƒμ΄ μ•„λ‹ˆκ² λ‚˜..흠..그러면 μ—¬λŸ¬ 쑰건으둜 λ¬Όμ–΄λ΄€μ„λ•ŒλŠ” μ–΄λ–»κ²Œ λŒ€λ‹΅ν•˜λŠ”μ§€ κΆκΈˆν•˜λ‹€.

Q. 였 그러면 ꡬ쑰체λ₯Ό 클래슀 λ‚΄μ—μ„œ μ„ μ–Έν•˜κ³  μ‚¬μš©ν•˜λ©΄ νž™μ— μ €μž₯되고, ꡬ쑰체λ₯Ό 였브젝트 νƒ€μž…μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ νž™μ— μ €μž₯되고(λ°•μ‹±), new ν‚€μ›Œλ“œλ‘œ ꡬ쑰체λ₯Ό μ΄ˆκΈ°ν™”ν•˜λ©΄ μŠ€νƒμœΌλ‘œ μ‘΄μž¬ν•œλ‹€λŠ”κ±°μ§€? 근데 λ§Œμ•½ 클래슀 λ‚΄μ—μ„œ ν•˜λ©΄ νž™μ΄κ³ ?

 

βœ… ꡬ쑰체의 μ €μž₯ μœ„μΉ˜: μŠ€νƒ vs νž™ 정리

1. ꡬ쑰체가 μ§€μ—­ λ³€μˆ˜μΌ λ•Œ (ν•¨μˆ˜ μ•ˆμ—μ„œ μ„ μ–Έ)

void Test()
{
    PlayerState player = new PlayerState(); // ꡬ쑰체
}
  • κ΅¬μ‘°μ²΄λŠ” κ°’ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— μŠ€νƒ(stack) 에 μ €μž₯됨.
  • new ν‚€μ›Œλ“œλŠ” νž™ 할당이 μ•„λ‹ˆλΌ, ν•„λ“œ μ΄ˆκΈ°ν™”λ§Œ ν•΄μ€Œ.

πŸ”Ή newλ₯Ό 썼닀고 νž™μ— μ €μž₯λ˜λŠ” 것이 μ•„λ‹˜!


2. ꡬ쑰체가 클래슀의 ν•„λ“œμΌ λ•Œ

class Game
{
    public PlayerState player;
}
  • Game κ°μ²΄λŠ” νž™(heap) 에 μ €μž₯되며,
  • κ·Έ μ•ˆμ— μžˆλŠ” ꡬ쑰체 ν•„λ“œ(player)도 νž™ μ•ˆμ— 포함됨.

πŸ”Ή ꡬ쑰체의 μœ„μΉ˜λŠ” ν•΄λ‹Ή ꡬ쑰체가 ν¬ν•¨λœ 객체의 μœ„μΉ˜λ₯Ό 따름.


3. ꡬ쑰체λ₯Ό object둜 μ €μž₯ (λ°•μ‹±)

object obj = new PlayerState();
  • κ΅¬μ‘°μ²΄λŠ” κ°’ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— object와 같은 μ°Έμ‘° νƒ€μž…μ— μ €μž₯ν•  λ•Œ λ°•μ‹±(Boxing) 이 λ°œμƒν•¨.
  • 이 경우, ꡬ쑰체 볡사본이 νž™μ— μƒˆλ‘œ 생성됨.

πŸ”Ή object, interface 등에 ꡬ쑰체λ₯Ό λ‹΄μœΌλ©΄ νž™μ— 박싱됨.


πŸ“Œ κ²°λ‘  μš”μ•½

μ„ μ–Έ μœ„μΉ˜/μ‚¬μš© 방식 μ €μž₯ μœ„μΉ˜ λΉ„κ³ 
μ§€μ—­ λ³€μˆ˜λ‘œ μ„ μ–Έλœ ꡬ쑰체 μŠ€νƒ 기본적인 κ°’ νƒ€μž… λ™μž‘
new ν‚€μ›Œλ“œλ‘œ μ΄ˆκΈ°ν™”λœ ꡬ쑰체 μŠ€νƒ λ‹¨μˆœ ν•„λ“œ μ΄ˆκΈ°ν™”
클래슀의 ν•„λ“œλ‘œ ν¬ν•¨λœ ꡬ쑰체 νž™ ν΄λž˜μŠ€κ°€ νž™μ— μ €μž₯되기 λ•Œλ¬Έ
ꡬ쑰체λ₯Ό object둜 λ°•μ‹±ν–ˆμ„ λ•Œ νž™ λ°•μ‹± λ°œμƒ
ꡬ쑰체 λ°°μ—΄μ˜ 경우 (배열이 νž™μ— 있음) νž™ 배열은 μ°Έμ‘° νƒ€μž…μ΄λΌ νž™μ— 생성됨

 

❓

흠.. 또 κΆκΈˆν•œκ²Œ μƒκ²ΌμŠ΅λ‹ˆλ‹€ 클래슀 λ‚΄μ—μ„œ ꡬ쑰체λ₯Ό μ„ μ–Έν•˜κ³  μ‚¬μš©ν•˜λ©΄ νž™μ— μ €μž₯λœλ‹€κ³  ν•˜λŠ”λ° 기본적으둜 κ΅¬μ‘°μ²΄λŠ” μŠ€νƒμ— μ €μž₯λœλ‹€κ³  ν•˜λ‹ˆκΉŒ 근데 그럼 κ΅¬μ‘°μ²΄λŠ” 값을 μŠ€νƒμ— μ €μž₯λœλ‹€κ³  ν–ˆλŠ”λ° 그러면 클래슀 λ‚΄μ—μ„œ ꡬ쑰체λ₯Ό μ„ μ–Έν•˜κ³  μ‚¬μš©ν•˜λ©΄ νž™μ— ꡬ쑰체의 μ£Όμ†Œκ°’μ„ κ°€μ§€κ³ μžˆκ³  μŠ€νƒμ— 값을 μ €μž₯ν•˜λŠ” 것인가? λΌλŠ” ꢁ금증이 생겼닀.

 

 

❌ “νž™μ— ꡬ쑰체의 μ£Όμ†Œκ°’μ΄ 있고, 값은 μŠ€νƒμ— μžˆλ‹€” → ❌ ν‹€λ¦° ν‘œν˜„μ΄μ•Ό.

κ΅¬μ‘°μ²΄λŠ” κ°’ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ—, κ·Έ κ°’ μžμ²΄κ°€ 어디에 μ €μž₯λ˜λŠλƒκ°€ μ€‘μš”ν•΄.
κ°’ νƒ€μž…μ€ μ°Έμ‘°κ°€ μ•„λ‹ˆλΌ μ‹€μ œ 데이터λ₯Ό κ·Έ μžλ¦¬μ— λ³΅μ‚¬ν•΄μ„œ λ³΄κ΄€ν•˜λŠ” 성격이야.


βœ… μ •λ‹΅: 클래슀의 ν•„λ“œλ‘œ ꡬ쑰체가 μžˆμ„ 경우 → ꡬ쑰체 전체 값이 νž™μ— μ‘΄μž¬ν•œλ‹€.

μ˜ˆμ‹œλ‘œ 보면:

struct PlayerState
{
    public int hp;
    public int mp;
}

class Game
{
    public PlayerState state;
}

Game game = new Game();
  • game κ°μ²΄λŠ” new둜 μƒμ„±λ˜λ―€λ‘œ νž™(heap) 에 μ €μž₯됨.
  • κ·Έ μ•ˆμ— μžˆλŠ” state ν•„λ“œλŠ” κ΅¬μ‘°μ²΄λ‹ˆκΉŒ κ°’ νƒ€μž…μ΄μ§€λ§Œ,
  • 클래슀 내뢀에 ν¬ν•¨λ˜μ–΄ μžˆμœΌλ―€λ‘œ state의 κ°’ 전체가 νž™μ— ν•¨κ»˜ μ €μž₯λœλ‹€.

πŸ‘‰ μ΄λ•Œ νž™μ— μžˆλŠ” 건 ꡬ쑰체의 “μ£Όμ†Œ”κ°€ μ•„λ‹ˆλΌ “μ‹€μ œ κ°’”이야.


πŸ’‘ 정리

상황 ꡬ쑰체의 μœ„μΉ˜ μ €μž₯λ˜λŠ” 것
μ§€μ—­ λ³€μˆ˜λ‘œ 선언됨 μŠ€νƒ ꡬ쑰체의 κ°’
클래슀의 ν•„λ“œλ‘œ 선언됨 νž™ (클래슀 λ‚΄λΆ€) ꡬ쑰체의 κ°’
object에 박싱됨 νž™ (λ°•μ‹±λœ 객체 λ‚΄λΆ€) ꡬ쑰체의 κ°’

 

 

πŸ“Œ ν˜Όλ™μ£Όμ˜

κ΅¬μ‘°μ²΄λŠ” μ°Έμ‘° νƒ€μž…μ²˜λŸΌ “μ£Όμ†Œλ§Œ μ €μž₯되고 값은 λ”°λ‘œ” μžˆλŠ” 게 μ•„λ‹˜.
κ΅¬μ‘°μ²΄λŠ” 항상 κ°’ μžμ²΄κ°€ κ·Έ μœ„μΉ˜μ— λ³΅μ‚¬λ˜μ–΄ μ €μž₯됨.

 

βœ…

μ˜€μΌ€μ΄! ꢁ금증 ν•΄κ²°!

λ°˜μ‘ν˜•