Page 18 -
P. 18
이 목록은 제네릭을 사용했을 때 유용한 경우를 모두 나열했다기보다 개발자가 거의 항상 제네릭
을 사용하게 되는 부분을 나타낸 것이다. 특히 컬렉션에서의 활용 예는 .NET 1의 컬렉션과 .NET
2
2의 제네릭 컬렉션을 비교할 수 있기 때문에 제네릭의 이점을 가장 간단히 살펴볼 수 있는 부분이
기도 하다. C# 2
2.1.1 예제를 통한 소개: 제네릭 이전의 컬렉션
.NET 1에는 크게 나눠 보면 세 가지 종류의 컬렉션이 있다.
● 배열: 언어와 런타임에서 직접적으로 지원한다. 초기화 시에 크기가 고정된다.
● Object 기반 컬렉션: 값(혹은 키)으로 System.Object 타입을 사용하도록 명시되어 있다. 인덱
서나 foreach 문과 함께 사용할 수 있지만 컬렉션 전용의 언어 요소는 존재하지 않으며, 런타
임에서 특별히 지원하는 부분도 없다. ArrayList와 Hashtable이 가장 흔히 사용되는 예다.
● 특화된 컬렉션: 값으로 구체적인 타입을 사용하도록 명시되어 있으며, 명시된 타입의 값만
을 컬렉션에 담을 수 있다. 예를 들어 StringCollection은 문자열만을 담을 수 있는 컬렉
션이다. API 목록을 살펴보면 ArrayList와 유사해 보이지만, 값을 참조할 때 Object 대신
String을 사용한다는 차이가 있다.
배열과 특화된 컬렉션은 타입이 고정된 컬렉션이므로 다른 타입의 값을 삽입할 수도 없고, 컬렉션
에서 값을 얻어올 때도 다른 타입으로 변환(cast)할 필요가 없다. 3
NOTE 참조 타입의 배열은 배열의 공변 특성 때문에 값을 저장할 때는 대체로 안전하다. 이 책의 범위를 벗어
나는 주제이기는 하지만, 배열에 공변의 특성을 부여한 것은 초기 설계의 실수라고 생각한다. 에릭 리퍼트가 공변과
3
반공변 특성에 대해서 쓴 블로그의 글 을 살펴보기 바란다.
구체적인 예를 살펴보자. 특정 메서드(GenerateNames) 내에서는 문자열 컬렉션을 생성하고, 다
른 메서드(PrintNames)에서는 이 컬렉션의 내용을 출력하고 싶다고 하자. 배열, ArrayList,
StringCollection을 이용하여 각기 다른 세 가지 방법으로 이름을 저장하기 위한 용도의 컬
렉션을 선언할 수 있다. 각각의 장단점을 생각해 보자. 개별 코드는 거의 유사하지만(특별히
PrintNames의 경우) 차근차근 살펴보자. 먼저, 배열을 사용하는 경우다.
3 http://mng.bz/gYPv
059