제너릭
은 클래스나 메서드를 일반화하여 다양한 자료형에 대응할 수 있는 기능이다.
이를 사용하면 코드의 재사용성을 크게 향상시킬 수 있다. C#에서는 <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];
}
}
// 사용 예시
Stack<int> intStack = new Stack<int>();
intStack.Push(1);
intStack.Push(2);
intStack.Push(3);
Console.WriteLine(intStack.Pop()); // 출력 결과: 3
Stack<T>
클래스는 제너릭 클래스의 예시로, 여기서 <T>
는 임의의 타입을 의미한다.
클래스 내부에서 T[] elements 배열을 사용하여 다양한 타입의 요소를 저장한다.
Push(T item)
메서드는 스택에 요소를 추가한다.
Pop()
메서드는 스택에서 가장 최근에 추가된 요소를 제거하고 반환한다.
Stack intStack = new Stack();는 int 타입의 스택을 생성한다.
intStack.Push(1);는 스택에 1을 추가한다.
Console.WriteLine(intStack.Pop());는 스택에서 요소를 제거하고 그 값을 출력한다.
여기서는 3이 출력된다.
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}");
}
}
Pair <T1, T2>
클래스는 두 가지 타입의 객체를 저장할 수 있는 제너릭 클래스다.
T1 First와 T2 Second 속성을 통해 각 타입의 인스턴스를 저장한다.
Pair<int, string> pair1 = new Pair<int, string>(1, "One");는 첫 번째 요소로 int 타입, 두 번째 요소로 string 타입을 갖는 Pair 객체를 생성한다.
pair1.Display();는 객체의 두 요소를 출력한다. 여기서는 "First: 1, Second: One"이 출력된다.
out
과 ref
키워드는 메서드에서 매개변수를 통해 값을 전달하거나 수정할 때 사용한다.
out 키워드는 반환 값
을 매개변수
로 전달하는 데 사용되며,
ref 키워드는 매개변수
를 수정
하여 원래 값에 영향을 줄 때 사용한다.
void Divide(int a, int b, out int quotient, out int remainder)
{
quotient = a / b;
remainder = a % b;
}
int quotient, remainder;
Divide(7, 3, out quotient, out remainder);
Console.WriteLine($"{quotient}, {remainder}"); // 출력 결과: 2, 1
Divide
메서드는 두 정수의 나눗셈을 수행하고, 결과를 out 매개변수를 통해 반환한다.
int quotient, remainder;는 나눗셈의 몫과 나머지를 저장할 변수를 선언한다.
Divide(7, 3, out quotient, out remainder);는 7을 3으로 나눈 결과를 quotient와 remainder에 저장한다.
출력 결과
Console.WriteLine($"{quotient}, {remainder}");는 몫과 나머지를 출력한다. 여기서는 "2, 1"이 출력된다.
void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine($"{x}, {y}"); // 출력 결과: 2, 1
Swap
메서드는 두 정수의 값을 서로 교환하는 기능을 수행한다.
ref int a
와 ref int b
는 메서드 내에서 직접 두 변수의 값을 변경할 수 있게 하는 ref 매개변수다.
int temp = a;
는 임시 변수에 a의 값을 저장하고, a와 b의 값을 서로 교환한다.
int x = 1, y = 2;는 두 변수 x와 y를 선언하고 초기화한다.
Swap(ref x, ref y);는 x와 y의 값을 서로 교환한다.
Console.WriteLine($"{x}, {y}");는 교환된 값들을 출력한다. 여기서는 "2, 1"이 출력된다.
값의 변경 가능성:
ref
매개변수를 사용하면 메서드 내에서 해당 변수의 값을 변경할 수 있다. 이는 예기치 않은 동작을 초래할 수 있으므로 주의가 필요하다.
성능 이슈:
ref
매개변수는 값 복사 없이 직접 접근할 수 있어 성능상 이점이 있다. 하지만 매개변수를 너무 많이 ref로 전달하면 가독성과 유지보수성이 떨어질 수 있다. 적절한 상황에서 ref를 사용하는 것이 좋다.
변수 변경 여부 주의:
out
매개변수는 메서드 내에서 반드시 값을 할당해야 한다. 이전 값이 유지되지 않으므로 out 매개변수를 사용할 때는 이를 염두에 두어야 한다.
키워드 | 설명 | 사용 시점 | 주요 용도 | 주의사항 |
---|---|---|---|---|
out | 메서드 내에서 초기화되어야 하는 매개변수에 사용된다. 메서드 호출 시 변수에 초기값이 없어도 됨. | 메서드에 반환할 여러 값이 있을 때 사용한다. | 값을 메서드에서 생성하고 반환하는 데 사용한다. | 메서드 내에서 반드시 값을 할당해야 한다. |
ref | 이미 초기화된 변수를 메서드에 전달하고, 메서드 내에서 그 값을 변경할 때 사용한다. | 메서드 호출 시 변수에 초기값이 있어야 함. | 기존 변수의 값을 메서드 내에서 변경하는 데 사용한다. | 메서드 내외에서 변수 값이 변경될 수 있으므로 주의가 필요하다. |