[ 제네릭 ]
제네릭은 데이터 타입을 일반화해서 다양한 자료형에 대응할 수 있게 한다. <T>를 사용해서 특정 자료형 없이 선언한 뒤, 이를 사용할 때 원하는 자료형을 입력한다. 제네릭을 사용하면 코드를 재사용성을 높이고, 컴파일 오류를 줄여 타입 안전성을 제공한다.
public class Inventory<T>
{
private T content;
public void Put(T item)
{
content = item;
}
public T Get()
{
return content;
}
}
제네릭 타입 <T>를 사용해서 특정 자료형을 미리 정의하지 않고 아이템을 저장하거나 꺼낼 수 있는 코드를 작성했다.
public class Program
{
public static void Main()
{
Inventory<string> ItemName = new Inventory<string>();
ItemName.Put("HP Potion");
Console.WriteLine("Use Item: " + ItemName.Get());
}
}
인벤토리 클래스를 사용할 때 string이라는 구체적인 자료형을 설정해서 문자열 데이터를 저장했다.
[ out, ref ]
out과 ref는 메서드에서 매개변수를 통해 값을 전달할 때 사용한다. out은 반환 값을 return이 아닌 매개변수를 통해서 바로 전달할 수 있게 하고, ref는 값에 직접 접근하여 실제 값을 변화를 줄 수 있게 한다.
out 예시
public class Calculator
{
static void Main()
{
int number; //초기화X
PlusTwo(10, out number); //할당
Console.WriteLine("Plus Two: " + number);
}
static void PlusTwo(int n, out int number)
{
number = n + 2;
}
}
위 코드에서 number 변수에 초기화하지 않고, PlusTwo 메서드를 사용할 때 매개변수를 통해 값을 할당한다. PlusTwo 메서드는 number 변수에 2를 더한 값을 반환한다.
ref 예시
public class Calculator
{
static void Main()
{
int number = 10; //초기화
Console.WriteLine("Original number: " + number);
PlusTwo(ref number);
Console.WriteLine("Plus Two: " + number);
}
static void PlusTwo(ref int n)
{
n += 2;
}
}
위 코드에서는 원래 값이 10인 number 변수를 PlusTwo 메서드에 ref 키워드를 통해 매개변수로 전달함으로써 실제 number의 값이 변화하도록 한다. 그래서 다음 줄에서 출력을 하면 10이 아닌 12가 출력된다.
[ 문자열 빌더 ]
문자열 빌더(StringBuilder)는 이미 할당된 문자열을 수정할 수 있도록 한다. 내부 메모리에서 동적으로 크기를 조절한다는 특징이 있다. 문자열 추가, 삽입, 제거, 교체 등이 있다.
public static void Main()
{
StringBuilder sb = new StringBuilder("안녕! 만나서 반가워.");
// 전체 제거
sb.Clear();
// 추가
sb.Append("반가워.");
//출력 결과
반가워.
// 삽입
sb.Insert(0, "안녕! ");
//출력 결과
안녕! 반가워.
// 제거
sb.Remove(2, 1);
//출력 결과
안녕 반가워.
// 교체
sb.Replace("안녕", "모두");
//출력 결과
모두 반가워.
string sentence = sb.ToString();
Console.WriteLine(sentence);
}
- Append(string): 문자열 맨 뒤에 추가
- Insert(int, string): 지정한 인덱스에 문자열 삽입
- Remove(int, int): 첫 번째 인수의 인덱스에 두 번째 인수의 개수만큼 문자열 제거
- Replace(string, string): 첫 번째 인수의 문자열을 두 번째 인수의 문자열로 교체
[ 회고 ]
제네릭은 많이 사용되는 것을 봤어서 한 번 제대로 공부해야겠다는 생각을 하고 있었다. 어려워 보이는 것에 비해 생각보다 간단했고, 선언 당시에 자료형을 고정하지 않는다는 점에서 유용하게 사용할 수 있을 것 같다. out, ref는 어떻게 사용할 수 있을까 하는 생각이 들었었다. ref는 잘 모르겠지만 out은 돌이켜보니 꽤나 많이 사용을 했던 기억이 있어서 이제 정확한 사용법을 알고 적절한 때에 사용할 수 있을 것 같다. ref도 아직 사용해보지 않았을 뿐이지 새로운 변수를 생성하고 할당하지 않는다는 점에서 편리하게 사용할 수 있을 것 같다. 하지만 직접 변수에 접근해서 값을 변화하는 것을 지양하는 만큼 너무 많이 무분별하게 사용하면 안 된다는 점을 기억하고 있어야겠다.
'Coding > C#' 카테고리의 다른 글
[내일배움캠프 77일차 TIL] 입력 값 한글, 영어, 특수문자 체크하고 바이트 다르게 계산하기 (0) | 2024.08.02 |
---|---|
[내일배움캠프 22일차 TIL] 객체 지향 프로그래밍(1) (0) | 2024.05.16 |
[내일배움캠프 15일차 TIL] 로직 설계, 기능별 파일 구분, 폴더 구조 (0) | 2024.05.03 |
[내일배움캠프 14일차 TIL] 추상 클래스, 인터페이스 (0) | 2024.05.02 |
[내일배움캠프 13일차 TIL] 클래스 메모리 구조, 기본값 세팅, 박싱/언박싱 (0) | 2024.05.01 |