Minwoo Dev.

[C++] 배열의 인덱스 연산자 오버로딩, operator[] 본문

C++

[C++] 배열의 인덱스 연산자 오버로딩, operator[]

itisminu 2024. 7. 23. 10:30
728x90
반응형
SMALL

배열은 인덱스 연산자를 사용하여 해당 인덱스의 값을 반환하게 된다.

 

예를 들어서, 

int arr[5] = {1,2,3,4,5};
cout<<arr[3]<<endl;

 

위 코드에서 arr[3]은 arr 배열의 4번째 인덱스, 즉 4를 반환하고, 그것을 출력하게 된다.

 

이처럼 배열 인덱스 연산자인 [] 는 해당 인덱스의 값을 반환하는 역할을 한다.

하지만, 이러한 배열에서 해당하지 않는 인덱스의 값을 반환하려 하면 에러가 발생하고 프로그램이 종료된다.

 

 

우리는 이 인덱스 연산자의 단점인 해당하지 않는 인덱스에 접근하는 경우를 수정하여 배열의 인덱스 연산자를 오버로딩 해보겠다.

 

 

 

operator[]

기본적인 형태는 아래와 같다.

int& operator[](int idx){
	return arr[idx];
}

 

우리는 int형 배열에 대한 인덱스 연산자를 오버로딩 하기 때문에 반환값이 int& 이지만, 다른 자료형의 배열을 다루려면 반환형만 바꿔주면 된다.

 

위 형태에 배열의 길이 내에서의 인덱스가 아닌 경우에 에러를 발생시키도록 코드를 추가해보겠다.

 

배열의 범위를 확인하는 클래스를 정의하고, 멤버함수로 배열 인덱스 연산자 오버로딩을 추가한다.

class BoundCheckIntArray{
private:
    int *arr;
    int arrlen;
public:
    BoundCheckIntArray(int len):arrlen(len){
        arr = new int[len];
    }
    int& operator[](int idx){
        if(idx<0 || idx>=arrlen){ // 배열 범위 밖일 때
            cout << "Array index out of bound exception" << endl;
            exit(1);
        }
        return arr[idx];
    }
    ~BoundCheckIntArray(){
        delete[] arr;
    }
};

 

위 코드를 보게되면, 멤버변수로 arrlen을 가지고 있다. 

이 배열의 길이인 arrlen을 가져와서 operator[] 함수에서 해당 범위에 속하는 인덱스인지 검사하는 것이다.

 

 

main함수도 추가하여 실행해보겠다.

 

전체 코드

#include<iostream>
using namespace std;

class BoundCheckIntArray{
private:
    int *arr;
    int arrlen;
public:
    BoundCheckIntArray(int len):arrlen(len){
        arr = new int[len];
    }
    int& operator[](int idx){
        if(idx<0 || idx>=arrlen){
            cout << "Array index out of bound exception" << endl;
            exit(1);
        }
        return arr[idx];
    }
    ~BoundCheckIntArray(){
        delete[] arr;
    }
};

int main(void){
    BoundCheckIntArray arr(5);
    for (int i = 0; i < 5;i++)
        arr[i] = (i + 1) * 11;
    for (int i = 0; i < 6;i++)
        cout << arr[i] << endl;
    return 0;
}

 

실행 결과

728x90
반응형
LIST