Page 20 -
P. 20
}
static void PrintNames(ArrayList names)
{
foreach (string name in names) ArrayList에 문자열이 저장되어 있지 않다면 무슨 일이 일어날까? 2
{ C# 2
Console.WriteLine(name);
}
}
이전보다 GenerateNames가 깔끔해진 것 같다. 이제 컬렉션에 저장할 이름의 개수를 미리 알아야
할 필요가 없다. 그런데 여전히 문제가 되는 부분은 컬렉션에 문자열이 아닌 다른 타입의 객체를
저장하는 것을 막을 방법이 없다는 것이다. ArrayList의 Add 메서드가 Object 타입을 매개변수로
취하기 때문이다.
게다가 PrintNames는 타입 안정적으로 작성된 것처럼 보이지만 실제로는 그렇지 않다. 이 메
서드가 사용하는 컬렉션에는 참조 타입이라면 어떤 객체라도 포함될 수 있기 때문이다. 컬렉션
에 완전히 다른 타입(예를 들어 WebRequest)의 객체가 포함되어 있고, 이를 출력하려고 하면 무
슨 일이 일어날까? foreach는 컬렉션의 내용을 name 변수의 타입과 일치시키기 위해, 내부적으
로 object를 string으로 변환하는 암시적 타입 변환이 수행된다. 이렇게 타입 변환을 시도하면
InvalidCastException이 발생한다. 예외가 발생하지 않도록 코드를 수정한다 하더라도 또 다른
문제가 있다. 이 문제를 완벽히 해결할 수는 없을까?
예제 2-3 StringCollection을 이용하여 이름을 저장하고 출력하는 예 ▶ NamesWithStringCollection.cs
static StringCollection GenerateNames()
{
StringCollection names = new StringCollection();
names.Add("Gamma");
names.Add("Vlissides");
names.Add("Johnson");
names.Add("Helm");
return names;
}
static void PrintNames(StringCollection names)
{
foreach (string name in names)
{
Console.WriteLine(name);
}
}
061