C#/C# 교과서
[C# 교과서] 28~29. 제네릭 사용하기, 널(null) 다루기
서니션
2023. 1. 5. 22:19
제네릭
- 특정 형식을 지정하여 컬렉션에 저장하고 사용할 수 있음
- 다른 데이터 형식을 추가할 수 없도록 형식 안정성을 적용
- 데이터 형식 변환 등 작업이 따로 필요하지 않음
- Cup<T>를 형식 매개변수인 T에 따른 Cup 클래스의 개체를 생성하는 것
Cup of T
넘어오는 데이터 형식에 따라 해당 개체 성격을 변경하는 구조를 제네릭이라 함
Stack과 제네릭 클래스 사용
- 일반 클래스 Stack과 제네릭 클래스인 Stack<T>는 하는 일이 동일함
- 다만 Stack 클래스는 데이터 object를 다루고, Stack<T> 클래스는 T로 지정한 데이터로 다룸
- object로 만든 데이터를 실제 사용하려는 string과 같은 형식으로 표현할 때는 중간에 변환 과정을 거치기 때문에 이 부분에서 추가 작업을 진행하는 비용이 발생함
- 그래서 정확한 데이터 형식을 쓸 수 있는 Stack<T> 같은 제네릭 클래스를 사용하면 좋음
(박싱 작업과 언박싱 작업을 하지 않아도 되므로 성능이 향상)
List<T> 제네릭 클래스
- List of T
- 무언가의 리스트를 나타냄
- List<int>, List<string> 등으로 사용
- 이렇게 만든 제네릭 컬렉션 개체는 for 문 또는 foreach 문 등으로 쉽게 가져다 사용할 수 있음
Enumerable 클래스로 컬렉션 만들기
- System.Linq 네임스페이스에 들어 있음
- Range()와 Repeat() 메서드를 제공
- 특정 범위의 정수 컬렉션을 손쉽게 만들 수 있음
- 콤마가 포함된 배열을 가져오려면 string.Join 메서드와 함께 사용
- string.Join(”,”, Enumerable.Range(1,5))
using System;
using System.Linq;
namespace codingstudy
{
class Program2
{
static void Main()
{
var numbers = Enumerable.Range(1,5);
foreach (var n in numbers)
{
Console.Write("{0}\\t",n);
}
Console.WriteLine();
var sameNumbers = Enumerable.Repeat(-1, 5);
foreach (var n in sameNumbers)
Console.Write($"{n}\\t");
Console.WriteLine();
}
}
}
Dictionary<T, T> 제네릭 클래스
딕셔너리 개체를 사용하여 키와 값으로 데이터를 저장하고 사용할 수 있는 딕셔너리 제네릭 클래스
null 다루기
프로그래밍에서 널(null, Null, NULL, nil)은 아무것도 없다는 상태를 의미
empty가 아닌 undefined 라고 이해
null 가능 형식 : Nullable<T> 형식
기본 제공 형식을 null이 가능한 형식으로 변경하려면 Nullable<T> 제네릭 형식을 사용
bool과 Nullable<bool>의 차이점
- bool 형식은 true와 false를 가짐
- Nullable<bool> 형식은 true, false, null을 가짐
Nullable<T> 형식을 줄이는 방법은 데이터 형식 뒤에 ?(물음표)를 붙이는 것
예를 들어 bool? int? 형식으로 null 가능 형식을 사용
Nullable<T> 형식이 제공하는 주요 멤버
- HasValue 속성 : 값이 있으면 true, null 값이면 false를 반환
- Value 속성 : 값 반환
- GetValueOrDefault : 값 또는 기본값 반환
Nullable 형식은 null이 할당될 수 있는 형식을 의미
Nullable<int> i = null;
int? i = null;
?? 연산자(null 병합 연산자)
물음표 2개 (??)로 된 연산자인 null 병합 연산자는 왼쪽 항이 null이 아니면 해당 값을 반환하고, 그렇지 않으면 오른쪽 값을 반환
using System;
using System.Collections;
namespace codingstudy
{
class Program2
{
static void Main()
{
string nullValue = null;
string msg ="";
nullValue = null;
// if 구문으로 null 값 비교
if (nullValue == null)
{
msg = "[1] null이면 새로운 값으로 초기화합니다.";
}
Console.WriteLine(msg);
// ?? 연산자로 null 값 비교
msg = nullValue ?? "[2] null이면 새로운 값으로 초기화합니다.";
Console.WriteLine(msg); // nullValue가 null이니까 우측값 반환
nullValue = "Hello";
msg = nullValue ?? "[3] Nothing";
Console.WriteLine(msg);
}
}
}
