C++에서는 연산자 오버로딩(operator overloading)을 활용하면 사용자 정의 클래스 객체에도 기본 연산자를 직관적으로 적용할 수 있습니다. 이번 글에서는 두 개의 행렬 mat1과 mat2를 더하여 세 번째 행렬을 만드는 프로그램을, 더하기(+) 연산자를 오버로드하는 방식으로 구현해 보겠습니다.
예를 들어 아래와 같은 두 행렬이 입력으로 주어진다면,
| 5 | 8 |
| 9 | 6 |
| 7 | 9 |
| 8 | 3 |
| 4 | 7 |
| 6 | 3 |
같은 위치에 있는 원소끼리 더한 다음 행렬이 출력됩니다.
| 13 | 11 |
| 13 | 13 |
| 13 | 12 |
문제 해결 접근 방법
더하기(+) 연산자를 오버로드합니다. 이 연산자 함수는 두 번째 행렬
mat를 상수 참조(const reference) 형태로 인자로 받습니다.현재 행렬의 원소들을 복사한 2차원 벡터
vv를 생성합니다.이중 반복문을 사용하여
vv의 모든 원소를 순회하며 다음 연산을 수행합니다.vv[i][j] = vv[i][j] + mat.a[i][j]— 두 행렬의 대응하는 원소끼리 더합니다.
결과 벡터
vv를 이용해 새로운 Matrix 객체를 만들어 반환합니다.
아래 예제 코드를 통해 더 자세히 살펴보겠습니다.
예제 코드
#include <iostream>
#include <vector>
using namespace std;
class Matrix {
public:
Matrix() {}
Matrix(const Matrix& x) : a(x.a) {}
Matrix(const vector<vector<int>>& v) : a(v) {}
Matrix operator+(const Matrix&);
vector<vector<int>> a;
void display(){
for(int i = 0; i<a.size(); i++){
for(int j = 0; j<a[i].size(); j++){
cout << a[i][j] << " ";
}
cout << endl;
}
}
};
Matrix Matrix::operator+(const Matrix& m){
vector<vector<int>> vv = a;
for (int i=0; i<vv.size(); i++){
for (int j=0; j<vv[0].size(); j++){
vv[i][j] += m.a[i][j];
}
}
return Matrix(vv);
}
int main(){
vector<vector<int>> mat1 = {{5,8},{9,6},{7,9}};
vector<vector<int>> mat2 = {{8,3},{4,7},{6,3}};
int r = mat1.size();
int c = mat1[0].size();
Matrix m1(mat1), m2(mat2), res;
res = m1 + m2;
res.display();
}입력
{{5,8},{9,6},{7,9}}, {{8,3},{4,7},{6,3}}출력
13 11 13 13 13 12
코드를 보면 Matrix 클래스 안에 operator+ 멤버 함수를 정의하여, 현재 행렬의 원소를 복사한 뒤 인자로 전달된 행렬의 대응하는 원소들을 차례로 더하고, 그 결과로 새로운 행렬 객체를 반환합니다. main() 함수에서는 두 행렬을 초기화한 후 m1 + m2 연산을 수행하고 그 결과를 출력합니다. 이처럼 연산자 오버로딩을 활용하면 복잡한 행렬 덧셈 로직도 일반 산술 연산처럼 간결하고 읽기 쉽게 표현할 수 있습니다.