제네릭 : 마법상자

제네릭은 마치 마법상자처럼 다양한 타입을 담을 수 있는 기능입니다. 제네릭을 사용하면 코드의 재사용성과 유연성을 높일 수 있습니다. 타입에 대한 제한이 없이 여러 종류의 데이터를 한꺼번에 처리할 수 있어 개발을 더욱 효율적으로 만들어줍니다. 이러한 제네릭은 마치 마법처럼 다양한 상황에서 사용할 수 있는 강력한 도구입니다.

제너릭은 데이터 타입을 미리 지정하지 않고 다양한 타입을 지원하는 코드를 작성할 수 있게 해줍니다. 제너릭을 사용하면 코드의 재사용성과 유지 보수성을 향상시킬 수 있습니다.

예를 들어, List<T> 클래스는 제너릭을 사용하여 다양한 데이터 타입의 리스트를 생성할 수 있습니다. T는 사용자가 지정한 타입에 따라서 다양한 형태의 리스트를 만들 수 있습니다. 아래는 제너릭을 사용한 List<T> 클래스의 예시입니다.

List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);

List<string> names = new List<string>();
names.Add("John");
names.Add("Jane");
names.Add("Mike");

위의 예시에서 List<int>는 int의 리스트를, List<string>은 string의 리스트를 생성합니다. 제너릭을 사용하면 동일한 코드를 다양한 데이터 타입에 대해 재사용할 수 있습니다.

제너릭을 사용하여 사용자 정의 클래스나 메소드를 작성할 수도 있습니다. 아래는 제너릭을 사용한 메소드의 예시입니다.

public T GetMax<T>(T a, T b)
{
    if (a.CompareTo(b) > 0)
    {
        return a;
    }
    else
    {
        return b;
    }
}

int maxInt = GetMax<int>(3, 5);
string maxString = GetMax<string>("apple", "banana");

위의 예시에서 GetMax<T> 메소드는 제너릭으로 작성되어 있습니다. 사용자가 지정한 데이터 타입에 따라서 최댓값을 반환하는 메소드입니다. GetMax<int>는 정수형 데이터에 대한 최댓값을, GetMax<string>은 문자열 데이터에 대한 최댓값을 반환합니다.

제네릭의 제한

하지만, 사실 대부분의 경우에서는 아무거나 막 넣을 수 있도록 허락하지 않습니다. 더하기를 한다고하는데 클래스를 넣어버리고 이러면 곤란하겠죠. 그래서 제네릭에서는 제한을 걸 수 있도록 합니다. 제네릭에서 제한을 거는 부분은 where 절을 사용하여 구현할 수 있습니다. where 절을 사용하면 제네릭 타입 매개변수에 대한 제약 조건을 지정할 수 있습니다.

예를 들어, TMonster 클래스 또는 Monster 클래스를 상속받은 클래스여야 한다는 제약 조건을 걸고 싶다면 다음과 같이 작성할 수 있습니다:

public class Example<T> where T : Monster
{
    // ...
}

위의 예시에서 Example<T> 클래스는 TMonster 클래스 또는 Monster 클래스를 상속받은 클래스여야 합니다. 이렇게 하면 TMonster 클래스로 제한되며, Monster 클래스의 멤버에 접근할 수 있습니다.

C# 오버로딩 예시

C#에서 오버로딩은 같은 이름의 메소드를 여러 개 정의하는 것을 의미합니다. 오버로딩을 사용하면 동일한 기능을 수행하는 메소드를 다양한 매개변수 조합으로 호출할 수 있습니다. 아래는 C#에서 오버로딩을 사용한 예시입니다.

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

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

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

// 사용 예시
Calculator calculator = new Calculator();
int sum1 = calculator.Add(2, 3); // int Add(int a, int b) 메소드 호출
double sum2 = calculator.Add(2.5, 3.7); // double Add(double a, double b) 메소드 호출
int sum3 = calculator.Add(2, 3, 4); // int Add(int a, int b, int c) 메소드 호출

// 생성자 오버로딩
new Student(); // 기본생성자
new Student("송지원"); // 이름 등에 세팅을 해줄 수 있는 생성자

Random.Range(0, 5) : 0, 1, 2, 3, 4 int Random(int minValue, int maxValue)
Random.Range(0f, 5f) : 0.1, 2.4 3.9 4.99 float Random(float minValue, float maxValue)

위의 예시에서는 Calculator 클래스에서 Add 메소드를 오버로딩하여 다양한 매개변수 조합으로 호출할 수 있습니다. 첫 번째 Add 메소드는 int 타입의 매개변수 두 개를 받아 더한 결과를 반환하고, 두 번째 Add 메소드는 double 타입의 매개변수 두 개를 받아 더한 결과를 반환합니다. 마지막으로 세 번째 Add 메소드는 int 타입의 매개변수 세 개를 받아 더한 결과를 반환합니다.

오버로딩을 사용하면 매개변수의 타입, 개수, 순서를 다양하게 조합하여 메소드를 호출할 수 있어 코드의 가독성과 편의성을 높일 수 있습니다.

오브젝트 풀