제네릭은 마치 마법상자처럼 다양한 타입을 담을 수 있는 기능입니다. 제네릭을 사용하면 코드의 재사용성과 유연성을 높일 수 있습니다. 타입에 대한 제한이 없이 여러 종류의 데이터를 한꺼번에 처리할 수 있어 개발을 더욱 효율적으로 만들어줍니다. 이러한 제네릭은 마치 마법처럼 다양한 상황에서 사용할 수 있는 강력한 도구입니다.
제너릭은 데이터 타입을 미리 지정하지 않고 다양한 타입을 지원하는 코드를 작성할 수 있게 해줍니다. 제너릭을 사용하면 코드의 재사용성과 유지 보수성을 향상시킬 수 있습니다.
예를 들어, 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
절을 사용하면 제네릭 타입 매개변수에 대한 제약 조건을 지정할 수 있습니다.
예를 들어, T
가 Monster
클래스 또는 Monster
클래스를 상속받은 클래스여야 한다는 제약 조건을 걸고 싶다면 다음과 같이 작성할 수 있습니다:
public class Example<T> where T : Monster
{
// ...
}
위의 예시에서 Example<T>
클래스는 T
가 Monster
클래스 또는 Monster
클래스를 상속받은 클래스여야 합니다. 이렇게 하면 T
는 Monster
클래스로 제한되며, Monster
클래스의 멤버에 접근할 수 있습니다.
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
타입의 매개변수 세 개를 받아 더한 결과를 반환합니다.
오버로딩을 사용하면 매개변수의 타입, 개수, 순서를 다양하게 조합하여 메소드를 호출할 수 있어 코드의 가독성과 편의성을 높일 수 있습니다.