24.01.15 TIL - [C#] 기초 (10) : 제너릭과 키워드

JJwoo·2024년 1월 15일
0

C#

목록 보기
10/20

📘 01. 제너릭 (Generics)

제너릭은 클래스나 메서드를 일반화하여 다양한 자료형에 대응할 수 있는 기능이다.

이를 사용하면 코드의 재사용성을 크게 향상시킬 수 있다. 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이 출력된다.


- 제너릭을 2개이상 사용하는 예

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"이 출력된다.


📘 02. out, ref 키워드

outref 키워드는 메서드에서 매개변수를 통해 값을 전달하거나 수정할 때 사용한다.

out 키워드는 반환 값매개변수로 전달하는 데 사용되며,
ref 키워드는 매개변수수정하여 원래 값에 영향을 줄 때 사용한다.

- out 키워드 사용 예시

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"이 출력된다.


- ref 키워드 사용 예시

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 aref 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 키워드 특징표

키워드설명사용 시점주요 용도주의사항
out메서드 내에서 초기화되어야 하는 매개변수에 사용된다. 메서드 호출 시 변수에 초기값이 없어도 됨.메서드에 반환할 여러 값이 있을 때 사용한다.값을 메서드에서 생성하고 반환하는 데 사용한다.메서드 내에서 반드시 값을 할당해야 한다.
ref이미 초기화된 변수를 메서드에 전달하고, 메서드 내에서 그 값을 변경할 때 사용한다.메서드 호출 시 변수에 초기값이 있어야 함.기존 변수의 값을 메서드 내에서 변경하는 데 사용한다.메서드 내외에서 변수 값이 변경될 수 있으므로 주의가 필요하다.
profile
개발 모코코

0개의 댓글