Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 배열 인덱스 연산자 [] 오버로딩 완벽 정리

연산자 오버로딩(Operator Overloading)은 객체 지향 프로그래밍 언어의 핵심 기능 중 하나로, 매우 중요한 역할을 합니다. 연산자 오버로딩은 컴파일 타임(정적) 다형성의 한 종류에 해당하며, 사용자가 정의한 클래스 객체에 기본 자료형처럼 연산자를 적용할 수 있게 해줍니다.

배열 인덱스 연산자 [] 오버로딩이란?

C++에서는 [] 연산자를 오버로딩하여 클래스 내부에 캡슐화된 배열을 일반 배열처럼 직관적으로 사용할 수 있습니다. 특히 이 방식을 활용하면 다음과 같은 장점이 있습니다.

  • 인덱스 범위 검사를 통해 배열 범위 초과(out of bound) 오류를 사전에 방지할 수 있습니다.
  • 참조(int&)를 반환하므로 읽기와 쓰기가 모두 가능합니다.
  • 내부 구현은 숨기고 안전한 인터페이스만 외부에 노출할 수 있습니다.

알고리즘

시작
   Arr 클래스를 생성하고 배열의 크기를 선언한다.
   클래스 내부에서 for 루프를 사용해 모든 요소를 초기화한다.
   모든 요소를 출력한다.
종료.

예제 코드

#include <iostream>
#include <stdlib.h>
using namespace std;

const int M = 7;  // 최대 배열 크기

class Arr {
    private:
        int A[M];   // 내부 배열
        int size;   // 실제 사용 크기
    public:
        // 생성자: 크기와 초기값을 받아 배열을 초기화
        Arr(int s, int v) {
            if(s > M) {
                cout << endl << "최대 크기를 초과했습니다";
                exit(1);
            }
            size = s;
            for(int i = 0; i < size; i++)
                A[i] = v;
        }

        // [] 연산자 오버로딩: 참조를 반환하여 대입도 가능
        int& operator[](int i) {
            if((i < 0) || (i >= size)) {
                cout << endl << "오류: 배열 범위 초과";
                exit(1);
            }
            return A[i];
        }
};

int main() {
    int i = 0;
    Arr a(7, 0);              // 크기 7, 초기값 0으로 생성
    for(i = 0; i < 7; i++)
        a[i] = i * 10;        // 오버로딩된 []로 값 대입
    cout << "배열 요소:" << endl;
    for(i = 0; i < 7; i++) {
        int val = a[i];       // 오버로딩된 []로 값 읽기
        cout << val << endl;
    }
    return 0;
}

실행 결과

배열 요소:
0
10
20
30
40
50
60

핵심 포인트 정리

  • operator[] 함수는 반드시 멤버 함수로만 선언할 수 있습니다.
  • 반환형을 int&(참조)로 지정하면 a[i] = 값 형태의 대입 연산이 가능해집니다.
  • 인덱스가 유효 범위(0 ~ size-1)를 벗어나면 에러 메시지를 출력하고 프로그램을 종료하여 안전성을 확보합니다.
  • 일반 배열과 달리 범위 검사가 내장되어 있어 디버깅과 유지보수에 유리합니다.