연산자 오버로딩(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)를 벗어나면 에러 메시지를 출력하고 프로그램을 종료하여 안전성을 확보합니다.
- 일반 배열과 달리 범위 검사가 내장되어 있어 디버깅과 유지보수에 유리합니다.