2.0 · 버전 이력
C# 2.0
담을 타입을 밖에서 정하는 제네릭이 들어왔습니다.
한눈에
무엇이 더해졌나
C# 2.0은 2005년에 나왔습니다. 이 판의 중심은 제네릭입니다. 담을 타입을 밖에서 정해 주는 방식으로, 지금 우리가 쓰는 컬렉션이 모두 여기서 나왔습니다.
- 제네릭 —
List<int>처럼 담을 것을 적습니다. - nullable 값 형식 —
int?로 "값이 없음" 을 담습니다. - 반복자 —
yield return으로 하나씩 내어 줍니다. - 익명 메서드 — 이름 없는 코드 묶음을 넘깁니다.
제네릭
담을 것을 미리 밝히기
그때까지 여러 값을 담으려면 ArrayList 를 썼는데, 여기에는
무엇이든 들어갔습니다. 그래서 꺼낼 때마다 무엇인지 되돌려 밝혀야
했고, 엉뚱한 것이 섞여 있어도 실행하기 전에는 알 수 없었습니다.
C# 1 까지
var list = new ArrayList(); list.Add(10); list.Add("열"); // 섞여도 막지 않습니다 int n = (int)list[1]; // 실행 중에 예외
C# 2 부터
var list = new List<int>(); list.Add(10); list.Add("열"); // 컴파일 오류 int n = list[0]; // 되돌려 밝힐 것이 없습니다
잘못을 실행 전에 잡아 주는 것이 첫째 이득이고, 값을 상자에 넣었다 빼는 일이 사라져 빨라진 것이 둘째입니다.
C# 1.7 배열과 컬렉션 기초 에서
List<T> 를 다룹니다.
nullable 값 형식
값이 없을 수도 있다고 적기
int 는 반드시 값을 가져야 합니다. 그런데 "아직 적지
않음" 이나 "해당 없음" 을 나타내야 할 때가 있고, 그때까지는 -1 같은 값을 약속해
두고 쓰는 수밖에 없었습니다. 물음표를 붙이면 비어 있는 상태를
타입이 담아 줍니다.
int? age = null; // 아직 모릅니다 if (age.HasValue) { Console.WriteLine(age.Value); }
참조 형식(string 등)에 같은 것을 적을 수 있게 된 것은
한참 뒤인 C# 8.0입니다.
C# 1.3 변수와 데이터 타입 에서 짧게 짚습니다.
배경
- 이 판이 겨눈 것은 타입을 잃지 않게 하는 것입니다.
- 제네릭이 없던 시절의 컬렉션은 무엇이 들었는지 코드가 말해 주지 않았습니다.
- 지금 코드에서
ArrayList를 만난다면 아주 오래된 것입니다.