[디딤돌 C++] 50. 인덱스 연산자 중복 정의

이번에는 인덱스 연산자 중복 정의를 살펴보기로 해요.

배열과 같은 컬렉션은 인덱스 연산을 통해 원소에 접근할 수 있게 사용자 편의를 제공하곤 합니다. 배열의 인덱스 연산의 결과는 좌항에 올 수도 있기 때문에 연산 결과는 원소 자체를 의미합니다. 만약 정수 형식의 데이터를 원소로 하는 배열 클래스를 정의하고 인덱스 연산자를 중복 정의한다면 원소 자체를 반환하게 구현해야 하므로 다음과 같이 정의합니다.

int &operator[](int index);//인덱스 연산자 중복 정의

다음은 인덱스 연산을 중복 정의하여 정수 형식의 데이터를 보관하는 DCArr 클래스를 정의하고 이를 사용한 예제 코드입니다.

//DCArray
#pragma once
class DCArray
{
    int *base;
    int bcapacity;
    int usage;
public:
    DCArray(int usage=0,int data=0);
    DCArray(const DCArray &src);//복사 생성자    
    ~DCArray();//소멸자    
    void Copy(const DCArray &src);//src 개체를 복사
    DCArray &operator=(const DCArray &src);//= 연산자 중복 정의            
    int &operator[](int index);//인덱스 연산자 중복 정의
    bool IsAvailIndex(int index)const;
private:
    void Init();
};
//DCArray.h
#include "DCArray.h"
DCArray::DCArray(int usage,int data)
{    
    Init();
    if(usage)
    {        
        base = new int[usage]; //bcapacity개수의 int 형식을 동적으로 생성        
        bcapacity = usage;
    }    
    for(   ;this->usage<usage; this->usage++) //data를 usage만큼 보관
    {
        base[this->usage] = data;
    }
}

DCArray::DCArray(const DCArray &src)
{
    Init();
    Copy(src);
}
DCArray::~DCArray()
{
    if(base)
    {
        delete[] base;
    }
}

void DCArray::Copy(const DCArray &src)//src 개체를 복사
{
    bcapacity = src.bcapacity;
    if(base)
    {
        delete[] base;
    }
    base = new int[bcapacity];
    usage = src.usage;
    for(int i = 0; i<usage;i++)
    {
        base[i] = src.base[i];
    }
}
DCArray &DCArray::operator=(const DCArray &src)//= 연산자 중복 정의    
{
    Copy(src);
    return (*this);
}
int &DCArray::operator[](int index)
{
    if(IsAvailIndex(index))
    {
        return base[index];
    }
    throw "유효하지 않은 인덱스를 사용하!!!";
}
bool DCArray::IsAvailIndex(int index)const
{
    return (index>=0)&&(index<usage);
}
void DCArray::Init()
{
    base = 0;
    bcapacity = usage = 0;
}
//인덱스 연산자 중복 정의
//Program.cpp

#include "DCArray.h"
#include <iostream>
using namespace std;
int main()
{
    DCArray dcarr(10);//저장소의 크기가 10인 동적 배열 선언

    dcarr[3] = 10;
    dcarr[9] = 9;
    for(int i = 0; i<10;i++)
    {
        cout<<dcarr[i]<<" ";
    }
    cout<<endl;
    return 0;
}