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

C++ 더하기 연산자 오버로딩으로 두 행렬의 합 구하기

C++에서는 연산자 오버로딩(operator overloading)을 활용하면 사용자 정의 클래스 객체에도 기본 연산자를 직관적으로 적용할 수 있습니다. 이번 글에서는 두 개의 행렬 mat1mat2를 더하여 세 번째 행렬을 만드는 프로그램을, 더하기(+) 연산자를 오버로드하는 방식으로 구현해 보겠습니다.

예를 들어 아래와 같은 두 행렬이 입력으로 주어진다면,

58
96
79

83
47
63

같은 위치에 있는 원소끼리 더한 다음 행렬이 출력됩니다.

1311
1313
1312

문제 해결 접근 방법

  • 더하기(+) 연산자를 오버로드합니다. 이 연산자 함수는 두 번째 행렬 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 연산을 수행하고 그 결과를 출력합니다. 이처럼 연산자 오버로딩을 활용하면 복잡한 행렬 덧셈 로직도 일반 산술 연산처럼 간결하고 읽기 쉽게 표현할 수 있습니다.