언어 자료구조 알고리즘/Escort C++

[C++] 인덱스 연산자 중복 정의 (배열 클래스 정의)

언제나휴일 2016. 4. 15. 15:10
반응형

7.2.2 [ ] 연산자 중복 정의

 

 이번에는 배열과 같은 다른 자료들을 보관하는 컬렉션에서 보관된 자료에 접근하기 위해 제공하는 [] 연산자 중복 정의에 관해 얘기해 보도록 하겠습니다. 먼저, [] 연산자의 피 연산자를 무엇으로 할 것인지와 리턴 형식을 무엇으로 하는 것이 타당한지에 대해 살펴봅시다.

 

 이를 위해 C언어와 C++에서 배열을 사용하는 예를 살펴볼게요.

 

int arr[10];

int i=0;

arr[8]=i;

i=arr[8];

 

 위의 코드와 같이 [] 연산자에는 배열의 이름과 index가 피 산자로 오게 됩니다. 우리는 배열과 같이 자료들을 보관할 컬렉션을 구현할 것이기 때문에 []연산자의 좌항은 우리가 정의할 컬렉션 형식이 오게 하고 우항으로 index에 해당하는 정수가 오게 하면 되겠네요. 그렇다면 리턴 형식은 어떻게 정의를 해야 할까요? 연산 결과가 대입 연산자의 좌항에 올 수 있어야 하면서 보관된 형식이어야 합니다. 대입 연산자의 좌항으로 올 수 있게 하기 위해서는 원소 형식의 &를 반환하면 원소 형식처럼 사용도 가능한 l-value가 됩니다.

 

 참고로, l-value는 대입 연산자 좌항에 올 수 있는 표현을 말합니다.


C++ 동적 배열 클래스, 인덱스 연산자 중복 정의

[그림 7.8]

 

 여기에서는 [그림 7.8]과 같은 멤버들로 구성한 컬렉션을 만들어 보기로 할게요. IntArr 클래스는 정수를 보관하는 컬렉션입니다. 멤버 필드로는 자료들을 보관하는 버퍼의 시작 위치를 관리하는 멤버 basr가 있고 버퍼의 크기에 해당하는 capa가 있습니다.

 

 버퍼의 생성자에서는 입력 인자로 버퍼의 크기를 전달받도록 하겠습니다. 생성자에서는 입력 인자로 전달받은 만큼의 크기를 갖는 버퍼를 동적으로 생성하면 될 것입니다. 그리고 보관하거나 보관된 값을 변경하기 위해 [] 연산자를 중복 정의를 하기로 하겠습니다. 소멸자에서는 컬렉션 개체가 생성되면서 동적으로 생성한 버퍼를 소멸하는 작업이 필요하겠네요.

 

 내부적으로 호출하여 사용할 멤버로는 컬렉션 개체가 생성될 때 버퍼의 각 원소르 0으로 초기화하는 멤버 메서드를 추가하겠습니다. 그리고 [] 연산자를 중복 정의함에 입력 인자로 넘어온 index가 해당 컬렉션에서 사용할 수 있는 인덱스인지를 확인하는 내부 멤버 메서드가 필요할 것입니다. 그리고 뒤에서 예외처리를 소개할 것인데 [] 연산자를 잘못 사용하면 예외를 발생시켜 잘못된 코드가 있다는 것을 알리기로 하겠습니다. 만약, [] 연산자를 잘못 사용할 경우 예외를 처리하지 않으면 프로그램은 종결되어 개발자로 하여금 잘못된 코드가 있다는 것을 개발 시에 인지할 수 있게 해 줍니다.

 

 다음은 이에 대한 예제 코드입니다.

 

IntArr.h

#pragma once

class IntArr

{

    int *base;

    const int capa;

public:

    IntArr(int _capa);

    ~IntArr(void);

    int &operator[](int index);

private:

    void Initailize();

    bool AvailIndex(int index);

};

 

 

IntArr.cpp

#include "IntArr.h"

IntArr::IntArr(int _capa):capa(_capa)

{

    base = new int[capa];

    Initailize();

}

IntArr::~IntArr(void)

{

    delete[] base;

}

int &IntArr::operator[](int index)

{

    if(AvailIndex(index))

    {

        return base[index];

    }

    throw "잘못된 인덱스를 사용하였습니다.";

}

void IntArr::Initailize()

{

    for(int i = 0;i<capa;i++)

    {

        base[i] = 0;

    }

}

bool IntArr::AvailIndex(int index)

{

    return (index>=0)&&(index<capa);

}

 

 다음은 이와 같이 작성된 컬렉션 클래스를 사용하는 예제 코드입니다.

 

Example.cpp

#include "IntArr.h"

#include <iostream>

using namespace std;

void main()

{

    IntArr arr(5);

 

    for(int i = 0;i<5;i++)

    {

        arr[i] = i * i;

    }

    for(int i = 0;i<5;i++)

    {

        cout<<"arr["<<i<<"]:"<<arr[i]<<endl;

    }

}

 

그리고 [그림 7.9]는 이를 실행했을 때의 화면입니다.


[그림 7.9]


7장 산자 의 Part1

7장 산자 의 Part2

(모든 동영상 강의는 무료입니다.)

반응형