본문 바로가기
스터디/C++

[ C++ ] 배열 클래스와 인덱스 연산자 오버로딩

by 알 수 없는 사용자 2019. 10. 11.

배열 접근 연산자(인덱스 연산자)인 [ ]을 오버 로딩할 것인데, 이건 멤버 함수 기반으로만 오버 로딩이 가능한 연산자이다.

 

이것 외에도 

 

= 대입 연산자

( ) 함수 호출 연산자

-> 포인터 연산자 

 

총 4개는 멤버함수 기반으로만 오버 로딩이 가능한 연산자이다.

 

그럼 배열 클래스를 생성하고, 인덱스 연산자를 오버 로딩을 해보자.

 

Int형 데이터를 저장하는 배열 클래스를 선언해 보았다.

 

arr 크기를 5로 잡고 

0번에는 1

1번에는 2

2번에는 3

3번에는 4

4번에는 5

 

값을 저장하였다.

 

근데 여기서 0~4번이 아닌 다른 인덱스를 접근하면 어떻게 될까?

 

arr [5]에 접근하니까 이상한 데이터를 받아온다.

 

이렇듯 C와 C++은 기본적으로 배열에서 경계 검사를 하지 않는다.

그래서 벗어난 범위의 데이터를 가져와 프로그램에서 예측 불가능한 결과를 도출하기도 한다.

 

하지만 우리는 인덱스 접근하는 연산자를 오버 로딩했기 때문에 

경계 검사를 임의로 할 수 있다.

 

이렇게 우리는 배열 접근의 안전성을 보장받을 수 있게 되었다.

 

또 고려해야 할 점은 배열 데이터의 유일성이다.

배열은 저장소의 일종이고, 저장된 데이터는 유일성이 보장되어야 하기 때문에,

저장소의 복사는 불필요하거나 잘못된 일로 간주된다. 예로 들면 다음과 같은 경우를 말한다.

Make_Int_array arr(5);

for (int i = 0; i < 5; i++)
{
	arr[i] = i + 1;
}

Make_Int_array temp(5);
temp = arr; // or Make_Int_array temp = arr;

 

즉, 복사 생성자와 대입 연산자를 빈 상태로 정의하여 얕은 복사를 막고 private 멤버로 둠으로써 복사와 대입을 막아야 한다.

 

그럼 결과를 보자

 

대입 연산자 접근 불가

 

복사 생성자 접근 불가

그리고 다음을 살펴보자.

 

Show 함수는 배열 값을 출력하는 함수이다.

그리고 배열에 저장된 데이터를 변경하지 못하도록 매개변수 형이 const로 선언되었다.

그런데 operator [] 함수는 const로 선언된 함수가 아니기 때문에 기존의 operator[] 함수을 호출하지 못한다.

operator[] 함수에 const 선언을 하면 처음에 배열 저장을 할 때 문제가 생긴다.

 

그래서 operator [] 함수와 operator [] const 함수를 정의해야 한다.

그 대신 cout<< ref [i] <<endl;은 주소 값만 필요하므로 참조자를 반환하지 않아도 된다.