Visual Basic에서 컬렉션(배열, 리스트, 사전 등)은 인덱스와 반복자(예: For Each)를 통해 접근할 수 있습니다. 언어의 역사에서 표준 배열의 첫 번째 요소는 인덱스 0을 가졌으나, VB6의 호환성 덕분에 1로 선언된 배열도 존재합니다. 이는 접근 순서와 가능한 오류에 영향을 미칩니다. 또한, Dictionary 유형의 컬렉션은 키를 사용한 검색을 지원하지만 존재하지 않는 요소에 접근하려고 하면 예외가 발생할 수 있습니다.
접근 문제는 구문 차이, 인덱서 작업의 특징, 모든 컬렉션이 요소가 없을 때 Null 또는 Nothing을 반환하지 않는다는 점에 있습니다—종종 예외가 발생합니다. 루프를 사용할 때는 인덱스 범위를 준수하고 컬렉션 크기를 미리 확인해야 합니다.
안전한 접근 방법으로는 길이를 확인하고, 사전의 ContainsKey나 TryGetValue 메서드를 사용하는 것, 그리고 For Each를 사용하여 요소를 열거할 때 존재하는 값에 접근하는 방법이 있습니다.
코드 예시:
Dim list As New List(Of String)({"a", "b", "c"}) For i As Integer = 0 To list.Count - 1 Console.WriteLine(list(i)) Next ' 반복자 사용: For Each item In list Console.WriteLine(item) Next ' Dictionary에서 안전한 접근 Dim dict As New Dictionary(Of Integer, String) dict(1) = "one" If dict.ContainsKey(2) Then Console.WriteLine(dict(2)) End If
주요 특징:
Dictionary에 숫자 인덱스로 접근할 수 있나요?
아니요, Dictionary는 숫자 인덱스로 접근을 지원하지 않고, 키로만 접근할 수 있습니다. 키를 순서대로 반복하려면 키 컬렉션을 가져와야 합니다:
For Each key In dict.Keys Console.WriteLine(dict(key)) Next
범위를 벗어난 인덱스로 List에 접근하면 어떻게 되나요?
ArgumentOutOfRangeException 예외가 발생합니다. 항상 인덱스가 Count보다 작고 0보다 크거나 같도록 확인하세요.
For Each에서 컬렉션이 반복되는 동안 요소를 변경하면 스킵할 수 있나요?
네, For Each 내에서 컬렉션을 변경하면 InvalidOperationException 예외가 발생합니다. 반복 중에 요소를 추가하거나 제거하지 않도록 하세요:
' 오류 예시 For Each x In list list.Remove(x) ' 예외 발생 Next
신입사원들이 For Each 루프 내에서 List에 요소를 추가하였고, 그 결과 앱이 InvalidOperationException 오류로 종료되었습니다.
장점:
반복을 시작하기 전에 요소 목록을 별도의 배열에 저장하고 복사본으로 작업하거나, 인덱스를 사용하여 For 루프를 사용하는 방법입니다. Dictionary에 접근하기 전에 키의 존재를 항상 확인하세요.
장점: