C#의 기초 - 14 (Boxing, UnBoxing, Generic, Interface)

krokrai·2025년 12월 26일

Generic, Interface

개요

  • Boxing, UnBoxing
  • Generic
  • Interface

Boxing, UnBoxing

  • Boxing과 UnBoxing은 c#의 객체단위에서 일어나는 일로 struct -> class로 이동하는 경우를 Boxing, class -> struct로 가는 경우를 UnBoxing 이라고합니다.
  • 즉, stack 영역에 있는 data가 heap 영역으로 넘어갈 경우, Boxing / heap에 있는 data가 stack으로 갈 경우 UnBoxing이 일어납니다.
  • 그 이유는 struct와 class 모두 object라는 객체를 상속받아 정의되기 때문입니다.

void Main()
{
	int a = 999;
    
    object b = a;
    
    int c = (int)b
}

Generic

  • 바구니의 개념은 필요에 따라서 바뀌게 됩니다, 액체(물 등)를 담을 수도 있고, 고체(흙 등)를 담을 수도 있습니다.
  • 하지만, 코드 상에서는 그 과정을 하고 싶다면 떠오르는 방법 중 하나는 overload입니다. 모든 함수에 대해서 int, float형으로 선언해주면 되겠지만, 매우 힘들어집니다.
  • 그럴 때를 위해 사용가능한 것이 Generic이라는 명령문입니다.

void Main()
{
    int a = 1;
    int b = 999;
    Console.WriteLine($"Before swap processing a : {a}, b : {b}");
    Swap<int>(ref a, ref b);
    Console.WriteLine($"After swap processing a : {a}, b : {b}");
}

// T는 프로그래머들의 암묵적인 Generic 글자, 즉, 무엇을 사용해도 큰 상관없습니다.
// 만약 int나 float같은 자료형만 받고 싶다면, void Swap<T>(ref T a, ref T b) where : struct 를 사용하면 됩니다.
void Swap<T>(ref T a, ref T b)
{
    T temp = a;
    a = b;
    b = temp;

}
Before swap processing a : 1, b : 999
After swap processing a : 999, b : 1
  • 위와 같이 Swap<int>를 통해 int형 swap함수를 선언하였습니다.

interface

  • interface는 추상 클래스와 비슷한 방식으로 작동하지만 다른점들이 있습니다.
  • 비슷한 점은 상속받은 class에게 해당 함수를 선언하고 구현하는 것을 강제합니다.
    - class에 상속 받듯이 옆에 :를 넣어서 상속 받습니다.
  • 다른 점은 한번에 여러개의 Interface를 상속 받을 수 있습니다.

    class a : IMyinterface1, IMyinterface2, IMyinterface3

    • 구조체에도 상속 받을 수 있지만, 위에서 언급한 Boxing, UnBoxing이 일어날 수 있기 때문에 사용에 주의해야합니다.
  • Interface를 사용할 때는 주의해야할 점이, 객체지향의 원칙에서 언급 되었듯, 여러개의 작은 단위 Interface를 선언해야합니다.

void Main()
{

}

class Myclass : IMyinterface1, IMyinterface2
{
    public void FirstInterface()
    {

    }

    public void SecondInterface()
    {

    }

}

interface IMyinterface1
{
    void FirstInterface();
}
interface IMyinterface2
{
    void SecondInterface();
}
  • 위에 처럼 여러가지를 상속 받고 강제할 수 있으며, 이름을 짓는 방식에 따라 직관성이 올라가며, Interface로 검색하여, 선택적으로 class를 제어할 수 있습니다.
profile
게임을 좋아하고 만들고 싶은 개발자 지망생입니다.

0개의 댓글