삽질의 현장/- C++

#012_시(c)시(c)해서 C++?!_ 배열의 인덱스 연산자 중복정의

shovelman 2015. 7. 12. 01:54

안녕하세요 삽잡이입니닷...


[] 연산자는 배열을 쓸 때 많이들 보셨죠? 

또한 * 의 기능과 같은 역활을 수행한다고 했었죠...

주소 앞/ 뒤에 붙였을 떄 그 주소에 있는 값을 나타내는...


예를들어 [] 연산자는 sap[n];

즉, sap이라는 주소에서 +n번째 메모리를 의미하는 것이죠.


이 연산자는 동일한 자료형들을 보관하는 컬렉션에서 접근하기 위한 용도로 사용됩니다...

이 또한 우리는 중복정의할 수 있습니다.


우선 비교를 통해 살펴보도록 하겠습니다...


int arr[10];

arr[4] = 2;


이와같은 arr 배열의 4번째 index에 2를 입력했을 때에 

int형 arr의 주소의 4번째 메모리에 2의 값이 들어갑니다...


하지만, 객체의 입장에서 살펴보도록 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class IntArr
{
    int *base;
    int max;
public:
    IntArr(int num)
    {
        max = num;
        base = new int[max];
    }
    ~IntArr()
    {
        delete[] base;
    }
};
 
IntArr arr(10);
arr[2= 4;
cs


IntArr라는 클래스 

즉, 사용자 정의형으로 int형 사이즈로 연속적인 메모리 공간을 할당했습니다.

IntArr 객체를 생성했고, 버퍼로부터 2번째의 주소에 4를 넣겟다는데... 

이러한 피연산자와 일치하는 [] 연산자는 없다고 합니다...


사실 맞는 말입니다.. 

IntArr은 우리가 정의했으니 컴파일러 입장에서는 이해를 하지 못하게 되니깐요...


자... 이 코드를 해결하기 위해서는 우리는  연산자 중복정의를 해야합니다...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class IntArr
{
    int *base;
    int max;
public:
    IntArr(int num = 0)
    {
        max = num;
        base = new int[max];
    }
    ~IntArr()
    {
        delete[] base;
    }
    int& operator[](int index)
    {
        if ((index >= 0) && (index < max))
        {
            return base[index];
        }
        throw "펑~!";
    }
};
 
void main()
{
    IntArr arr(10);
    arr[3= 7;
}
cs



arr[2] 라는 뜻은 메모리 덩어리입니다. 즉, 값과 메모리를 포함한 덩어리라는 것입니다... 


그러니 덩어리 통째로 반환을 하여 값을 저장할 수 있도록
반환형을 참조형으로 정의합니다.

이와같이 연산자 중복정의를 통해서 
객체에서도 배열과 같이 메모리에 접근하여 값을 저장할 수 있게 됬습니다.