문제상황:
다음의 코드는 사용자가 입력한 숫자들을 담은 리스트에서 홀수를 찾아서 다른 리스트에 추가하는 코드입니다. 그러나 코드를 실행하면 에러가 발생합니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> oddNumbers = new List<int>();
for (int i = 0; i <= numbers.Count; i++)
{
if (numbers[i] % 2 != 0)
{
oddNumbers.Add(numbers[i]);
}
}
Console.WriteLine(string.Join(",", oddNumbers));
}
}
에러로그 내용:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
해결방법:
에러가 수정된 코드와 수정된 부분에 대한 주석은 다음과 같습니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> oddNumbers = new List<int>();
for (int i = 0; i < numbers.Count; i++) // 수정된 부분: i <= numbers.Count에서 i < numbers.Count로 변경
{
if (numbers[i] % 2 != 0)
{
oddNumbers.Add(numbers[i]);
}
}
Console.WriteLine(string.Join(",", oddNumbers));
}
}
원인분석:
에러 발생 원인은 for 루프의 조건문에서 발생한 것입니다. 기존 코드에서는 i <= numbers.Count 라고 되어 있어, 인덱스가 리스트의 범위를 벗어나게 되어 에러가 발생하였습니다. 리스트의 인덱스는 0부터 시작하므로, 마지막 인덱스는 numbers.Count - 1이 됩니다. 따라서 조건문을 i < numbers.Count로 수정하여 해결하였습니다.
에러 발생 원리와 해결된 코드의 작동 원리를 각각 단계별로 설명하겠습니다.
에러 발생 원리:
- for 루프에서 i의 값이 numbers.Count와 같아지면, numbers[i]는 리스트의 범위를 벗어난 인덱스에 접근하게 됩니다.
- 이로 인해 System.IndexOutOfRangeException 에러가 발생합니다.
해결된 코드의 작동 원리:
- for 루프의 조건문을 i < numbers.Count로 수정하여, i의 값이 numbers.Count - 1에서 루프를 종료하도록 합니다.
- 이렇게 하면, 루프 내에서 numbers[i]의 접근이 항상 리스트의 범위 내에서 이루어지기 때문에 에러가 발생하지 않습니다.
수정된 코드 실행 결과:
- 수정된 코드를 실행하면, 홀수 값만이 정상적으로 oddNumbers 리스트에 추가됩니다.
- 최종적으로 홀수들만 출력되는 것을 확인할 수 있습니다.
참고링크:
- 관련 에러에 대한 공식 문서: IndexOutOfRangeException Class (System)
728x90