C++은 경계 검사를 수행하지 않습니다
이러한 현상의 핵심 원인은 C++가 배열의 경계 검사(bounds checking)를 수행하지 않기 때문입니다. Java나 Python과 같은 언어에는 내장된 경계 검사 기능이 있어, 배열 범위를 벗어난 요소에 접근하려고 하면 즉시 예외(exception)를 발생시킵니다.
반면 C++는 설계 단계부터 '동일한 기능을 하는 C 코드보다 느려서는 안 된다'는 원칙을 따랐습니다. 그런데 C 언어 자체가 배열 경계 검사를 하지 않기 때문에, C++도 성능 저하를 피하기 위해 이 검사 과정을 생략한 것입니다. 경계 검사를 매번 수행하면 프로그램 실행 속도에 추가적인 부담이 생기기 때문입니다.
범위를 벗어난 접근은 '정의되지 않은 동작'입니다
배열의 유효 범위를 넘어선 메모리에 접근하면 어떻게 될까요? C++ 표준에 따르면 이 경우 프로그램의 동작은 정의되지 않은 동작(undefined behavior)으로 분류됩니다.
정의되지 않은 동작이 발생하면 결과를 전혀 예측할 수 없습니다. 구체적으로 다음과 같은 상황이 일어날 수 있습니다.
- 프로그램이 갑자기 크래시(crash)될 수 있습니다
- 프로그램이 멈추거나 응답하지 않을 수 있습니다
- 겉보기에는 정상적으로 실행되는 것처럼 보일 수도 있습니다
- 다른 응용 프로그램에 영향을 줄 수 있습니다 (현대 운영체제에서는 프로세스 격리 덕분에 드물지만)
개발자가 주의해야 할 점
'프로그램이 잘 돌아가는 것 같다'고 해서 안전하다는 뜻은 아닙니다. 정의되지 않은 동작은 컴파일러 버전, 최적화 옵션, 실행 환경에 따라 다르게 나타날 수 있으며, 어느 순간 갑자기 문제를 일으킬 수 있습니다. 따라서 std::vector의 at() 함수처럼 경계 검사를 제공하는 안전한 인터페이스를 활용하거나, 코드 리뷰와 정적 분석 도구를 통해 범위 초과 접근을 사전에 방지하는 것이 좋은 습관입니다.