더북(TheBook)

2.2.1 원소에 접근하기

표준 배열처럼 [] 사이에 인덱스를 넣은 표현식으로 array 컨테이너의 원소를 접근하고 사용할 수 있다. 다음 코드는 array 컨테이너를 사용한다.

values[4] = values[3] + 2.0*values[1];

다섯 번째 원소 values[4]는 할당문의 우측값 표현식의 결괏값으로 설정된다. 이 예제처럼 인덱스를 사용해서 접근하면 경계 검사를 하지 않는다. 즉, 범위를 벗어난 인덱스를 사용해 데이터에 접근하거나 저장해도 탐지되지 않는다. 범위를 벗어난 인덱스 사용을 검사하려면 at() 함수 멤버를 사용해야 한다.

values.at(4) = values.at(3) + 2.0*values.at(1);

at()에 사용한 인수가 범위를 벗어난 인덱스 값인지 확인하고, 범위를 벗어난 값이면 std::out_of_range 예외가 발생한다는 점을 제외하면 이전 코드와 같다. 인덱스 범위를 벗어나는 일이 절대로 일어나지 않는다고 확신할 수 없다면 항상 at()을 사용해라. 그렇다면 왜 operation[]() 구현에서 경계 검사(bounds checking)를 하지 않을까 의문이 생길 것이다. 정답은 성능 때문이다. 원소에 접근할 때마다 인덱스를 검증한다면 오버헤드가 발생한다. 인덱스 값이 범위를 벗어날 가능성이 전혀 없다면 이런 오버헤드는 피해야 한다.

array 객체의 size() 함수는 원소들의 개수를 size_t 타입으로 반환하므로 이를 이용하면 values 배열 원소들의 합계를 다음과 같이 계산할 수 있다.

double total {};
for(size_t i {} ; i < values.size() ; ++i)
{
  total += values[i];
}
 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.