2.0 · 버전 이력

C# 2.0

담을 타입을 밖에서 정하는 제네릭이 들어왔습니다.

2005 .NET Framework 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 를 만난다면 아주 오래된 것입니다.