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
   13   14   15   16   17   18   19   20   21   22   23