티스토리 뷰

T& at(int index) {
    if(index < n) {
        return data[n];
    }

    throw "out of range";
}

T* begin() { return data; }
const T* begin() const { return data;}
T* end() { return data + n; };
const T* end() const { return data + n; }

의 차이점은 뭘까? 

 

둘 다 동일하게 T* data의 인자를 반환하도록 생성할 이유라면, 

T& begin() { return data[0]; }

와 같이 쓰면 안되나? 

 

찾아보니, 이는 사용 목적의 차이라고 한다.


T& at(int index)`에서 참조 사용


1. 안전성과 직접 접근:

 `at` 함수는 컨테이너의 특정 요소에 대한 직접적이고 안전한 접근을 제공한다. 참조를 반환함으로써, 함수는 컨테이너 내의 실제 요소를 "별명"으로 직접 다룰 수 있게 해준다. 이렇게 하면, 반환된 값이 컨테이너의 실제 요소를 나타내는 것이 명확해지며, 사용자는 이를 통해 해당 요소를 직접 읽거나 수정할 수 있게 된다.
    
2. 예외 처리:

 `at` 함수는 범위 검사를 수행하고, 주어진 인덱스가 유효하지 않은 경우 예외를 던진다. 참조를 사용하면, 이러한 유효성 검사를 수행한 후에만 요소에 접근할 수 있으므로, 안전성이 보장된다.
   


T* begin() 및 T* end() 에서 포인터 사용

1. 반복자(iterator) 구현:

 이러한 함수들은 컨테이너의 반복자를 제공한다.

C++에서 반복자는 종종 포인터와 유사한 방식으로 작동하는데, begin() 은 컨테이너의 첫 번째 요소를 가리키는 포인터를, end()는 컨테이너의 마지막 요소 다음을 가리키는 포인터를 반환하도록 한다.
    
2. 범위 기반 루프와의 호환성:

begin()과 end()가 포인터를 반환하면, 이들은 범위 기반 for 루프(for(auto& item : container))와 같은 C++ 언어 구조와 잘 호환된다. 이러한 루프는 컨테이너의 시작과 끝을 나타내는 반복자(이 경우 포인터)를 사용하여 컨테이너를 반복 처리한다.
    
3. 포인터 산술: end() 함수에서 `data + n`을 사용하는 것은 포인터 산술의 한 예이며, 이는 포인터가 가리키는 주소에서 `n` 요소만큼 떨어진 위치를 가리키는 새로운 포인터를 생성한다. 이러한 연산은 참조로는 수행할 수 없기 때문에 포인터 변수를 반환하게 해야 한다.
   


요약


- T& at(int index):

안전하고 직접적인 요소 접근을 위해 참조를 사용합니다. 예외 처리를 통해 범위 검사를 수행합니다.


- T* begin() 및 T* end():

반복자로서의 역할을 수행하기 위해 포인터를 사용합니다. 범위 기반 루프와 호환되며, 포인터 산술을 활용합니다.

 


이러한 방식으로 참조와 포인터를 사용함으로써, C++는 더 풍부하고 유연한 프로그래밍 패러다임을 제공하게 됩니다.

Comments