제너릭
클래스나 메서드를 일반화시켜서 다양한 자료형에 대응할 수 있는 기능.
코드를 하나만 짜서 다양한 자료형들을 사용할 수 있게 하기 때문에 재사용성이 높아진다. <T> 키워드를 사용하며(클래스나 메서드를 사용할 때는 구체적인 자료형을 넣어준다.) 선언하는 시점이 아닌 어떤 자료형들에 대해 사용하는지에 따라 결정된다.
// 제너럴 클래스
class Stack<T>
{
private T[] elements;
private int top;
public Stack()
{
elements = new T[100];
top = 0;
}
public void Push(T item)
{
elements[top++] = item;
}
public T Pop()
{
return elements[--top];
}
}
// 제너릭을 두 개 이상 사용
class Pair<T1, T2>
{
public T1 First { get; set; }
public T2 Second { get; set; }
public Pair(T1 first, T2 second)
{
First = first;
Second = second;
}
public void Display()
{
Console.WriteLine($"First: {First}, Second: {Second}");
}
}
static void Main(string[] args)
{
// 제너릭 클래스 사용 예시
Stack<int> intStack = new Stack<int>();
intStack.Push(1);
intStack.Push(2);
intStack.Push(3);
Console.WriteLine(intStack.Pop()); // 출력 결과: 3
// 제너릭을 두 개 이상 사용 예시
Pair<int, string> pair1 = new Pair<int, string>(1, "One");
pair1.Display(); // 출력 결과: First: 1, Second: One
Pair<double, bool> pair2 = new Pair<double, bool>(3.14, true);
pair2.Display(); // 출력 결과: First: 3.14, Second: True
}
out & ref 키워드
매개변수로 전달하면 반환 값을 매개변수로 직접적으로 받아올 수 있다.
// out & ref
// out 키워드 사용 예시
static void Divide(int a, int b, out int quotient, out int remainder) // out은 항상 값을 채워준다
{
quotient = a / b;
remainder = a % b;
}
// ref 키워드 사용 예시
static void Swap(ref int a, ref int b) // ref는 사용할지 안할지 모른다
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
// out
int quotient, remainder;
Divide(7, 3, out quotient, out remainder);
Console.WriteLine($"{quotient}, {remainder}"); // 출력 결과: 2, 1
// ref
int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine($"{x}, {y}"); // 출력 결과: 2, 1
}
- ref 매개변수를 사용하면 메서드 내의 해당 변수 값을 직접 변경할 수 있기 때문에 주의 해야한다.
- ref 매개변수는 값에 대한 복사가 없기 때문에 훨씬 빠르다. 그렇기 때문에 성능적으로는 좋지만 ref가 많아지면 코드의 가독성이 떨어지고 유지보수가 어려워지기 때문에 적절히 사용해야한다.
- out 매개변수는 매소드 내에서 무조건 바꿔야하기 때문에 out이라는 인자로 넘어간 변수가 이전 값과 현재 값을 비교해야 한다면 이전 값을 유지하기 위해 복사하거나 다른 변수에 저장 해놓는 등의 방식을 취해야한다.
'부트캠프 > Study' 카테고리의 다른 글
C# 문법 4강(2) - 예외 처리 및 값형과 참조형 (1) | 2023.11.15 |
---|---|
C# 문법 4강(1) - 인터페이스와 열거형 (0) | 2023.11.10 |
C# 문법 3강(2) - 상속과 다형성 (0) | 2023.11.08 |
C# 문법 3강(1) - 클래스와 객체 (0) | 2023.11.08 |
C# 문법 2강 - 문제 풀이 (0) | 2023.11.08 |